極光推送是爲 App 提供第三方推送服務的平臺之一,它提供四種消息形式:通知,自定義消息,富媒體和本地通知。
筆者將基於官方說明與我的理解來談一下這四種消息。本篇爲 iOS 篇,Android 篇入口。ios
1.通知
Push Notification,即指在手機的通知欄(狀態欄)上會顯示的一條通知信息。
iOS :JPush 代理 Apple 官方的 APNs 通知。api
特別說明服務器
- 使用 JPush 中的通知,至關於使用蘋果官方的通知推送。
- iOS 10 新增了 delegate 協議方法,極光新版 SDK 封裝了這兩個方法來適配,有開發者想同時使用 JPush 的通知和蘋果的通知來實現他們不一樣的需求,而後會發現,在 iOS 10 客戶端只會走其中的一個方法,互相有衝突。
- 這裏須要說明的是:
極光就是封裝的蘋果的 APNs ,若是咱們本身再封裝 APNs ,兩個地方封裝的是相同東西的時候,確定只有一個地方有效了。
若是你想同時使用 Apple 官方的推送和極光的推送,在客戶端只須要用極光代理的方法便可,來自 Apple 官方的推送,極光的代理方法也是能夠正常處理的。
APNs 通知的流程是這樣的網絡
- 咱們能夠調用極光的 API 發起推送請求,也能夠經過極光官網控制檯推送。
- 請求在參數要求上基本正確——請求成功,返回 msgid (這條消息的 ID 標識),返回 200(成功)或由極光判斷的推送失敗(通常是 1011 找不到目標的錯誤);參數錯誤,有返回錯誤碼。
- 極光處理該條請求,將這條請求發給蘋果 APNs 服務器,通常都是秒內處理(非 VIP 通道偶爾可能會發生堵塞)。
- APNs 服務器將這條消息推送到 iOS 設備上,這期間,可能會產生延遲;可能會由於證書問題、已卸載、token 失效、推送環境與設備環境不一致等狀況由 Apple 判斷爲錯誤;沒有問題時則會被設備收到,由 iOS 系統控制進行展現。
注:咱們測試時若收不到消息,極光社區有總結一個完整的排查步驟,基本能夠解決問題;若是本身排查不出,能夠直接找官方幫忙查詢,這裏設備的 registrationID 和消息的 msgid 就是必須提供的信息。ide
APNs 通知的幾個特色測試
- 通知欄的展現徹底由 iOS 系統控制,左側圖片是自動獲取的 App 圖標,是不可動態改變的。
- iOS 10 如下系統:
- APNs 通知是 只能在 App 處於後臺或殺死時才能展現的。
- iOS 10 系統:
- 能夠實如今前臺展現 APNs 通知,實現
willPresentNotification
方法,前臺收到 APNs 通知後就會走這個方法。
- 在前臺點擊通知消息後也走
didReceiveNotificationResponse
方法(即後臺收到通知後,點擊通知的回調方法)。
- 獲取通知內容
- 推送通常的 APNs 通知,客戶端在 點擊了通知欄消息以後纔會調用對應的方法去獲取到消息的內容, 點擊圖標進入 App 是沒法獲取到消息的。
- 若是須要在不點擊通知欄的狀況下,能夠獲取到消息內容,能夠推送 Background Remote Notification,這類消息的規則是:
- 客戶端須要處於Background 或 Suspended 狀態,被殺死後沒法調起該方法。
- 該類消息被收到後,Background 方法就會被調用,得到信息內容。
- 點擊了展現該消息的通知欄,會再次調用 Background 方法。
- 點擊了圖標 這個操做並不會 再次調用 Background 方法。
- 手機斷網後,根據 Apple 的邏輯,是 只保存 1 條離線消息
- 此處判斷手機斷網,是指手機沒法與 Apple 服務器進行鏈接。
- 可能狀況有:網絡斷開、網絡環境有限制(內網)、某網絡運營商鏈接不通暢。
- 測試時可嘗試切換網絡。
- 與證書和環境有關:
- 推送的環境 必須與 App 的打包環境 一致。
- 蘋果官網的證書、極光官網上傳的證書、 App 打包的證書 必須徹底一致。
- JPush 沒法控制 APNs 通知的展現與否,不過若是你想實現關閉 APNs 通知,有以下方法:
- 通常是給一個文字說明:請在手機[設置]-[通知]-[XX App]選擇打開或關閉通知;
- 也能夠調用反註冊代碼
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
進行關閉。
但有一個影響是:iOS9 設備使用代碼反註冊 APNs ,再調用代碼註冊 APNs ,須要殺死應用後,再從新開啓應用纔會有 APNs 提示(這裏可能與系統自己 bug 有關)。
- 也能夠用極光的置空別名/標籤的方法去達到關閉通知的效果,相應的,置空期間的消息將不會收到。
- 推送時,若是通知內容( alert )爲空,那麼收到推送時是默認不展現橫幅的。
2.自定義消息
由 JPush iOS SDK 提供的應用內消息功能,此消息不通過 APNs 服務器,徹底由 JPush 提供功能支持。ui
幾個特色lua
- 只接收,不展現,須要咱們本身作接收處理,而且本身代碼實現 消息的展現。
- 怎麼讓 App 收到自定義消息後,也顯示橫幅彈框,並顯示在蘋果手機的通知列表裏呢?
- 自定義消息內容
msg_content
爲空時,SDK 不會對消息進行廣播,App 沒法接收到推送的消息。
- 須要依靠 App 與極光服務器創建的長鏈接,因此 iOS 必須當 App 處於前臺時才能接收到。
- iOS 須要在 delegate 類中註冊通知並實現回調方法
networkDidReceiveMessage
,詳細看官方文檔說明。
- 對 iOS 推送自定義消息無需考慮環境和證書問題。
- 若是我只須要用極光的自定義消息,還須要配置證書嗎?畢竟製做證書須要付費參加 Apple 的開發者計劃。
- 首先了解極光這邊的 2 個要求:
1.極光要集成成功,要得到 registrationID ,須要 device token 。
2.極光控制檯,必需要上傳證書,推送時 iOS 才能夠被點擊。
- 兩個辦法:
1.iOS 端,咱們能夠本身隨便的拼接一個合乎規範的 token 並給 JPush ,以註冊成功,得到registrationID。要推送消息,則採起調用 API 推送的方式進行。
2.找朋友用付費帳號生成一個生產環境證書,按照配置要求集成成功,在控制檯上傳好證書。那麼在極光控制檯或自行調用 API 均可以推送。
- iOS 在手機端關閉通知和調用反註冊代碼對自定義消息的接收有影響嗎?
- 沒有影響。
- 自定義消息是應用內消息,跟apns無關
- 只要 Jpush 這邊註冊 ok了,獲取到了registrationID,長連接創建起來,就能夠收到。
何時使用它?spa
- 推送保證不會丟失的消息。
- APNs 通常只作爲通知提醒,譬如 IM,退到後臺,收到消息提醒,點擊進去後仍是走應用內消息收取,確保不丟。(在極光這邊也有提供 JMessage 即時通信)
- JPush 的應用內消息,會免費保留 5 條離線消息
- iOS 須要在前臺展現消息時(iOS 10 新增接口以前)。
- 在 App 項目內的消息提醒。
- 有條件的消息提醒(譬如只讓處在某一頁面的用戶看到該條消息)。
3.富媒體
能夠推送 Web頁面、圖片、聲音等除普通文本以外更豐富的內容。代理
- 僅支持 Android ,須要JPush Android SDK 1.8.0 及以上。
4.本地通知
適用於在特定時間發出的通知,如一些Todo和鬧鐘類的應用,在每週、每個月固定時間提醒用戶回到應用查看任務。
- 不依賴於網絡,無網也能夠觸發。
- 定時時間是自發送時算起,不受中間關機等操做的影響。
- iOS 中也和 遠程 APNs 通知同樣,在不一樣的狀態,不一樣的系統下,對應有幾種獲取消息的方法,App 被殺死也是可觸發的。
- 本地通知裏面的 body 不寫也是沒有橫幅展現的,官方示例裏面的這一句
content.body = @"This is a test code";
推送自定義消息,觸發本地通知去展現。
題外話
做者:末日雲遊-極光