什麼是遠端推送通知
顧名思義,就是從遠端伺服器推送給用戶端的通知(需要聯網)遠端推送服務,又稱為APNs(Apple Push Notification Services)
為什麼需要遠端推送通知
- 傳統擷取資料的局限性 隻要使用者關閉了app,就無法跟app的伺服器溝通,無法從伺服器上獲得最新的資料内容
- 遠端推送通知可以解決以上問題 不管使用者打開還是關閉app,隻要聯網了,都能接收到伺服器推送的遠端通知
遠端推送通知使用須知
- 所有的蘋果裝置,在聯網狀态下,都會與蘋果的伺服器建立長連接配接 什麼是長連接配接 隻要聯網了,就一直建立連接配接
- 長連接配接的作用 時間校準 系統更新 查找我的iPhone .. ...
- 長連接配接的好處 資料傳輸速度快 資料保持最新狀态
推送原理
蘋果推送其實就是借助了蘋果的APNS來推送的。
步驟:
1:向apns請求注冊通知,需不需要要進行通知發送。(一般都在didFinishLaunchingWithOptions方法裡)
2:請求完畢,apns同意,傳回給你token,(代碼是didReceiveRemoteNotification方法,如果是第三方,則把token傳給第三方儲存,如果是你們自己寫的,則傳給你們的伺服器儲存。)
3:現在要發通知了:伺服器把token和消息一起發送給apns,apns根據token查找對應的裝置,然後發送。
4:當裝置已接收到遠端通知,
* 程式運作狀态,:調用application:didReceiveRemoteNotification:方法
* 當程式處于背景或者被殺死狀态,當你進入(aunch)程式時:調用application:didReceiveRemoteNotification:fetchCompletionHandler:來處
理你需要做的事情,比方:除了badge、儲存資料、發送消息、彈框等等。
總:apns就是一個中轉站,你的所有的消息不是直接發送,需要經過apns這個中轉站倒手才能發送過去。
具體圖例
根據圖檔我們可以概括一下:
1、應用程式注冊APNS消息推送。
2、ios從APNS Server擷取devicetoken,應用程式接收device token。
3、應用程式将device token發送給程式的PUSH服務端程式。
4、服務端程式向APNS服務發送消息。
5、APNS服務将消息發送給iPhone應用程式。
問題
1:Device token for an iPhone device生成之後就永遠不變嗎?
不是,if a device is wiped (應該是重裝系統), it will get a new device token.
官方網站是這樣寫的: If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes
正是因為device有可能改變,是以建議在app start時(即在didFinishLaunchingWithOptions 裡)調用registerForRemoteNotificationTypes來擷取device token以檢查device token是否改變,如果改變了就應該把新token傳給push provider。(官方描述:An application should register every time it launches and give its provider the current token)
device token應該存儲在NSUserDefaults來達到新舊比較的目的
那麼舊device token在push provider對應的record怎麼辦?
方案1:把舊device token send to provider and request delete record
方案2:使用apns feedback service。
方案2可能更好些,因為總是需要使用apns feedback service來處理使用者在device裡删除app的情況。
調用registerForRemoteNotificationTypes方法後,成功注冊後,APNS就會傳回一個device token,然後回調delegate methoddidRegisterForRemoteNotificationsWithDeviceToken, 如果注冊失敗,則回調delegate method didFailToRegisterForRemoteNotificationsWithError。
注意:
* 在第一次調用registerForRemoteNotificationTypes方法時沒有聯網,則既不會調用didRegisterForRemoteNotificationsWithDeviceToken,也不會調用didFailToRegisterForRemoteNotificationsWithError
*在第一次調用registerForRemoteNotificationTypes注冊成功後,之後即使沒有聯網,再調用registerForRemoteNotificationTypes時都會以最上一次的device token作為參數回調didRegisterForRemoteNotificationsWithDeviceToken方法。
其他
準備證書類的工作都是一樣的,可以檢視這個連接配接
友情連結 http://www.51testing.com/html/46/249846-857789.html