iOS推送機(jī)制

原文地址:原文地址

研究了一下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非常重要

推送流程:

image
  1. 首先是應(yīng)用程序注冊消息推送哼御。
  2. IOS跟APNS Server要deviceToken讽坏。應(yīng)用程序接受deviceToken昌腰。
  3. 應(yīng)用程序?qū)eviceToken發(fā)送給PUSH服務(wù)端程序(Provider)竹挡。
  4. 服務(wù)端程序向APNS服務(wù)發(fā)送消息做入。
  5. 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)推送功能,你需要干如下幾件事情:

  1. 你需要寫3段程序

  2. 到蘋果開發(fā)者中心注冊一次,并下載一份cer文件

  3. 從蘋果的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ā)多快,蘋果說了算

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曹步,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌休讳,老刑警劉巖讲婚,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俊柔,居然都是意外死亡筹麸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門雏婶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來物赶,“玉大人,你說我怎么就攤上這事留晚〗妥希” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵错维,是天一觀的道長奖地。 經(jīng)常有香客問我,道長赋焕,這世上最難降的妖魔是什么鹉动? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宏邮,結(jié)果婚禮上泽示,老公的妹妹穿的比我還像新娘。我一直安慰自己蜜氨,他們只是感情好械筛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飒炎,像睡著了一般埋哟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郎汪,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天赤赊,我揣著相機(jī)與錄音,去河邊找鬼煞赢。 笑死抛计,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的照筑。 我是一名探鬼主播吹截,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瘦陈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了波俄?” 一聲冷哼從身側(cè)響起晨逝,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎懦铺,沒想到半個(gè)月后捉貌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冬念,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年昏翰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刘急。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棚菊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叔汁,到底是詐尸還是另有隱情统求,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布据块,位于F島的核電站码邻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏另假。R本人自食惡果不足惜像屋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望边篮。 院中可真熱鬧己莺,春花似錦、人聲如沸戈轿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽思杯。三九已至胜蛉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間色乾,已是汗流浹背誊册。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暖璧,地道東北人案怯。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像漆撞,于是被迫代替她去往敵國和親殴泰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 極光推送: 1.JPush當(dāng)前版本是1.8.2浮驳,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐悍汛,SD...
    Isspace閱讀 6,696評(píng)論 10 16
  • APNS的推送機(jī)制 APNS apple push notification Service的縮寫 自己應(yīng)用程序...
    HanYuChen閱讀 287評(píng)論 0 0
  • 概述 在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài),如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,493評(píng)論 1 8
  • 前言 我們在實(shí)現(xiàn)推送功能的時(shí)候至会,更需要了解下推送的原理機(jī)制离咐,這樣我們在發(fā)現(xiàn)問題時(shí)候才好定位到問題的解決辦法。 推送...
    進(jìn)無盡閱讀 3,833評(píng)論 0 5
  • 注:此文只現(xiàn)在已經(jīng)不能適配iOS10了奉件,iOS10推送采用了新的方法宵蛀,做iOS9及以下的系統(tǒng)可讀此篇文章。 最近公...
    TIME_for閱讀 33,248評(píng)論 85 322