說在前面
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è)備姆钉。
上面這么一大段話说订,我們可以簡單的用下圖來概括:
通過上面這些內(nèi)容抄瓦,我們大概可以知道以下幾點(diǎn):
- Provider,發(fā)送遠(yuǎn)程推送的時候陶冷,首先要有一個自己的服務(wù)器钙姊,用來生成遠(yuǎn)程通知的內(nèi)容并按照蘋果官方的API發(fā)送遠(yuǎn)程通知請求。這個請求是通過HTTP2.0協(xié)議完成的埂伦,也就是https
- APNs煞额,蘋果的遠(yuǎn)程推送服務(wù)器,Provider發(fā)出的請求并不是直接發(fā)送到設(shè)備沾谜,而是發(fā)給APNs(強(qiáng)制的)膊毁,然后再由 APNs 發(fā)送給應(yīng)用程序所在的設(shè)備
- 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ā)送請求時使用梁肿。
注意:
- device token 是Device (也就是設(shè)備)向 APNs 注冊然后分享給 APP 使用的蜓陌,雖然注冊的代碼是寫在 APP 當(dāng)中,但是主角還是 Device
- device token 并不是永遠(yuǎn)不變的吩蔑,當(dāng)升級操作系統(tǒng)后會生成新的 device token 钮热,所以我們需要在APP 啟動的時就將新的 device token 發(fā)送到Provider 并進(jìn)行保存,這樣才能確保推送消息能夠準(zhǔn)確的發(fā)送到設(shè)備上
- device token 雖然是可修改的烛芬,但是千萬不要試圖修改他們隧期,否則小心無法以正確的姿勢發(fā)送推送消息啊
下面兩圖飒责,分別展示了 device token 注冊和遠(yuǎn)程推送過時的過程
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提示聲。
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)链沼,但是卻能收到推送消息的原因。
總結(jié)
iOS 遠(yuǎn)程推送的相關(guān)知識大概就是這些了沛鸵,總結(jié)一下有以下幾點(diǎn):
- 具有遠(yuǎn)程推送權(quán)限的證書括勺,如果沒有,也就不能通過APNs的驗(yàn)證曲掰,當(dāng)然也就沒有辦法進(jìn)行消息推送了
- 向 APNs 進(jìn)行注冊獲得 device token疾捍,并進(jìn)行存儲,要保證 device token 的正確性和實(shí)時性蜈缤,否則也是無法消息推送的
- Provider 向 APNs 請求時拾氓,使用的HTTP 2.0 也就是https協(xié)議,普通的 http 是會被拒絕訪問的
- APNs 和 Device 之間的長連接也是 HTTP 2.0 協(xié)議底哥,優(yōu)先走的移動網(wǎng)絡(luò)咙鞍,若連 wifi 才會走 wifi 網(wǎng)絡(luò)房官,所以只要保證有其中一樣的網(wǎng)絡(luò)連接是可用的,那么就可以正確的姿勢收到推送消息了