1. 程式人生 > >iOS遠程推送原理

iOS遠程推送原理

獲取數據 data- 方式 code register 結束 什麽 uia services

遠程推送

就是從遠程server推送消息給client的通知。當然須要聯網。

遠程推送服務APNs (Apple Push NotificationServices)

為什麽須要遠程推送通知?

傳統獲取數據的局限性是僅僅要用戶關閉了app。就無法跟app的server溝通。無法從server上獲得最新的數據內容

而遠程推送通知能夠解決問題,無論用戶打開還是關閉app,僅僅要聯網了,都能接收到server推送的遠程通知。

我們先從網絡連接開始了解下。

http協議:是個短連接,一個請求一個響應就結束了。

典型的網絡請求。

tcp/ip協議:三次握手連接,僅僅要server或者client不主動斷開。保持連接著。大概QQ聊天就是這樣的協議了。


推送,我們從QQ聊天著手吧。

A用戶和B用戶聊天:

1.A和B用戶同一時候在線,跟server保持連接狀態下:“A發送消息給B:在嗎?,B回復:在的。”我們分析下這個過程。

->A將消息“在嗎?”發送給QQserver,此時由於B與server也保持連接,因此server將消息發送給B,相同B的回復也反向傳輸成立。

2.A發送消息給B。但B不在線。

->這樣的情況下,server無法將A的消息發送給B了。那我們手機不在線的情況下是怎麽收到A的消息的?


那我們就不得不拿出來神器遠程推送了。遠程推送是通過蘋果的APNsserver來實現的。僅僅要你的蘋果設備聯網狀態,你的設備就與蘋果的APNsserver保持一個長連接狀態。

那我們就能夠想到。A將消息發送給server時,server將消息發送給APNsserver的方式能夠實現將消息發送給B了,那詳細是怎麽實現的呢?我們往下看:

1. A與B安裝QQclient。登錄自己的QQ號碼時。A和B將自己的QQ號碼+蘋果設備的DeviceToken發送給QQserver,QQserver將這一組數據保存在自己的數據庫中。

獲取DeviceToken方法。在AppDelegate.m中:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
}
2.A將消息“在嗎?”發送給B時,server發現B不在線,這時,server從數據庫中查找B相應的DeviceToken,將B的DeviceToken+消息“在嗎?”發送給APNsserver。

3.APNsserver收到消息後,找到B相應的DeviceToken,將消息“在嗎?”發送給B的設備。


那麽另一個疑問。APNsserver將消息發送給B的設備。那怎麽知道是QQclient呢?

事實上說白了。這個事情就被DeviceToken包括了,當你獲取DeviceToken時,蘋果偷偷的將設備的UDID和APP和bundle identifier發送給蘋果server。蘋果server返回給你了DeviceToken。因此QQserver將消息+B的DeviceToken發送給蘋果的APNsserver時,蘋果已經知道了是哪個client了。


----end








iOS遠程推送原理