遠(yuǎn)程推送(一): iOS 的遠(yuǎn)程推送

說在前面

iOS中的推送分為:Local Notification(本地消息通知)和Remote Notification(遠(yuǎn)程消息推送)确垫。本文重點(diǎn)介紹一下Remote Notification弓颈,主要講理論知識,沒有具體的代碼實(shí)現(xiàn)删掀,望各位見諒翔冀。

Apple Push Notification Service

蘋果官方的Programming Guide中是這么描述的:

Apple Push Notification service (APNs) is the centerpiece of the remote notifications feature. It is a robust and highly efficient service for propagating information to iOS (and, indirectly, watchOS), tvOS, and OS X devices. Each device establishes an accredited and encrypted IP connection with APNs and receives notifications over this persistent connection. If a notification for an app arrives when that app is not running, the device alerts the user that the app has data waiting for it.

You provide your own server to generate the remote notifications for your users. This server, known as the provider, gathers data for your users and decides when a notification needs to be sent. For each notification, the provider generates the notification payload and attaches that payload to an HTTP/2 request, which it then sends to APNs using a persistent and secure channel using the HTTP/2 multiplex protocol. Upon receipt of your request, APNs handles the delivery of your notification payload to your app on the user’s device.

For information about the format of the requests that you send to APNs, and the responses and errors you can receive, see APNs Provider API. For information about how to implement notification support in your app, see Registering, Scheduling, and Handling User Notifications.

大概的意思就是:
Apple Push Notification service (以下簡稱:APNs)即蘋果推送通知服務(wù)是蘋果遠(yuǎn)程通知功能的核心忘衍,支持蘋果的所有的設(shè)備(包括WatchOS攒暇、TVOS、OS X)垄分。每臺設(shè)備和APNs之間會建立一個網(wǎng)絡(luò)長連接接收通知付呕。無論應(yīng)用程序是否正在運(yùn)行计福,Apple設(shè)備都可以接收到通知并且對用戶進(jìn)行提示。
我們需要創(chuàng)建自己的服務(wù)器(以下稱為:Provider)在需要的時候生成遠(yuǎn)程通知徽职。再由Provider通過HTTP 2.0協(xié)議向APNs發(fā)送請求象颖,APNs在接收到請求后,會對遠(yuǎn)程消息進(jìn)行處理并推送到你的應(yīng)用程序所在的設(shè)備姆钉。

上面這么一大段話说订,我們可以簡單的用下圖來概括:


一條遠(yuǎn)程通知發(fā)送的過程

通過上面這些內(nèi)容抄瓦,我們大概可以知道以下幾點(diǎn):

  1. Provider,發(fā)送遠(yuǎn)程推送的時候陶冷,首先要有一個自己的服務(wù)器钙姊,用來生成遠(yuǎn)程通知的內(nèi)容并按照蘋果官方的API發(fā)送遠(yuǎn)程通知請求。這個請求是通過HTTP2.0協(xié)議完成的埂伦,也就是https
  2. APNs煞额,蘋果的遠(yuǎn)程推送服務(wù)器,Provider發(fā)出的請求并不是直接發(fā)送到設(shè)備沾谜,而是發(fā)給APNs(強(qiáng)制的)膊毁,然后再由 APNs 發(fā)送給應(yīng)用程序所在的設(shè)備
  3. APNs 是通過和設(shè)備之間的一個可信任、加密基跑、長久的網(wǎng)絡(luò)連接將遠(yuǎn)程通知發(fā)送到設(shè)備上的

** APNs 的儲存機(jī)制**
當(dāng)蘋果設(shè)備處于無網(wǎng)絡(luò)連接時婚温,遠(yuǎn)程推送消息是沒有辦法發(fā)送到設(shè)備的,這時APNs會把這條消息存起來媳否,當(dāng)然栅螟,只是一段時間內(nèi),并且只可以存一條逆日,也就是說一旦你的設(shè)備無網(wǎng)絡(luò)連接的時間過長嵌巷,或者有一條新的推送消息的話萄凤,都會導(dǎo)致之前存的消息消失室抽。個人認(rèn)為這勉強(qiáng)可以算是蘋果對于推送消息在網(wǎng)絡(luò)方面小小的解決方案吧,畢竟想做到大數(shù)據(jù)量的存儲不是容易的事靡努,而且你也不想在IPhone重新連接網(wǎng)絡(luò)的時候會有N條推送出現(xiàn)吧坪圾,小心臟壓力不會小……

The device token

The device token 是蘋果設(shè)備的唯一認(rèn)證碼。當(dāng)你設(shè)備中的APP需要發(fā)送推送消息的時候惑朦,APNs 只能通過 device token 才能定位到你的設(shè)備兽泄。APP 在使用遠(yuǎn)程推送功能之前需要注冊 device token ,通過Device 向 APNs 發(fā)送注冊請求漾月,并將從 APNs 獲得的 device token 發(fā)給 Provider 進(jìn)行保存病梢,以便將來發(fā)送推送消息時, Provider 向 APNs 發(fā)送請求時使用梁肿。
注意:

  1. device token 是Device (也就是設(shè)備)向 APNs 注冊然后分享給 APP 使用的蜓陌,雖然注冊的代碼是寫在 APP 當(dāng)中,但是主角還是 Device
  2. device token 并不是永遠(yuǎn)不變的吩蔑,當(dāng)升級操作系統(tǒng)后會生成新的 device token 钮热,所以我們需要在APP 啟動的時就將新的 device token 發(fā)送到Provider 并進(jìn)行保存,這樣才能確保推送消息能夠準(zhǔn)確的發(fā)送到設(shè)備上
  3. device token 雖然是可修改的烛芬,但是千萬不要試圖修改他們隧期,否則小心無法以正確的姿勢發(fā)送推送消息啊

