做推送颊亮,怎么能不了解推送的 4 種消息形式呢柴梆?(Android 篇)

極光推送是為 App 提供第三方推送服務(wù)的平臺(tái)之一,它提供四種消息形式:通知终惑,自定義消息绍在,富媒體和本地通知。
筆者將基于官方說明與個(gè)人理解來談一下這四種消息雹有。本篇為 Android 篇偿渡, iOS 篇入口

1.通知

Push Notification霸奕,即指在手機(jī)的通知欄(狀態(tài)欄)上會(huì)顯示的一條通知信息溜宽。
Android: 依靠 JPush service ,由 JPush SDK 實(shí)現(xiàn)在手機(jī)通知欄的展示质帅。

Android 通知消息的流程是這樣的:


  1. 我們可以調(diào)用極光的 API 發(fā)起推送請(qǐng)求适揉,也可以通過極光官網(wǎng)控制臺(tái)推送。
  2. 請(qǐng)求在參數(shù)要求上基本正確——請(qǐng)求成功煤惩,返回 msgid (這條消息的 ID 標(biāo)識(shí))嫉嘀,返回 200(成功)或由極光判斷的推送失敗(一般是 1011 找不到目標(biāo)的錯(cuò)誤)盟庞;參數(shù)錯(cuò)誤吃沪,有返回錯(cuò)誤碼。
  3. 極光服務(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ì)再收到了。
    • 這里涉及到長(zhǎng)連接斷開的問題:
  4. 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è)試验辞。
  5. 點(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)證過懦鼠。
  6. 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ù)器那邊去保存。

2.自定義消息

iOS 需要當(dāng) App 處于前臺(tái)才能收到泛鸟,Android 不需要處于前臺(tái)蝠咆。

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

  1. 只接收,不展示谈况,需要我們自己做接收處理勺美,并且自己代碼實(shí)現(xiàn) 通知欄,或者轉(zhuǎn)為本地通知來展示碑韵。
  2. 需要依靠 App 與極光服務(wù)器建立的長(zhǎng)連接赡茸。
  3. Android 需要我們?cè)?code>AndroidManifest.xml里配置Action - cn.jpush.android.intent.MESSAGE_RECEIVED,并且在自己寫的BroadcastReceiver里接收處理祝闻,詳細(xì)看官方文檔說明占卧。
什么時(shí)候使用它?

主要用于應(yīng)用的內(nèi)部業(yè)務(wù)邏輯和特殊展示需求联喘,譬如:

  1. 需要自定義通知欄時(shí)(Android 要播放自定義的聲音文件等情況)华蜒。
  2. 在 App 項(xiàng)目?jī)?nèi)的消息提醒。
  3. 有條件的消息提醒(譬如只讓處在某一頁(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)容涡匀。

  1. 兩種:信:息流模板推送、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è)面蒿囤。
  2. 僅支持 Android ,需要JPush Android SDK 1.8.0 及以上崇决。
  3. 只能通過極光推送的控制臺(tái)發(fā)送。
  4. 必須將壓縮包 res 中的資源放到我們自己的項(xiàng)目的對(duì)應(yīng)文件夾底挫,并按照官方示例 AndroidManifest配置 PushActivity 組件恒傻。

4.本地通知

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

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

  1. 不依賴于網(wǎng)絡(luò),無網(wǎng)也可以觸發(fā)官边。
  2. 定時(shí)時(shí)間是自發(fā)送時(shí)算起沸手,不受中間關(guān)機(jī)等操作的影響。
  3. 本地通知與遠(yuǎn)程推送的通知是相互獨(dú)立的注簿,不受 保留最近通知條數(shù)上限(Android)的限制契吉。
  4. Android 依舊需要 App 應(yīng)用程序在運(yùn)行。
規(guī)則

  1. 本地推送保存在本地的 db 中诡渴,時(shí)間上的控制也是從 db 里面取捐晶。
  2. 關(guān)機(jī)或者殺進(jìn)程后將收不到本地通知。
  3. 進(jìn)程重啟后妄辩,會(huì)檢測(cè) db 惑灵,準(zhǔn)備設(shè)定時(shí)間在此之后的本地通知的推送。
  4. 本地通知的時(shí)間也依賴于每4分50秒的心跳來檢測(cè)眼耀,所以并不能特別精準(zhǔn)地剛好到了通知時(shí)間你剛好啟動(dòng)了進(jìn)程英支,就能收到推送,會(huì)有一定偏差哮伟。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末干花,一起剝皮案震驚了整個(gè)濱河市妄帘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌把敢,老刑警劉巖寄摆,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異修赞,居然都是意外死亡婶恼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門柏副,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勾邦,“玉大人,你說我怎么就攤上這事割择【炱” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荔泳,是天一觀的道長(zhǎng)蕉饼。 經(jīng)常有香客問我,道長(zhǎng)玛歌,這世上最難降的妖魔是什么昧港? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮支子,結(jié)果婚禮上创肥,老公的妹妹穿的比我還像新娘。我一直安慰自己值朋,他們只是感情好叹侄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昨登,像睡著了一般趾代。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丰辣,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天稽坤,我揣著相機(jī)與錄音,去河邊找鬼糯俗。 笑死尿褪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的得湘。 我是一名探鬼主播杖玲,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼淘正!你這毒婦竟也來了摆马?” 一聲冷哼從身側(cè)響起臼闻,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎囤采,沒想到半個(gè)月后述呐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕉毯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年乓搬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代虾。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡进肯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棉磨,到底是詐尸還是另有隱情江掩,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布乘瓤,位于F島的核電站环形,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衙傀。R本人自食惡果不足惜斟赚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望差油。 院中可真熱鬧,春花似錦任洞、人聲如沸蓄喇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妆偏。三九已至,卻和暖如春盅弛,著一層夾襖步出監(jiān)牢的瞬間钱骂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工挪鹏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留见秽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓讨盒,卻偏偏與公主長(zhǎng)得像解取,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子返顺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容