做推送,怎么能不了解推送的 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 有關)。
    • 也可以用極光的置空別名/標簽的方法去達到關閉通知的效果,相應的,置空期間的消息將不會收到。
  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 ,客戶端收到后根據事先設定的規則去設置一個本地通知,用本地通知來展示這條消息
  2. 自定義消息內容msg_content為空時,SDK 不會對消息進行廣播,App 無法接收到推送的消息。
  3. 需要依靠 App 與極光服務器建立的長連接,所以 iOS 必須當 App 處於前台時才能接收到。
  4. iOS 需要在 delegate 類中注冊通知並實現回調方法 networkDidReceiveMessage詳細看官方文檔說明
  5. 對 iOS 推送自定義消息無需考慮環境和證書問題。
    • 如果我只需要用極光的自定義消息,還需要配置證書嗎?畢竟制作證書需要付費參加 Apple 的開發者計划。
      • 首先了解極光這邊的 2 個要求:
        1.極光要集成成功,要獲得 registrationID ,需要 device token 。
        2.極光控制台,必須要上傳證書,推送時 iOS 才可以被點擊。
      • 兩個辦法:
        1.iOS 端,我們可以自己隨便的拼接一個合乎規范的 token 並給 JPush ,以注冊成功,獲得registrationID。要推送消息,則采取調用 API 推送的方式進行。
        2.找朋友用付費賬號生成一個生產環境證書,按照配置要求集成成功,在控制台上傳好證書。那么在極光控制台或自行調用 API 都可以推送。
    • iOS 在手機端關閉通知和調用反注冊代碼對自定義消息的接收有影響嗎?
      • 沒有影響。
      • 自定義消息是應用內消息,跟apns無關
      • 只要 Jpush 這邊注冊 ok了,獲取到了registrationID,長鏈接建立起來,就可以收到。

什么時候使用它?

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

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(合集)這篇文章來系統的了解一番。

作者:末日雲游-極光


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM