iOS apns Device token的獲得 以及是否會改變,解決重複推送
APP 的推送通知功能對於每個 APP 而言的都是十分重要的,而對於 iOS 開發者來說 APNS 推送服務是必須熟悉掌握的,而註冊 APNS 服務時獲取的Device token 的變更策略,就是一個需要十分注意的問題。
最近公司的產品遇到了一個問題: 向用戶推送訊息時,有的使用者會出現 重複 收到同一條推送
。
經過反覆排查後終於發現了原因。
我們使用了 騰訊的 信鴿推送 SDK,APP 最初開發時設計的是允許同一使用者在多臺裝置上同時登入的,所以採用的實現為: 使用者登入時 註冊信鴿推送 然後將 Device token 同步到後臺,使用者正常登出登入時後臺將登出的這臺裝置的 Device token 設為不可用狀態。在推送時查詢使用者相關的 Device token 呼叫信鴿 API 進行按裝置推送
但是由於失誤,在賬號進行登出登入時也沒有 呼叫 信鴿的 API 登出該裝置的推送,也就造成了只要一臺裝置的 Device token 發生了改變、而使用者又沒有正常的登出賬號,該使用者在後臺就會有多條 可用 狀態的 Device token 記錄,而後臺在呼叫 信鴿 API 的時候並沒有進行
同一賬號 只調用一條
Device token記錄進行裝置推送的限制,導致了同一裝置 重複 收到同一條推送(簡單說就是有多條Device token指向了同一臺裝置)。
而得出這個結論源於我們對Device token改變的測試
在刪除手機上的 APP 之後,再次下載安裝,Device token 改變了。
也就是說 通過 APNS 獲取的 Device token 的變化比我們認為的難度要低得多。
再次查閱官方文件是這樣寫的:
If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes
An application should register every time it launches and give its provider the current token
大致是說,當進行備份恢復、或恢復出廠設定之類的操作時,Device token會發生改變,建議 APP 在每次啟動時都獲取Device token。
此外普遍認為還有一種情況也會改變Device token,就是在 iOS 大版本升級時。
但是經過我們的測試以及後臺資料庫中不少使用者都擁有多條Device token記錄表明,Device token還是比較容易發生改變的。
所以在推送整合中,一定要注意進行新舊Device token的對比,使用第三方(信鴿、極光等)要在賬戶登出時呼叫 第三方的API 登出推送,以及在使用Device token進行推送時只取最新的一條
Device token,這樣就避免存在多個token指向同一臺裝置的問題。
此外需要注意的一點是,獲取Device token時聯網狀態的改變。
在第一次呼叫registerForRemoteNotificationTypes方法時沒有聯網,則既不會呼叫didRegisterForRemoteNotificationsWithDeviceToken,也不會呼叫didFailToRegisterForRemoteNotificationsWithError
在第一次呼叫registerForRemoteNotificationTypes註冊成功後,之後即使沒有聯網,再呼叫registerForRemoteNotificationTypes時都會以最上一次的device token作為引數回撥didRegisterForRemoteNotificationsWithDeviceToken方法。
(官方描述)