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

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


此篇來自網(wǎng)站轉(zhuǎn)載。 ??作者 ? 末日云游-極光??極光推送。在此記錄方便以后查找

極光推送是為 App 提供第三方推送服務(wù)的平臺(tái)之一,它提供四種消息形式:通知,自定義消息,富媒體和本地通知。

筆者將基于官方說明與個(gè)人理解來談一下這四種消息。本篇為 iOS 篇,Android 篇入口

1.通知

Push Notification,即指在手機(jī)的通知欄(狀態(tài)欄)上會(huì)顯示的一條通知信息。

iOS :JPush 代理 Apple 官方的 APNs 通知。

特別說明

使用 JPush 中的通知,相當(dāng)于使用蘋果官方的通知推送。

iOS 10 新增了 delegate 協(xié)議方法,極光新版 SDK 封裝了這兩個(gè)方法來適配,有開發(fā)者想同時(shí)使用 JPush 的通知和蘋果的通知來實(shí)現(xiàn)他們不同的需求,然后會(huì)發(fā)現(xiàn),在 iOS 10 客戶端只會(huì)走其中的一個(gè)方法,互相有沖突。

這里需要說明的是:

極光就是封裝的蘋果的 APNs ,如果我們自己再封裝 APNs ,兩個(gè)地方封裝的是相同東西的時(shí)候,肯定只有一個(gè)地方有效了。

如果你想同時(shí)使用 Apple 官方的推送和極光的推送,在客戶端只需要用極光代理的方法即可,來自 Apple 官方的推送,極光的代理方法也是可以正常處理的。

APNs 通知的流程是這樣的

我們可以調(diào)用極光的 API 發(fā)起推送請求,也可以通過極光官網(wǎng)控制臺(tái)推送。

請求在參數(shù)要求上基本正確——請求成功,返回 msgid (這條消息的 ID 標(biāo)識(shí)),返回 200(成功)或由極光判斷的推送失?。ㄒ话闶?a target="_blank" rel="nofollow">1011 找不到目標(biāo)的錯(cuò)誤);參數(shù)錯(cuò)誤,有返回錯(cuò)誤碼。

極光處理該條請求,將這條請求發(fā)給蘋果 APNs 服務(wù)器,一般都是秒內(nèi)處理(非 VIP 通道偶爾可能會(huì)發(fā)生堵塞)。

APNs 服務(wù)器將這條消息推送到 iOS 設(shè)備上,這期間,可能會(huì)產(chǎn)生延遲;可能會(huì)因?yàn)樽C書問題、已卸載、token 失效、推送環(huán)境與設(shè)備環(huán)境不一致等情況由 Apple 判斷為錯(cuò)誤;沒有問題時(shí)則會(huì)被設(shè)備收到,由 iOS 系統(tǒng)控制進(jìn)行展示。

注:我們測試時(shí)若收不到消息,極光社區(qū)有總結(jié)一個(gè)完整的排查步驟,基本可以解決問題;如果自己排查不出,可以直接找官方幫忙查詢,這里設(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)方法)。

獲取通知內(nèi)容

推送一般的 APNs 通知,客戶端在點(diǎn)擊了通知欄消息之后才會(huì)調(diào)用對應(yīng)的方法去獲取到消息的內(nèi)容,點(diǎn)擊圖標(biāo)進(jìn)入 App 是無法獲取到消息的

如果需要在不點(diǎn)擊通知欄的情況下,可以獲取到消息內(nèi)容,可以推送Background Remote Notification,這類消息的規(guī)則是:

客戶端需要處于Background 或 Suspended 狀態(tài),被殺死后無法調(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ī)無法與 Apple 服務(wù)器進(jìn)行連接。

可能情況有:網(wǎng)絡(luò)斷開、網(wǎng)絡(luò)環(huán)境有限制(內(nèi)網(wǎng))、某網(wǎng)絡(luò)運(yùn)營商連接不通暢。

測試時(shí)可嘗試切換網(wǎng)絡(luò)。

與證書和環(huán)境有關(guān):

推送的環(huán)境必須與 App 的打包環(huán)境一致。

蘋果官網(wǎng)的證書、極光官網(wǎng)上傳的證書、 App 打包的證書必須完全一致

JPush 無法控制 APNs 通知的展示與否,不過如果你想實(shí)現(xiàn)關(guān)閉 APNs 通知,有如下方法:

一般是給一個(gè)文字說明:請?jiān)谑謾C(jī)[設(shè)置]-[通知]-[XX App]選擇打開或關(guān)閉通知;

也可以調(diào)用反注冊代碼[[UIApplication sharedApplication] unregisterForRemoteNotifications];進(jìn)行關(guān)閉。

但有一個(gè)影響是:iOS9 設(shè)備使用代碼反注冊 APNs ,再調(diào)用代碼注冊 APNs ,需要?dú)⑺缿?yīng)用后,再重新開啟應(yīng)用才會(huì)有 APNs 提示(這里可能與系統(tǒng)本身 bug 有關(guān))。

