做推送,怎么能不了解推送的 4 種消息形式呢?(iOS 篇)

極光推送是為 App 提供第三方推送服務的平臺之一,它提供四種消息形式:通知,自定義消息,富媒體和本地通知。
筆者將基于官方說明與個人理解來談一下這四種消息。本篇為 iOS 篇,Android 篇入口

1.通知

Push Notification,即指在手機的通知欄(狀態欄)上會顯示的一條通知信息。
** iOS :JPush 代理 Apple 官方的 APNs 通知。**

特別說明

  • 使用 JPush 中的通知,相當于使用蘋果官方的通知推送。
  • iOS 10 新增了 delegate 協議方法,極光新版 SDK 封裝了這兩個方法來適配,有開發者想同時使用 JPush 的通知和蘋果的通知來實現他們不同的需求,然后會發現,在 iOS 10 客戶端只會走其中的一個方法,互相有沖突。
  • 這里需要說明的是:
    極光就是封裝的蘋果的 APNs ,如果我們自己再封裝 APNs ,兩個地方封裝的是相同東西的時候,肯定只有一個地方有效了。
    如果你想同時使用 Apple 官方的推送和極光的推送,在客戶端只需要用極光代理的方法即可,來自 Apple 官方的推送,極光的代理方法也是可以正常處理的。
APNs 通知的流程是這樣的

  1. 我們可以調用極光的 API 發起推送請求,也可以通過極光官網控制臺推送。
  2. 請求在參數要求上基本正確——請求成功,返回 msgid (這條消息的 ID 標識),返回 200(成功)或由極光判斷的推送失敗(一般是 1011 找不到目標的錯誤);參數錯誤,有返回錯誤碼。
  3. 極光處理該條請求,將這條請求發給蘋果 APNs 服務器,一般都是秒內處理(非 VIP 通道偶爾可能會發生堵塞)。
  4. APNs 服務器將這條消息推送到 iOS 設備上,這期間,可能會產生延遲;可能會因為證書問題、已卸載、token 失效、推送環境與設備環境不一致等情況由 Apple 判斷為錯誤;沒有問題時則會被設備收到,由 iOS 系統控制進行展示。

注:我們測試時若收不到消息,極光社區有總結一個完整的排查步驟,基本可以解決問題;如果自己排查不出,可以直接找官方幫忙查詢,這里設備的 registrationID 和消息的 msgid 就是必須提供的信息。

APNs 通知的幾個特點

  1. 通知欄的展示完全由 iOS 系統控制,左側圖片是自動獲取的 App 圖標,是不可動態改變的。
  2. iOS 10 以下系統:
    • APNs 通知是 只能在 App 處于后臺或殺死時才能展示的。
  3. iOS 10 系統:
    • 可以實現在前臺展示 APNs 通知,實現willPresentNotification方法,前臺收到 APNs 通知后就會走這個方法。
    • 在前臺點擊通知消息后也走didReceiveNotificationResponse方法(即后臺收到通知后,點擊通知的回調方法)。
  4. 獲取通知內容
    • 推送一般的 APNs 通知,客戶端在 點擊了通知欄消息之后才會調用對應的方法去獲取到消息的內容, 點擊圖標進入 App 是無法獲取到消息的
    • 如果需要在不點擊通知欄的情況下,可以獲取到消息內容,可以推送 Background Remote Notification,這類消息的規則是:
      • 客戶端需要處于Background 或 Suspended 狀態,被殺死后無法調起該方法。
      • 該類消息被收到后,Background 方法就會被調用,獲得信息內容。
      • 點擊了展示該消息的通知欄,會再次調用 Background 方法。
      • 點擊了圖標 這個操作并不會 再次調用 Background 方法。
  5. 手機斷網后,根據 Apple 的邏輯,是 只保存 1 條離線消息
    • 此處判斷手機斷網,是指手機無法與 Apple 服務器進行連接。
    • 可能情況有:網絡斷開、網絡環境有限制(內網)、某網絡運營商連接不通暢。
    • 測試時可嘗試切換網絡。
  6. 與證書和環境有關:
    • 推送的環境 必須與 App 的打包環境 一致
    • 蘋果官網的證書、極光官網上傳的證書、 App 打包的證書 必須完全一致
  7. JPush 無法控制 APNs 通知的展示與否,不過如果你想實現關閉 APNs 通知,有如下方法:
    • 一般是給一個文字說明:請在手機[設置]-[通知]-[XX App]選擇打開或關閉通知;
    • 也可以調用反注冊代碼[[UIApplication sharedApplication] unregisterForRemoteNotifications];進行關閉。
      但有一個影響是:iOS9 設備使用代碼反注冊 APNs ,再調用代碼注冊 APNs ,需要殺死應用后,再重新開啟應用才會有 APNs 提示(這里可能與系統本身 bug 有關)。
    • 也可以用極光的置空別名/標簽的方法去達到關閉通知的效果,相應的,置空期間的消息將不會收到。具體參見 Android 篇
  8. 推送時,如果通知內容( alert )為空,那么收到推送時是默認不展示橫幅的。
    • iOS 10 的 alert 里面包括了 body 、title 、subtitle,后兩者是可選的, body 為空則不展示。兩種方式:
      • "alert" : "hello, JPush!",或者
