iOS 關于遠程推送(push) 的幾個問題
1 push 基本流程原理
(1)啟動 app
(2)注冊遠程通知
(3)蘋果服務器回調一個deviceToken "didRegisterForRemoteNotificationsWithDeviceToken:”
(4)把該deviceToken傳遞給我們的服務器/第三方push服務接收deviceToken方法
(5)當我們需要給用戶推送消息的時候,服務器或者第三方就會給把這個用戶的deviceToken和推送必要內容發送給蘋果都得APNS服務器.然后APNS服務器再將消息推送到該deviceToken對應的這臺手機上面.
2 deviceToken 認識
"If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes"
當手機重置刷機生系統,deviceToken會變化 ,開發者生產者證書的切換也會使deviceToken有變化.
對于1的介紹, 也就是說發送遠程push 對手機的識別基于deviceToken.來判斷的. 那么 deviceToken是唯一的可用來作為主鍵的嗎?
個人認為:辯證看這個問題,deviceToken是會變化的,但是推送一定是拿deviceToken來做推送識別的.也就是說deviceToken是作為設備的唯一標示.
那么,這就是為什么注冊遠程通知的步驟是在啟動app時候,每次都注冊遠程通知,這樣即使deviceToken會變化(說明之前的deviceToken失效無法獲得推送),或者之前由于網絡等各種原因沒有注冊上都會重新獲得deviceToken.
所以,deviceToken是否變化理應不影響推送.
那么下面兩個問題是關鍵:
3 給同一個用戶同一個手機推送推送多條推送 問題
說明 deviceToken變化后,在舊deviceToken還未失效,那么服務端一條一條推送 就推送了多個... 那么當前情況就是應該推送當前用戶當前應用一條有效推送,即告訴服務端哪個deviceToken才是有效的.
這里解決方案是 獲取當前設備的UUID + keychain + DeviceToken 來處理該問題.
使用keychain能夠保證用戶當前設備不刷機情況,即使用戶刪掉應用重新安裝仍然還能獲取到keychain中的UUID,這樣 告訴服務端 當前UUID 有效deviceToken 是哪一個即可
4 給同一用戶 多個硬件端 推送問題
如果有這樣的用戶 用同一個賬號登了好幾個硬件, 這個時候 是給幾個硬件都發推送????還是只發其中一個??? 感覺有點蒙逼…
首先要考慮第一點 3 中提到的問題, 其二 需求是只發一臺 還是當前用戶所有設備都發.
都發:多臺設備 多個UDID 就對應多個deviceToken 就是正常維護每個UDID對應的deviceToken 發送push即可
如果只發一臺:那么 服務端 需要糾結判斷一下到底該給當前用戶 哪個UDID 所維護最新deviceToken 發送 push呢???
這個我們這里遵守規則維護當前時間戳最新的一條deviceToken的設備 發送push.
推薦工具 : PushMeBaby
noodlewerk/NWPusher
除了使用push第三方外 測試 當前證書 當前測試機 調通 push功能 簡單暴力 方便 直接
地址:
https://github.com/stefanhafeneger/PushMeBaby
https://github.com/noodlewerk/NWPusher
posted on 2017-02-20 18:13 ACM_Someone like you 閱讀(1159) 評論(0) 收藏 舉報
浙公網安備 33010602011771號