極光推送是為 App 提供第三方推送服務(wù)的平臺(tái)之一,它提供四種消息形式:通知终惑,自定義消息绍在,富媒體和本地通知。
筆者將基于官方說明與個(gè)人理解來談一下這四種消息雹有。本篇為 Android 篇偿渡, iOS 篇入口。
1.通知
Push Notification霸奕,即指在手機(jī)的通知欄(狀態(tài)欄)上會(huì)顯示的一條通知信息溜宽。
Android: 依靠 JPush service ,由 JPush SDK 實(shí)現(xiàn)在手機(jī)通知欄的展示质帅。
Android 通知消息的流程是這樣的:
- 我們可以調(diào)用極光的 API 發(fā)起推送請(qǐng)求适揉,也可以通過極光官網(wǎng)控制臺(tái)推送。
- 請(qǐng)求在參數(shù)要求上基本正確——請(qǐng)求成功煤惩,返回 msgid (這條消息的 ID 標(biāo)識(shí))嫉嘀,返回 200(成功)或由極光判斷的推送失敗(一般是 1011 找不到目標(biāo)的錯(cuò)誤)盟庞;參數(shù)錯(cuò)誤吃沪,有返回錯(cuò)誤碼。
- 極光服務(wù)器處理該請(qǐng)求:
- 若該 App 長(zhǎng)連接正常什猖,極光服務(wù)器就會(huì)把這條消息在線下發(fā)給它票彪。
- 如果長(zhǎng)連接是斷開的,那么就會(huì)免費(fèi)保存 5 條離線消息不狮。
- 如果該 App 在你推送消息時(shí)設(shè)定的離線保存時(shí)間(
time_to_live
) 時(shí)間內(nèi)降铸,重連上了長(zhǎng)連接,該條消息就會(huì)下發(fā)給 App 摇零。 - 如果離線時(shí)間內(nèi)推掸,推送的消息超過5條,最先保存的消息會(huì)被刪掉。
- 如果過了
time_to_live
谅畅,該條消息也會(huì)被刪掉登渣,沒有收到的 App 就不會(huì)再收到了。
- 如果該 App 在你推送消息時(shí)設(shè)定的離線保存時(shí)間(
- 這里涉及到長(zhǎng)連接斷開的問題:
- RTC 會(huì)定時(shí)發(fā)送心跳去觸發(fā)連接毡泻。
- 斷網(wǎng)胜茧,關(guān)機(jī),進(jìn)程不在(被殺死)仇味,主動(dòng)調(diào)用 stoppush 都會(huì)導(dǎo)致斷開呻顽。
- 一些手機(jī)系統(tǒng)的限制會(huì)導(dǎo)致斷網(wǎng)和進(jìn)程不在。
- 解決辦法:添加極光提供的拉起服務(wù)丹墨;文檔提示用戶對(duì) App 進(jìn)行保護(hù)廊遍。
Android 收不到消息的情況,極光社區(qū)也有一個(gè)總結(jié)說明贩挣。
- App 收到了通知喉前,由 JPush SDK 進(jìn)行展示,和 iOS 一樣揽惹,如果通知內(nèi)容( alert )為空被饿,也是默認(rèn)不展示的, 但能獲取到消息中的數(shù)據(jù)搪搏,以作他用狭握。
- 我們可以簡(jiǎn)單的修改這個(gè)通知欄的樣式。
- 在客戶端定制了通知欄樣式后疯溺,需要使用該通知欄時(shí)论颅,在推送的時(shí)候就 記得要寫對(duì)應(yīng)的通知欄編號(hào)。(API 推送時(shí)囱嫩,V2 接口的字段是
n_builder_id
恃疯,V3 接口的字段是builder_id
。V2 功能較少墨闲,且在2015年已不再維護(hù)今妄,建議大家盡快升級(jí) V3 ,可以幫助我們更好的做推送鸳碧。) - 這里容易有問題的是圖標(biāo)顯示不正常盾鳞,解決方案:
- 若沒有
res/drawable-xxxx/jpush_notification_icon
這個(gè)資源,那么通知欄默認(rèn)使用應(yīng)用圖標(biāo)作為通知 icon 瞻离。 - 在 5.0 以上系統(tǒng)將應(yīng)用圖標(biāo)作為
statusbar icon
可能顯示不正常腾仅,我們可以定義 沒有陰影和漸變色的 icon 同名替換res/drawable-xxxx/jpush_notification_icon
這個(gè)文件。 - 應(yīng)該將 res 文件夾下的 所有 icon 文件都替換成自己的圖標(biāo)文件套利。
- 還有一個(gè)可能是:小米手機(jī)的 launcher 緩存可能有bug推励,按照上述要求配置好后鹤耍, 重啟手機(jī),再測(cè)試验辞。
- 若沒有
- 點(diǎn)擊該條通知消息:
- 如果我們?cè)?code>AndroidManifest.xml里沒有配置
Action - cn.jpush.android.intent.NOTIFICATION_OPENED
稿黄,JPush SDK 默認(rèn)打開 App 首頁(yè),相當(dāng)于點(diǎn)擊桌面圖標(biāo)的效果跌造。 - 如果我們需要做點(diǎn)擊跳轉(zhuǎn)抛猖,那么就得在
AndroidManifest.xml
里配置此receiver action
,SDK 在點(diǎn)擊后不會(huì)做動(dòng)作鼻听。我們需要在自己寫的BroadcastReceiver
類里處理,打開某Activity
联四。 - 這里可能遇到的問題是:某些手機(jī)系統(tǒng)下撑碴,App 從后臺(tái)退出了,但是能收到通知消息朝墩,點(diǎn)擊卻沒有反應(yīng)醉拓,無法跳轉(zhuǎn)。
- 可能的原因: Android 應(yīng)用退出后收苏,可能長(zhǎng)連接還存在亿卤,所以能收到消息,但是由于手機(jī)系統(tǒng)對(duì) App 的限制鹿霸,導(dǎo)致點(diǎn)擊通知欄不能重啟 App 成功排吴。
- 解決辦法:打開手機(jī)系統(tǒng)的限制。
- 具體會(huì)出現(xiàn)該情況的手機(jī)系統(tǒng)和后臺(tái)退出后還能收到消息的前提條件(是否需要將 JPush 相關(guān)組件設(shè)置為一個(gè)獨(dú)立進(jìn)程)等還沒有測(cè)試驗(yàn)證過懦鼠。
- 如果我們?cè)?code>AndroidManifest.xml里沒有配置
- Android 關(guān)閉通知:
可以達(dá)到關(guān)閉通知效果的有兩個(gè)辦法钻哩,我們可以根據(jù)自己的需求去選用,如果在 UI 層面加一個(gè)關(guān)閉的按鈕肛冶,那么對(duì)應(yīng)的代碼層面也是去選用這兩種 API 街氢。-
調(diào)用 stoppush :
- 一種本地的狀態(tài)操作,相當(dāng)于手動(dòng)終止 push 服務(wù)的效果睦袖,這個(gè)會(huì)導(dǎo)致同時(shí)關(guān)掉對(duì)所有類型消息的接收珊肃。
- 極光推送所有的其他 API 調(diào)用都無效。
- 必須調(diào)用 resumepush 才能恢復(fù)推送服務(wù)馅笙。
- 恢復(fù)后伦乔,如果推送的消息還在
time_to_live
內(nèi),客戶端會(huì)收到這條消息延蟹。
- 置空別名/標(biāo)簽(極光官網(wǎng)有總結(jié)一個(gè) 別名的高級(jí)應(yīng)用場(chǎng)景可以仔細(xì)閱讀一下)
- 一般需求是:用戶退出登錄后不要收到通知评矩。
對(duì)應(yīng)的操作是:項(xiàng)目的用戶退出登錄—置空別名—點(diǎn)擊登錄—重設(shè)別名。 - 如果用戶是直接殺死 A 手機(jī)的 App 阱飘,然后在 B 手機(jī)登錄斥杜。
若你們不允許多設(shè)備登錄虱颗,希望 A 手機(jī)不再收到消息,那么應(yīng)該在自己的后臺(tái)判斷出 A 用戶“ 換了設(shè)備登錄” 蔗喂,讓 A 手機(jī)自動(dòng)做登出操作忘渔,在客戶端置空別名;
或者在服務(wù)端調(diào)用極光的 API 去置空 A 手機(jī)設(shè)置的別名缰儿。
(判斷的方法可以是:將用戶某唯一信息與獲取到的 registrationID 一起上傳畦粮,registrationID 與之前相比改變了,則判斷為更換了設(shè)備乖阵。) -
需要注意:別名置空 至 重設(shè)別名 期間宣赔,推送的消息, 在重設(shè)別名后瞪浸,設(shè)備不會(huì)收到儒将。
若需要這期間的消息也被收到,需要自己服務(wù)器對(duì)此進(jìn)行判斷对蒲、保存钩蚊、并在客戶端重設(shè)別名后,重新向極光發(fā)起推送請(qǐng)求蹈矮。
若需要用戶的歷史推送消息可被查詢砰逻,需要自己服務(wù)器那邊去保存。
- 一般需求是:用戶退出登錄后不要收到通知评矩。
-
調(diào)用 stoppush :
2.自定義消息
iOS 需要當(dāng) App 處于前臺(tái)才能收到泛鸟,Android 不需要處于前臺(tái)蝠咆。
幾個(gè)特點(diǎn)
- 只接收,不展示谈况,需要我們自己做接收處理勺美,并且自己代碼實(shí)現(xiàn) 通知欄,或者轉(zhuǎn)為本地通知來展示碑韵。
- 需要依靠 App 與極光服務(wù)器建立的長(zhǎng)連接赡茸。
- Android 需要我們?cè)?code>AndroidManifest.xml里配置
Action - cn.jpush.android.intent.MESSAGE_RECEIVED
,并且在自己寫的BroadcastReceiver
里接收處理祝闻,詳細(xì)看官方文檔說明占卧。
什么時(shí)候使用它?
主要用于應(yīng)用的內(nèi)部業(yè)務(wù)邏輯和特殊展示需求联喘,譬如:
- 需要自定義通知欄時(shí)(Android 要播放自定義的聲音文件等情況)华蜒。
- 在 App 項(xiàng)目?jī)?nèi)的消息提醒。
- 有條件的消息提醒(譬如只讓處在某一頁(yè)面的用戶看到該條消息)豁遭。
可能會(huì)犯的錯(cuò)誤
弄混自定義內(nèi)容(字段 extras)與自定義消息(Message)
- 一般會(huì)出現(xiàn)的疑問是: Android 點(diǎn)擊通知欄無法獲取到自定義的內(nèi)容
- 推送時(shí) extras 是寫在 Notification 下還是 Message 下叭喜?
- 點(diǎn)擊 SDK 的通知欄 用
JPushInterface.EXTRA_EXTRA
獲取的是寫在 Notification 下的 extras 信息,沒法獲取寫在 Message 下的 extras蓖谢。 - Message 消息和 Notification 消息 分別有各自的參數(shù)捂蕴,不要混用譬涡。
3.富媒體
可以推送 Web頁(yè)面、圖片啥辨、聲音等除普通文本之外更豐富的內(nèi)容涡匀。
- 兩種:信:息流模板推送、URL 富媒體鏈接推送
- 信息流模板推送
- 推送 Web 頁(yè)面(富文本)溉知;
- 極光官網(wǎng)控制臺(tái)上有創(chuàng)建富文本頁(yè)面的功能模塊陨瘩,提供了5種模板;
- 富文本作為通知推送到客戶端级乍;
- 客戶端點(diǎn)擊通知舌劳,自動(dòng)展示該富文本頁(yè)面。
- URL 富媒體鏈接推送
- 推送某個(gè)頁(yè)面的 URL 玫荣,點(diǎn)擊通知欄消息后跳轉(zhuǎn)到這個(gè) URL 指定的頁(yè)面蒿囤。
- 信息流模板推送
- 僅支持 Android ,需要JPush Android SDK 1.8.0 及以上崇决。
- 只能通過極光推送的控制臺(tái)發(fā)送。
- 必須將壓縮包 res 中的資源放到我們自己的項(xiàng)目的對(duì)應(yīng)文件夾底挫,并按照官方示例
AndroidManifest
配置 PushActivity 組件恒傻。
4.本地通知
適用于在特定時(shí)間發(fā)出的通知,如一些Todo和鬧鐘類的應(yīng)用建邓,在每周盈厘、每月固定時(shí)間提醒用戶回到應(yīng)用查看任務(wù)
幾個(gè)特點(diǎn)
- 不依賴于網(wǎng)絡(luò),無網(wǎng)也可以觸發(fā)官边。
- 定時(shí)時(shí)間是自發(fā)送時(shí)算起沸手,不受中間關(guān)機(jī)等操作的影響。
- 本地通知與遠(yuǎn)程推送的通知是相互獨(dú)立的注簿,不受 保留最近通知條數(shù)上限(Android)的限制契吉。
- Android 依舊需要 App 應(yīng)用程序在運(yùn)行。
規(guī)則
- 本地推送保存在本地的 db 中诡渴,時(shí)間上的控制也是從 db 里面取捐晶。
- 關(guān)機(jī)或者殺進(jìn)程后將收不到本地通知。
- 進(jìn)程重啟后妄辩,會(huì)檢測(cè) db 惑灵,準(zhǔn)備設(shè)定時(shí)間在此之后的本地通知的推送。
- 本地通知的時(shí)間也依賴于每4分50秒的心跳來檢測(cè)眼耀,所以并不能特別精準(zhǔn)地剛好到了通知時(shí)間你剛好啟動(dòng)了進(jìn)程英支,就能收到推送,會(huì)有一定偏差哮伟。