"alert" : {
                     "title" : "JPush Title",
                     "subtitle" : "JPush Subtitle" ,
                     "body" : "JPush Body"
                 }, 
  • 這里要注意的是 ** iOS 10 前臺展示的代碼方法 **里面也有三種展示(alert、badge、sound)的選擇,如果沒有寫 alert ,那么也是不會有橫幅提醒的。
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);

2.自定義消息

由 JPush iOS SDK 提供的應用內消息功能,此消息不經過 APNs 服務器,完全由 JPush 提供功能支持。

幾個特點

  1. 只接收,不展示,需要我們自己做接收處理,并且自己代碼實現 消息的展示,或者轉為本地通知來展示。
  • 怎么讓 App 收到自定義消息后,也顯示橫幅彈框,并顯示在蘋果手機的通知列表里呢?
    • 自己寫的通知欄只能在 App 內部進行展示,只有 APNs 通知才可以展示在通知列表中。
    • 間接實現的方法:
      * 同時發內容一樣的自定義消息和 APNs 通知消息(APNs 用來展示,自定義消息用來取數據)
      * 自定義消息中攜帶定義好的 extras ,客戶端收到后根據事先設定的規則去設置一個本地通知,用本地通知來展示這條消息
  1. 需要依靠 App 與極光服務器建立的長連接,所以 iOS 必須當 App 處于前臺時才能接收到。
  2. iOS 需要在 delegate 類中注冊通知并實現回調方法 networkDidReceiveMessage詳細看官方文檔說明
  3. 對 iOS 推送自定義消息無需考慮環境和證書問題。
    • 如果我只需要用極光的自定義消息,還需要配置證書嗎?畢竟制作證書需要付費參加 Apple 的開發者計劃。
    • 首先了解極光這邊的 2 個要求:
      1.極光要集成成功,要獲得 registrationID ,需要 device token 。
      2.極光控制臺,必須要上傳證書,推送時 iOS 才可以被點擊。
    • 兩個辦法:
      1.iOS 端,我們可以自己隨便的拼接一個合乎規范的 token 并給 JPush ,以注冊成功,獲得registrationID。要推送消息,則采取調用 API 推送的方式進行。
      2.找朋友用付費賬號生成一個生產環境證書,按照配置要求集成成功,在控制臺上傳好證書。那么在極光控制臺或自行調用 API 都可以推送。
    • iOS 在手機端關閉通知和調用反注冊代碼對自定義消息的接收有影響嗎?
      • 有必要勾選 background modes >remote Notification的選項,通知設置會增加 后臺應用刷新按鈕,這是 iOS 不點擊通知欄依舊可以獲取消息的必要選項,也是建立長連接的基礎。
      • 沒有影響。
      • 自定義消息是應用內消息,跟apns無關
      • 只要 Jpush 這邊注冊 ok了,獲取到了registrationID,長鏈接建立起來,就可以收到。
什么時候使用它?

  1. 推送保證不會丟失的消息。
  • APNs 一般只做為通知提醒,譬如 IM,退到后臺,收到消息提醒,點擊進去后還是走應用內消息收取,確保不丟。(在極光這邊也有提供 JMessage 即時通訊
  • JPush 的應用內消息,會免費保留 5 條離線消息
  1. iOS 需要在前臺展示消息時(iOS 10 新增接口之前)。
  2. 在 App 項目內的消息提醒。
  3. 有條件的消息提醒(譬如只讓處在某一頁面的用戶看到該條消息)。

3.富媒體

可以推送 Web頁面、圖片、聲音等除普通文本之外更豐富的內容。

  1. 僅支持 Android ,需要JPush Android SDK 1.8.0 及以上。

4.本地通知

適用于在特定時間發出的通知,如一些 Todo 和鬧鐘類的應用,在每周、每月固定時間提醒用戶回到應用查看任務。

  1. 不依賴于網絡,無網也可以觸發。
  2. 定時時間是自發送時算起,不受中間關機等操作的影響。
  3. iOS 中也和 遠程 APNs 通知一樣,在不同的狀態,不同的系統下,對應有幾種獲取消息的方法,App 被殺死也是可觸發的。
  4. 本地通知里面的 body 不寫也是沒有橫幅展示的,官方示例里面的這一句 content.body = @"This is a test code";

題外話

  • 使用第三方服務時,應該養成 多看日志,多關注實際請求數據,多看回調和 error 的習慣。
  • 要求官方配合查詢或者咨詢問題時,提供詳實的信息,可以大大節約彼此的時間。
  • iOS 10 的推送有一些新變化,可以閱讀玩轉 iOS 10 推送 —— UserNotifications Framework(合集)這篇文章來系統的了解一番。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容