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

極光推送是為 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 通知的流程是這樣的

  1. 我們可以調(diào)用極光的 API 發(fā)起推送請(qǐng)求私爷,也可以通過(guò)極光官網(wǎng)控制臺(tái)推送雾棺。
  2. 請(qǐng)求在參數(shù)要求上基本正確——請(qǐng)求成功俭尖,返回 msgid (這條消息的 ID 標(biāo)識(shí))击胜,返回 200(成功)或由極光判斷的推送失敗(一般是 1011 找不到目標(biāo)的錯(cuò)誤)笛臣;參數(shù)錯(cuò)誤工秩,有返回錯(cuò)誤碼尸饺。
  3. 極光處理該條請(qǐng)求,將這條請(qǐng)求發(fā)給蘋(píng)果 APNs 服務(wù)器助币,一般都是秒內(nèi)處理(非 VIP 通道偶爾可能會(huì)發(fā)生堵塞)浪听。
  4. 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)

  1. 通知欄的展示完全由 iOS 系統(tǒng)控制寝优,左側(cè)圖片是自動(dòng)獲取的 App 圖標(biāo),是不可動(dòng)態(tài)改變的惫叛。
  2. iOS 10 以下系統(tǒng):
    • APNs 通知是 只能在 App 處于后臺(tái)或殺死時(shí)才能展示的倡勇。
  3. 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)方法)仑最。
  4. 獲取通知內(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 方法。
  5. 手機(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ò)辞槐。
  6. 與證書(shū)和環(huán)境有關(guān):
    • 推送的環(huán)境 必須與 App 的打包環(huán)境 一致掷漱。
    • 蘋(píng)果官網(wǎng)的證書(shū)粘室、極光官網(wǎng)上傳的證書(shū)榄檬、 App 打包的證書(shū) 必須完全一致
  7. 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 篇
  8. 推送時(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)的選擇朴爬,如果沒(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)

  1. 只接收蚣常,不展示,需要我們自己做接收處理痊银,并且自己代碼實(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)展示這條消息
  1. 需要依靠 App 與極光服務(wù)器建立的長(zhǎng)連接遇八,所以 iOS 必須當(dāng) App 處于前臺(tái)時(shí)才能接收到。
  2. iOS 需要在 delegate 類中注冊(cè)通知并實(shí)現(xiàn)回調(diào)方法 networkDidReceiveMessage耍休,詳細(xì)看官方文檔說(shuō)明刃永。
  3. 對(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í)候使用它?

  1. 推送保證不會(huì)丟失的消息押框。
  • APNs 一般只做為通知提醒岔绸,譬如 IM,退到后臺(tái)强戴,收到消息提醒亭螟,點(diǎn)擊進(jìn)去后還是走應(yīng)用內(nèi)消息收取挡鞍,確保不丟骑歹。(在極光這邊也有提供 JMessage 即時(shí)通訊
  • JPush 的應(yīng)用內(nèi)消息,會(huì)免費(fèi)保留 5 條離線消息
  1. iOS 需要在前臺(tái)展示消息時(shí)(iOS 10 新增接口之前)墨微。
  2. 在 App 項(xiàng)目?jī)?nèi)的消息提醒道媚。
  3. 有條件的消息提醒(譬如只讓處在某一頁(yè)面的用戶看到該條消息)。

3.富媒體

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

  1. 僅支持 Android 锈麸,需要JPush Android SDK 1.8.0 及以上镀脂。

4.本地通知

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

  1. 不依賴于網(wǎng)絡(luò)氓奈,無(wú)網(wǎng)也可以觸發(fā)翘魄。
  2. 定時(shí)時(shí)間是自發(fā)送時(shí)算起,不受中間關(guān)機(jī)等操作的影響舀奶。
  3. iOS 中也和 遠(yuǎn)程 APNs 通知一樣暑竟,在不同的狀態(tài),不同的系統(tǒng)下育勺,對(duì)應(yīng)有幾種獲取消息的方法但荤,App 被殺死也是可觸發(fā)的。
  4. 本地通知里面的 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)的了解一番。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倒信,一起剝皮案震驚了整個(gè)濱河市科贬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳖悠,老刑警劉巖榜掌,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乘综,居然都是意外死亡憎账,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門卡辰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胞皱,“玉大人,你說(shuō)我怎么就攤上這事九妈》雌觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵萌朱,是天一觀的道長(zhǎng)宴树。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晶疼,這世上最難降的妖魔是什么酒贬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮冒晰,結(jié)果婚禮上同衣,老公的妹妹穿的比我還像新娘。我一直安慰自己壶运,他們只是感情好耐齐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蒋情,像睡著了一般埠况。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棵癣,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天辕翰,我揣著相機(jī)與錄音,去河邊找鬼狈谊。 笑死喜命,一個(gè)胖子當(dāng)著我的面吹牛沟沙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壁榕,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矛紫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了牌里?” 一聲冷哼從身側(cè)響起颊咬,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牡辽,沒(méi)想到半個(gè)月后喳篇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡态辛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年麸澜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因妙。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痰憎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攀涵,到底是詐尸還是另有隱情,我是刑警寧澤洽沟,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布以故,位于F島的核電站,受9級(jí)特大地震影響裆操,放射性物質(zhì)發(fā)生泄漏怒详。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一踪区、第九天 我趴在偏房一處隱蔽的房頂上張望昆烁。 院中可真熱鬧,春花似錦缎岗、人聲如沸静尼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鼠渺。三九已至,卻和暖如春眷细,著一層夾襖步出監(jiān)牢的瞬間拦盹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工溪椎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留普舆,地道東北人恬口。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沼侣,于是被迫代替她去往敵國(guó)和親楷兽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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