最清晰的ios消息推送機制教程

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

  • 財大氣粗的蘋果提供了一堆服務器,每一個ios設備和這些服務器保持了一個長鏈接,ios版本更新提示,手機時鐘校準什麼的都是經過這個鏈接.ios

  • 蘋果把這個長鏈接開放出來給你們推送消息用,很積德,由於這是個全球服務,幾十億臺ios設備,服務器少說也須要上萬臺,尚未錢能夠賺. andorid的爸爸就不作這個,因而各個app爲了發消息,只能直接拼命賴在後臺維持一個長鏈接,電就是這樣被耗光的sql

  • 蘋果提供消息服務簡稱爲APNS,只是是長鏈接機器的一部分,你要向你的用戶發消息,必須經過apns中轉,你寫程序發給它,它轉發給你的手機,你的推送程序和用戶手機沒有直接聯繫數據庫

  • 消息推送不支持羣發,只能一個一個發.若是你的App有100萬個用戶,要發消息怎麼辦? 一個一個的發唄,發100萬次.消息包大概包括兩部分:標示用戶手機的id(32個字節)+消息體(<=256Bytes),消息體是json字符串,傳輸過程用ssl加密的json

  • 標示用戶手機的ID 叫作 device tokens,每一個手機都不同,deviceToken很是重要xcode

device tokens

device tokens每一個機器都不同,比較獨一無二,可是不是硬件碼,若是你重裝了ios系統,可能會發生變化.其實 device tokens 也是用戶的手機發起請求,由apns生成的,能夠相信,apns後臺有一個key-value數據庫.服務器

獲取device tokens 很簡單,只須要實現下面這個函數app

(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken函數

在這個函數裏面,你把deviceToken保存到你服務器上便可,這個函數是個call back函數,ios從apns獲得deviceToken,就傳給它,你須要作的,寫一段保存 這個token的代碼post

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

app支持推送的技術實現

要實現推送功能,你須要幹以下幾件事情

  1. 你須要寫3段程序

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

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

先說2,3兩點

  • 下載cer文件,是推送程序要用,由於要經過ssl信道發送數據

  • 填寫並下載Provisioning Profile,並從xcode加入到你的app項目文件中,你能夠理解爲辦手續,總不能無證亂髮吧,

須要寫的3段程序分別是

  1. 前文提到的保存device token的代碼,很簡單的,隨便搭個http服務,用mysql建個表,你在app裏面用http post提交就行

  2. 第二段程序是:你的app必須作個標記,告訴ios,你會給用戶產生推送消息,這個代碼很簡單,一句話搞定

     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

    加在app初始化函數裏面便可


  3. 最後是:推送程序,這個代碼量可能最多.邏輯很簡單:遍歷你的存放devictTokent的數據表,逐一發消息給蘋果的APNS服務器.推送程序,有不少開源代碼,用APNS爲關鍵詞,一搜一大把,各類語言都有,改改就能用

蘋APNS服務器地址:gateway.push.apple.com,端口是 2195

之前看到有人吹噓本身100萬用戶規模消息推送,這個有技術含量麼? 就是1000萬用戶也得一個一個都發完,多進程?長鏈接?epoll? 能發多快,蘋果說了算

相關文章
相關標籤/搜索