也可以用極光的置空別名/標(biāo)簽的方法去達(dá)到關(guān)閉通知的效果,相應(yīng)的,置空期間的消息將不會(huì)收到。

推送時(shí),如果通知內(nèi)容( alert )為空,那么收到推送時(shí)是默認(rèn)不展示橫幅的。

iOS 10 的 alert 里面包括了 body 、title 、subtitle,后兩者是可選的, body 為空則不展示。兩種方式:

"alert" : "hello, JPush!",或者

"alert" : {"title" :"JPush Title","subtitle" :"JPush Subtitle" ,"body" :"JPush Body"

},

這里要注意的是iOS 10 前臺(tái)展示的代碼方法里面也有三種展示(alert、badge、sound)的選擇,如果沒有寫 alert ,那么也是不會(huì)有橫幅提醒的。

completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);

2.自定義消息

由 JPush iOS SDK 提供的應(yīng)用內(nèi)消息功能,此消息不經(jīng)過 APNs 服務(wù)器,完全由 JPush 提供功能支持。

幾個(gè)特點(diǎn)

只接收,不展示,需要我們自己做接收處理,并且自己代碼實(shí)現(xiàn) 消息的展示。

怎么讓 App 收到自定義消息后,也顯示橫幅彈框,并顯示在蘋果手機(jī)的通知列表里呢?

自己寫的通知欄只能在 App 內(nèi)部進(jìn)行展示,只有 APNs 通知才可以展示在通知列表中。

間接實(shí)現(xiàn)的方法:

* 同時(shí)發(fā)內(nèi)容一樣的自定義消息和 APNs 通知消息(APNs 用來展示,自定義消息用來取數(shù)據(jù))

* 自定義消息中攜帶定義好的 extras ,客戶端收到后根據(jù)事先設(shè)定的規(guī)則去設(shè)置一個(gè)本地通知,用本地通知來展示這條消息

自定義消息內(nèi)容msg_content為空時(shí),SDK 不會(huì)對消息進(jìn)行廣播,App 無法接收到推送的消息。

需要依靠 App 與極光服務(wù)器建立的長連接,所以iOS 必須當(dāng) App 處于前臺(tái)時(shí)才能接收到。

iOS 需要在 delegate 類中注冊通知并實(shí)現(xiàn)回調(diào)方法networkDidReceiveMessage,詳細(xì)看官方文檔說明。

對 iOS 推送自定義消息無需考慮環(huán)境和證書問題。

如果我只需要用極光的自定義消息,還需要配置證書嗎?畢竟制作證書需要付費(fèi)參加 Apple 的開發(fā)者計(jì)劃。

首先了解極光這邊的 2 個(gè)要求:

1.極光要集成成功,要獲得 registrationID ,需要 device token 。

2.極光控制臺(tái),必須要上傳證書,推送時(shí) iOS 才可以被點(diǎn)擊。

兩個(gè)辦法:

1.iOS 端,我們可以自己隨便的拼接一個(gè)合乎規(guī)范的 token 并給 JPush ,以注冊成功,獲得registrationID。要推送消息,則采取調(diào)用 API 推送的方式進(jìn)行。

2.找朋友用付費(fèi)賬號(hào)生成一個(gè)生產(chǎn)環(huán)境證書,按照配置要求集成成功,在控制臺(tái)上傳好證書。那么在極光控制臺(tái)或自行調(diào)用 API 都可以推送。

iOS 在手機(jī)端關(guān)閉通知和調(diào)用反注冊代碼對自定義消息的接收有影響嗎?

沒有影響。

自定義消息是應(yīng)用內(nèi)消息,跟apns無關(guān)

只要 Jpush 這邊注冊 ok了,獲取到了registrationID,長鏈接建立起來,就可以收到。

什么時(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)目內(nèi)的消息提醒。

有條件的消息提醒(譬如只讓處在某一頁面的用戶看到該條消息)。

3.富媒體

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

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

4.本地通知

適用于在特定時(shí)間發(fā)出的通知,如一些Todo和鬧鐘類的應(yīng)用,在每周、每月固定時(shí)間提醒用戶回到應(yīng)用查看任務(wù)。

不依賴于網(wǎng)絡(luò),無網(wǎng)也可以觸發(fā)。

定時(shí)時(shí)間是自發(fā)送時(shí)算起,不受中間關(guān)機(jī)等操作的影響。

iOS中也和 遠(yuǎn)程 APNs 通知一樣,在不同的狀態(tài),不同的系統(tǒng)下,對應(yīng)有幾種獲取消息的方法,App 被殺死也是可觸發(fā)的。

本地通知里面的 body 不寫也是沒有橫幅展示的,官方示例里面的這一句content.body = @"This is a test code";

推送自定義消息,觸發(fā)本地通知去展示。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容