原文地址:原文地址
研究了一下Apple Push Notification Service,實(shí)現(xiàn)很簡單,很環(huán)保.原理如下:
財(cái)大氣粗的蘋果提供了一堆服務(wù)器,每個(gè)ios設(shè)備和這些服務(wù)器保持了一個(gè)長連接,ios版本更新提示,手機(jī)時(shí)鐘校準(zhǔn)什么的都是通過這個(gè)連接.
蘋果把這個(gè)長連接開放出來給大家推送消息用,很積德,因?yàn)檫@是個(gè)全球服務(wù),幾十億臺(tái)ios設(shè)備,服務(wù)器少說也需要上萬臺(tái),還沒有錢可以賺. andorid的爸爸就不做這個(gè),于是各個(gè)app為了發(fā)消息,只能直接拼命賴在后臺(tái)維持一個(gè)長連接,電就是這樣被耗光的
蘋果提供消息服務(wù)簡稱為APNS,只是是長連接機(jī)器的一部分,你要向你的用戶發(fā)消息,必須通過apns中轉(zhuǎn),你寫程序發(fā)給它,它轉(zhuǎn)發(fā)給你的手機(jī),你的推送程序和用戶手機(jī)沒有直接聯(lián)系
消息推送不支持群發(fā),只能一個(gè)一個(gè)發(fā).如果你的App有100萬個(gè)用戶,要發(fā)消息怎么辦? 一個(gè)一個(gè)的發(fā)唄,發(fā)100萬次.消息包大概包括兩部分:標(biāo)示用戶手機(jī)的id(32個(gè)字節(jié))+消息體(<=256Bytes),消息體是json字符串,傳輸過程用ssl加密的
標(biāo)示用戶手機(jī)的ID 叫做 device tokens,每個(gè)手機(jī)都不一樣,deviceToken非常重要
推送流程:
- 首先是應(yīng)用程序注冊消息推送哼御。
- IOS跟APNS Server要deviceToken讽坏。應(yīng)用程序接受deviceToken昌腰。
- 應(yīng)用程序?qū)eviceToken發(fā)送給PUSH服務(wù)端程序(Provider)竹挡。
- 服務(wù)端程序向APNS服務(wù)發(fā)送消息做入。
- APNS服務(wù)將消息發(fā)送給iPhone應(yīng)用程序。
device tokens
device tokens每個(gè)機(jī)器都不一樣,比較獨(dú)一無二,但絕不是硬件碼,如果你重裝了ios系統(tǒng),可能會(huì)發(fā)生變化.其實(shí) device tokens 也是用戶的手機(jī)發(fā)起請(qǐng)求,由apns生成的,可以相信,apns后臺(tái)有一個(gè)key-value數(shù)據(jù)庫.
獲取device tokens 很簡單,只需要實(shí)現(xiàn)下面這個(gè)函數(shù)
(void)application:(UIApplication)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData)deviceToken
在這個(gè)函數(shù)里面,你把deviceToken保存到你服務(wù)器上即可,這個(gè)函數(shù)是個(gè)call back函數(shù),ios從apns得到deviceToken,就傳給它,你需要做的,寫一段保存 這個(gè)token的代碼注意:蘋果沒有承諾deviceToken的生成機(jī)制,隨時(shí)可能變化,最好的方法是你第一次獲取到deviceToken之后,也提交,然后存在本地,之后每次都比較,發(fā)現(xiàn)有變化,就更新你的服務(wù)器上的記錄
app支持推送的技術(shù)實(shí)現(xiàn)
要實(shí)現(xiàn)推送功能,你需要干如下幾件事情:
你需要寫3段程序
到蘋果開發(fā)者中心注冊一次,并下載一份cer文件
從蘋果的Provisioning Portal,填寫并下載一個(gè)Provisioning Profile
先說2,3兩點(diǎn)
- 下載cer文件,是推送程序要用,因?yàn)橐ㄟ^ssl信道發(fā)送數(shù)據(jù)
- 填寫并下載Provisioning Profile,并從xcode加入到你的app項(xiàng)目文件中,你可以理解為辦手續(xù),總不能無證亂發(fā)吧
需要寫的3段程序分別是
前文提到的保存device token的代碼,很簡單的,隨便搭個(gè)http服務(wù),用mysql建個(gè)表,你在app里面用http post提交就行
第二段程序是:你的app必須做個(gè)標(biāo)記,告訴ios,你會(huì)給用戶產(chǎn)生推送消息,這個(gè)代碼很簡單,一句話搞定
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)];
加在app初始化函數(shù)里面即可
- 最后是:推送程序,這個(gè)代碼量可能最多.邏輯很簡單:遍歷你的存放devictTokent的數(shù)據(jù)表,逐一發(fā)消息給蘋果的APNS服務(wù)器.推送程序,有很多開源代碼,用APNS為關(guān)鍵詞,一搜一大把,各種語言都有,改改就能用
蘋APNS服務(wù)器地址:gateway.push.apple.com,端口是 2195
以前看到有人吹噓自己100萬用戶規(guī)模消息推送,這個(gè)有技術(shù)含量么? 就是1000萬用戶也得一個(gè)一個(gè)都發(fā)完,多進(jìn)程?長連接?epoll? 能發(fā)多快,蘋果說了算