iOS推送機制

weixin_33936401發表於2016-06-11

原文地址:原文地址

研究了一下Apple Push Notification Service,實現很簡單,很環保.原理如下:

  • 財大氣粗的蘋果提供了一堆伺服器,每個ios裝置和這些伺服器保持了一個長連線,ios版本更新提示,手機時鐘校準什麼的都是通過這個連線.

  • 蘋果把這個長連線開放出來給大家推送訊息用,很積德,因為這是個全球服務,幾十億臺ios裝置,伺服器少說也需要上萬臺,還沒有錢可以賺. andorid的爸爸就不做這個,於是各個app為了發訊息,只能直接拼命賴在後臺維持一個長連線,電就是這樣被耗光的

  • 蘋果提供訊息服務簡稱為APNS,只是是長連線機器的一部分,你要向你的使用者發訊息,必須通過apns中轉,你寫程式發給它,它轉發給你的手機,你的推送程式和使用者手機沒有直接聯絡

  • 訊息推送不支援群發,只能一個一個發.如果你的App有100萬個使用者,要發訊息怎麼辦? 一個一個的發唄,發100萬次.訊息包大概包括兩部分:標示使用者手機的id(32個位元組)+訊息體(<=256Bytes),訊息體是json字串,傳輸過程用ssl加密的

  • 標示使用者手機的ID 叫做 device tokens,每個手機都不一樣,deviceToken非常重要

推送流程:

2239910-72b12e0b3cd7c9d5
image
  1. 首先是應用程式註冊訊息推送。
  2. IOS跟APNS Server要deviceToken。應用程式接受deviceToken。
  3. 應用程式將deviceToken傳送給PUSH服務端程式(Provider)。
  4. 服務端程式向APNS服務傳送訊息。
  5. APNS服務將訊息傳送給iPhone應用程式。

device tokens

  • device tokens每個機器都不一樣,比較獨一無二,但絕不是硬體碼,如果你重灌了ios系統,可能會發生變化.其實 device tokens 也是使用者的手機發起請求,由apns生成的,可以相信,apns後臺有一個key-value資料庫.

  • 獲取device tokens 很簡單,只需要實現下面這個函式
    (void)application:(UIApplication)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData)deviceToken
    在這個函式裡面,你把deviceToken儲存到你伺服器上即可,這個函式是個call back函式,ios從apns得到deviceToken,就傳給它,你需要做的,寫一段儲存 這個token的程式碼

  • 注意:蘋果沒有承諾deviceToken的生成機制,隨時可能變化,最好的方法是你第一次獲取到deviceToken之後,也提交,然後存在本地,之後每次都比較,發現有變化,就更新你的伺服器上的記錄

app支援推送的技術實現

要實現推送功能,你需要幹如下幾件事情:

  1. 你需要寫3段程式

  2. 到蘋果開發者中心註冊一次,並下載一份cer檔案

  3. 從蘋果的Provisioning Portal,填寫並下載一個Provisioning Profile

先說2,3兩點

  • 下載cer檔案,是推送程式要用,因為要通過ssl通道傳送資料
  • 填寫並下載Provisioning Profile,並從xcode加入到你的app專案檔案中,你可以理解為辦手續,總不能無證亂髮吧

需要寫的3段程式分別是

  • 前文提到的儲存device token的程式碼,很簡單的,隨便搭個http服務,用mysql建個表,你在app裡面用http post提交就行

  • 第二段程式是:你的app必須做個標記,告訴ios,你會給使用者產生推送訊息,這個程式碼很簡單,一句話搞定

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:     
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |
 UIRemoteNotificationTypeAlert)];
   加在app初始化函式裡面即可
  • 最後是:推送程式,這個程式碼量可能最多.邏輯很簡單:遍歷你的存放devictTokent的資料表,逐一發訊息給蘋果的APNS伺服器.推送程式,有很多開原始碼,用APNS為關鍵詞,一搜一大把,各種語言都有,改改就能用

蘋APNS伺服器地址:gateway.push.apple.com,埠是 2195
以前看到有人吹噓自己100萬使用者規模訊息推送,這個有技術含量麼? 就是1000萬使用者也得一個一個都發完,多程式?長連線?epoll? 能發多快,蘋果說了算

相關文章