下面兩圖飒责,分別展示了 device token 注冊和遠(yuǎn)程推送過時的過程

向 APNs 注冊device token 的過程

Device 把 device token 分享給 APP 的過程

Provider 和 APNs 之間的連接

Provider 和APNs 之間會創(chuàng)建一個TLS連接,Provider首先會接收到APNs發(fā)過來的服務(wù)器證書仆潮,然后把自己的證書發(fā)給APNs(也就是p12文件)宏蛉,APNs驗(yàn)證通過后,完成TLS連接創(chuàng)建性置。如果你的證書配置的不正確檐晕,也就是沒有開通推送權(quán)限的話,APNs 會拒絕Provider的https請求蚌讼。
Provider 除了需要向 APNs 發(fā)送證書以外辟灰,還需要發(fā)送 PayLoad (消息載體),包括了JSON字典格式的消息內(nèi)容篡石、消息展示的形式(比如:Alert)芥喇、badge 顯示的消息數(shù)目以及sound提示聲。


Provider 和APNs 通信過程

APNs 和 Device 之間的連接

每個 Device 都有自己的設(shè)備證書和私鑰凰萨,在設(shè)備激活的時候存儲在了 Keychain 中继控。Device 會啟動一個 TLS 連接APNs,APNs 會把服務(wù)器證書發(fā)給 Device 進(jìn)行驗(yàn)證胖眷,通過后 Device 會把設(shè)備證書發(fā)送給 APNs 進(jìn)行驗(yàn)證武通,一旦雙方都驗(yàn)證通過,這個連接就會創(chuàng)建成功珊搀,并且長時間的保持冶忱,當(dāng)然,這個過程中我們是什么都不需要做的境析,蘋果會自動幫我們完成囚枪。
注意:APNs 和 Device 的長連接優(yōu)先使用的移動網(wǎng)絡(luò),只有已經(jīng)連接wifi時才會走wifi劳淆,這也就是為什么好多人wifi上不了網(wǎng)链沼,但是卻能收到推送消息的原因。

APNs 和 Device 通信過程

總結(jié)

iOS 遠(yuǎn)程推送的相關(guān)知識大概就是這些了沛鸵,總結(jié)一下有以下幾點(diǎn):

  1. 具有遠(yuǎn)程推送權(quán)限的證書括勺,如果沒有,也就不能通過APNs的驗(yàn)證曲掰,當(dāng)然也就沒有辦法進(jìn)行消息推送了
  2. 向 APNs 進(jìn)行注冊獲得 device token疾捍,并進(jìn)行存儲,要保證 device token 的正確性和實(shí)時性蜈缤,否則也是無法消息推送的
  3. Provider 向 APNs 請求時拾氓,使用的HTTP 2.0 也就是https協(xié)議,普通的 http 是會被拒絕訪問的
  4. APNs 和 Device 之間的長連接也是 HTTP 2.0 協(xié)議底哥,優(yōu)先走的移動網(wǎng)絡(luò)咙鞍,若連 wifi 才會走 wifi 網(wǎng)絡(luò)房官,所以只要保證有其中一樣的網(wǎng)絡(luò)連接是可用的,那么就可以正確的姿勢收到推送消息了

參考

  1. 蘋果自家開發(fā)文檔:Local and Remote Notification Programming Guide
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末续滋,一起剝皮案震驚了整個濱河市翰守,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疲酌,老刑警劉巖蜡峰,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朗恳,居然都是意外死亡湿颅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門粥诫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來油航,“玉大人,你說我怎么就攤上這事怀浆∫昵簦” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵执赡,是天一觀的道長镰踏。 經(jīng)常有香客問我,道長沙合,這世上最難降的妖魔是什么奠伪? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮灌诅,結(jié)果婚禮上芳来,老公的妹妹穿的比我還像新娘含末。我一直安慰自己猜拾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布佣盒。 她就那樣靜靜地躺著挎袜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肥惭。 梳的紋絲不亂的頭發(fā)上盯仪,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音蜜葱,去河邊找鬼全景。 笑死,一個胖子當(dāng)著我的面吹牛牵囤,可吹牛的內(nèi)容都是我干的爸黄。 我是一名探鬼主播滞伟,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炕贵!你這毒婦竟也來了梆奈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤称开,失蹤者是張志新(化名)和其女友劉穎亩钟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖轰,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡清酥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蕴侣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片总处。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖睛蛛,靈堂內(nèi)的尸體忽然破棺而出鹦马,到底是詐尸還是另有隱情,我是刑警寧澤忆肾,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布荸频,位于F島的核電站,受9級特大地震影響客冈,放射性物質(zhì)發(fā)生泄漏旭从。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一场仲、第九天 我趴在偏房一處隱蔽的房頂上張望和悦。 院中可真熱鬧,春花似錦渠缕、人聲如沸鸽素。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馍忽。三九已至,卻和暖如春燕差,著一層夾襖步出監(jiān)牢的瞬間遭笋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工徒探, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓦呼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓测暗,卻偏偏與公主長得像央串,于是被迫代替她去往敵國和親谎替。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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