極光推送是為 App 提供第三方推送服務(wù)的平臺(tái)之一,它提供四種消息形式:通知孤荣,自定義消息甸陌,富媒體和本地通知须揣。
筆者將基于官方說(shuō)明與個(gè)人理解來(lái)談一下這四種消息。本篇為 iOS 篇钱豁,Android 篇入口耻卡。
1.通知
Push Notification,即指在手機(jī)的通知欄(狀態(tài)欄)上會(huì)顯示的一條通知信息牲尺。
** iOS :JPush 代理 Apple 官方的 APNs 通知卵酪。**
特別說(shuō)明
- 使用 JPush 中的通知,相當(dāng)于使用蘋(píng)果官方的通知推送谤碳。
- iOS 10 新增了 delegate 協(xié)議方法溃卡,極光新版 SDK 封裝了這兩個(gè)方法來(lái)適配,有開(kāi)發(fā)者想同時(shí)使用 JPush 的通知和蘋(píng)果的通知來(lái)實(shí)現(xiàn)他們不同的需求蜒简,然后會(huì)發(fā)現(xiàn)瘸羡,在 iOS 10 客戶端只會(huì)走其中的一個(gè)方法,互相有沖突搓茬。
- 這里需要說(shuō)明的是:
極光就是封裝的蘋(píng)果的 APNs 犹赖,如果我們自己再封裝 APNs ,兩個(gè)地方封裝的是相同東西的時(shí)候卷仑,肯定只有一個(gè)地方有效了峻村。
如果你想同時(shí)使用 Apple 官方的推送和極光的推送,在客戶端只需要用極光代理的方法即可锡凝,來(lái)自 Apple 官方的推送雀哨,極光的代理方法也是可以正常處理的。
APNs 通知的流程是這樣的
- 我們可以調(diào)用極光的 API 發(fā)起推送請(qǐng)求私爷,也可以通過(guò)極光官網(wǎng)控制臺(tái)推送雾棺。
- 請(qǐng)求在參數(shù)要求上基本正確——請(qǐng)求成功俭尖,返回 msgid (這條消息的 ID 標(biāo)識(shí))击胜,返回 200(成功)或由極光判斷的推送失敗(一般是 1011 找不到目標(biāo)的錯(cuò)誤)笛臣;參數(shù)錯(cuò)誤工秩,有返回錯(cuò)誤碼尸饺。
- 極光處理該條請(qǐng)求,將這條請(qǐng)求發(fā)給蘋(píng)果 APNs 服務(wù)器助币,一般都是秒內(nèi)處理(非 VIP 通道偶爾可能會(huì)發(fā)生堵塞)浪听。
- APNs 服務(wù)器將這條消息推送到 iOS 設(shè)備上,這期間眉菱,可能會(huì)產(chǎn)生延遲迹栓;可能會(huì)因?yàn)樽C書(shū)問(wèn)題、已卸載俭缓、token 失效克伊、推送環(huán)境與設(shè)備環(huán)境不一致等情況由 Apple 判斷為錯(cuò)誤酥郭;沒(méi)有問(wèn)題時(shí)則會(huì)被設(shè)備收到,由 iOS 系統(tǒng)控制進(jìn)行展示愿吹。
注:我們測(cè)試時(shí)若收不到消息不从,極光社區(qū)有總結(jié)一個(gè)完整的排查步驟,基本可以解決問(wèn)題犁跪;如果自己排查不出椿息,可以直接找官方幫忙查詢,這里設(shè)備的 registrationID 和消息的 msgid 就是必須提供的信息坷衍。
APNs 通知的幾個(gè)特點(diǎn)
- 通知欄的展示完全由 iOS 系統(tǒng)控制寝优,左側(cè)圖片是自動(dòng)獲取的 App 圖標(biāo),是不可動(dòng)態(tài)改變的惫叛。
- iOS 10 以下系統(tǒng):
- APNs 通知是 只能在 App 處于后臺(tái)或殺死時(shí)才能展示的倡勇。
- iOS 10 系統(tǒng):
- 可以實(shí)現(xiàn)在前臺(tái)展示 APNs 通知,實(shí)現(xiàn)
willPresentNotification
方法嘉涌,前臺(tái)收到 APNs 通知后就會(huì)走這個(gè)方法妻熊。 - 在前臺(tái)點(diǎn)擊通知消息后也走
didReceiveNotificationResponse
方法(即后臺(tái)收到通知后,點(diǎn)擊通知的回調(diào)方法)仑最。
- 可以實(shí)現(xiàn)在前臺(tái)展示 APNs 通知,實(shí)現(xiàn)
-
獲取通知內(nèi)容
- 推送一般的 APNs 通知扔役,客戶端在 點(diǎn)擊了通知欄消息之后才會(huì)調(diào)用對(duì)應(yīng)的方法去獲取到消息的內(nèi)容, 點(diǎn)擊圖標(biāo)進(jìn)入 App 是無(wú)法獲取到消息的警医。
- 如果需要在不點(diǎn)擊通知欄的情況下亿胸,可以獲取到消息內(nèi)容,可以推送 Background Remote Notification预皇,這類消息的規(guī)則是:
- 客戶端需要處于Background 或 Suspended 狀態(tài)侈玄,被殺死后無(wú)法調(diào)起該方法。
- 該類消息被收到后吟温,Background 方法就會(huì)被調(diào)用序仙,獲得信息內(nèi)容。
- 點(diǎn)擊了展示該消息的通知欄鲁豪,會(huì)再次調(diào)用 Background 方法潘悼。
- 點(diǎn)擊了圖標(biāo) 這個(gè)操作并不會(huì) 再次調(diào)用 Background 方法。
- 手機(jī)斷網(wǎng)后爬橡,根據(jù) Apple 的邏輯治唤,是 只保存 1 條離線消息
- 此處判斷手機(jī)斷網(wǎng),是指手機(jī)無(wú)法與 Apple 服務(wù)器進(jìn)行連接糙申。
- 可能情況有:網(wǎng)絡(luò)斷開(kāi)宾添、網(wǎng)絡(luò)環(huán)境有限制(內(nèi)網(wǎng))、某網(wǎng)絡(luò)運(yùn)營(yíng)商連接不通暢。
- 測(cè)試時(shí)可嘗試切換網(wǎng)絡(luò)辞槐。
- 與證書(shū)和環(huán)境有關(guān):
- 推送的環(huán)境 必須與 App 的打包環(huán)境 一致掷漱。
- 蘋(píng)果官網(wǎng)的證書(shū)粘室、極光官網(wǎng)上傳的證書(shū)榄檬、 App 打包的證書(shū) 必須完全一致。
- JPush 無(wú)法控制 APNs 通知的展示與否衔统,不過(guò)如果你想實(shí)現(xiàn)關(guān)閉 APNs 通知鹿榜,有如下方法:
- 一般是給一個(gè)文字說(shuō)明:請(qǐng)?jiān)谑謾C(jī)[設(shè)置]-[通知]-[XX App]選擇打開(kāi)或關(guān)閉通知;
- 也可以調(diào)用反注冊(cè)代碼
[[UIApplication sharedApplication] unregisterForRemoteNotifications]锦爵;
進(jìn)行關(guān)閉舱殿。
但有一個(gè)影響是:iOS9 設(shè)備使用代碼反注冊(cè) APNs ,再調(diào)用代碼注冊(cè) APNs 险掀,需要?dú)⑺缿?yīng)用后沪袭,再重新開(kāi)啟應(yīng)用才會(huì)有 APNs 提示(這里可能與系統(tǒng)本身 bug 有關(guān))。 - 也可以用極光的置空別名/標(biāo)簽的方法去達(dá)到關(guān)閉通知的效果樟氢,相應(yīng)的冈绊,置空期間的消息將不會(huì)收到。具體參見(jiàn) Android 篇
- 推送時(shí)埠啃,如果通知內(nèi)容( alert )為空死宣,那么收到推送時(shí)是默認(rèn)不展示橫幅的。
- iOS 10 的 alert 里面包括了 body 碴开、title 毅该、subtitle,后兩者是可選的潦牛, body 為空則不展示眶掌。兩種方式:
-
"alert" : "hello, JPush!",
或者
-
- iOS 10 的 alert 里面包括了 body 碴开、title 毅该、subtitle,后兩者是可選的潦牛, body 為空則不展示眶掌。兩種方式:
"alert" : {
"title" : "JPush Title",
"subtitle" : "JPush Subtitle" ,
"body" : "JPush Body"
},
- 這里要注意的是 ** iOS 10 前臺(tái)展示的代碼方法 **里面也有三種展示(alert、badge巴碗、sound)的選擇朴爬,如果沒(méi)有寫(xiě) alert ,那么也是不會(huì)有橫幅提醒的良价。
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
2.自定義消息
由 JPush iOS SDK 提供的應(yīng)用內(nèi)消息功能寝殴,此消息不經(jīng)過(guò) APNs 服務(wù)器,完全由 JPush 提供功能支持明垢。
幾個(gè)特點(diǎn)
- 只接收蚣常,不展示,需要我們自己做接收處理痊银,并且自己代碼實(shí)現(xiàn) 消息的展示抵蚊,或者轉(zhuǎn)為本地通知來(lái)展示。
- 怎么讓 App 收到自定義消息后,也顯示橫幅彈框贞绳,并顯示在蘋(píng)果手機(jī)的通知列表里呢谷醉?
- 自己寫(xiě)的通知欄只能在 App 內(nèi)部進(jìn)行展示,只有 APNs 通知才可以展示在通知列表中冈闭。
- 間接實(shí)現(xiàn)的方法:
* 同時(shí)發(fā)內(nèi)容一樣的自定義消息和 APNs 通知消息(APNs 用來(lái)展示俱尼,自定義消息用來(lái)取數(shù)據(jù))
* 自定義消息中攜帶定義好的 extras ,客戶端收到后根據(jù)事先設(shè)定的規(guī)則去設(shè)置一個(gè)本地通知萎攒,用本地通知來(lái)展示這條消息
- 需要依靠 App 與極光服務(wù)器建立的長(zhǎng)連接遇八,所以 iOS 必須當(dāng) App 處于前臺(tái)時(shí)才能接收到。
- iOS 需要在 delegate 類中注冊(cè)通知并實(shí)現(xiàn)回調(diào)方法
networkDidReceiveMessage
耍休,詳細(xì)看官方文檔說(shuō)明刃永。 - 對(duì) iOS 推送自定義消息無(wú)需考慮環(huán)境和證書(shū)問(wèn)題。
- 如果我只需要用極光的自定義消息羊精,還需要配置證書(shū)嗎斯够?畢竟制作證書(shū)需要付費(fèi)參加 Apple 的開(kāi)發(fā)者計(jì)劃。
- 首先了解極光這邊的 2 個(gè)要求:
1.極光要集成成功喧锦,要獲得 registrationID 读规,需要 device token 。
2.極光控制臺(tái)裸违,必須要上傳證書(shū)掖桦,推送時(shí) iOS 才可以被點(diǎn)擊。 - 兩個(gè)辦法:
1.iOS 端供汛,我們可以自己隨便的拼接一個(gè)合乎規(guī)范的 token 并給 JPush 枪汪,以注冊(cè)成功,獲得registrationID怔昨。要推送消息雀久,則采取調(diào)用 API 推送的方式進(jìn)行。
2.找朋友用付費(fèi)賬號(hào)生成一個(gè)生產(chǎn)環(huán)境證書(shū)趁舀,按照配置要求集成成功赖捌,在控制臺(tái)上傳好證書(shū)。那么在極光控制臺(tái)或自行調(diào)用 API 都可以推送矮烹。 - iOS 在手機(jī)端關(guān)閉通知和調(diào)用反注冊(cè)代碼對(duì)自定義消息的接收有影響嗎越庇?
- 有必要勾選 background modes >remote Notification的選項(xiàng),通知設(shè)置會(huì)增加 后臺(tái)應(yīng)用刷新按鈕奉狈,這是 iOS 不點(diǎn)擊通知欄依舊可以獲取消息的必要選項(xiàng)卤唉,也是建立長(zhǎng)連接的基礎(chǔ)。
- 沒(méi)有影響仁期。
- 自定義消息是應(yīng)用內(nèi)消息桑驱,跟apns無(wú)關(guān)
- 只要 Jpush 這邊注冊(cè) ok了竭恬,獲取到了registrationID,長(zhǎng)鏈接建立起來(lái)熬的,就可以收到痊硕。
什么時(shí)候使用它?
- 推送保證不會(huì)丟失的消息押框。
- APNs 一般只做為通知提醒岔绸,譬如 IM,退到后臺(tái)强戴,收到消息提醒亭螟,點(diǎn)擊進(jìn)去后還是走應(yīng)用內(nèi)消息收取挡鞍,確保不丟骑歹。(在極光這邊也有提供 JMessage 即時(shí)通訊)
- JPush 的應(yīng)用內(nèi)消息,會(huì)免費(fèi)保留 5 條離線消息
- iOS 需要在前臺(tái)展示消息時(shí)(iOS 10 新增接口之前)墨微。
- 在 App 項(xiàng)目?jī)?nèi)的消息提醒道媚。
- 有條件的消息提醒(譬如只讓處在某一頁(yè)面的用戶看到該條消息)。
3.富媒體
可以推送 Web頁(yè)面翘县、圖片最域、聲音等除普通文本之外更豐富的內(nèi)容。
- 僅支持 Android 锈麸,需要JPush Android SDK 1.8.0 及以上镀脂。
4.本地通知
適用于在特定時(shí)間發(fā)出的通知,如一些 Todo 和鬧鐘類的應(yīng)用忘伞,在每周薄翅、每月固定時(shí)間提醒用戶回到應(yīng)用查看任務(wù)。
- 不依賴于網(wǎng)絡(luò)氓奈,無(wú)網(wǎng)也可以觸發(fā)翘魄。
- 定時(shí)時(shí)間是自發(fā)送時(shí)算起,不受中間關(guān)機(jī)等操作的影響舀奶。
- iOS 中也和 遠(yuǎn)程 APNs 通知一樣暑竟,在不同的狀態(tài),不同的系統(tǒng)下育勺,對(duì)應(yīng)有幾種獲取消息的方法但荤,App 被殺死也是可觸發(fā)的。
- 本地通知里面的 body 不寫(xiě)也是沒(méi)有橫幅展示的涧至,官方示例里面的這一句
content.body = @"This is a test code";
題外話
- 使用第三方服務(wù)時(shí)腹躁,應(yīng)該養(yǎng)成 多看日志,多關(guān)注實(shí)際請(qǐng)求數(shù)據(jù)化借,多看回調(diào)和 error 的習(xí)慣潜慎。
- 要求官方配合查詢或者咨詢問(wèn)題時(shí),提供詳實(shí)的信息,可以大大節(jié)約彼此的時(shí)間铐炫。
- iOS 10 的推送有一些新變化垒手,可以閱讀玩轉(zhuǎn) iOS 10 推送 —— UserNotifications Framework(合集)這篇文章來(lái)系統(tǒng)的了解一番。