iOS 淺析消息推送

一直都有用推送梯码,但一直以來(lái)都只是知道怎么處理具體的原理、實(shí)現(xiàn)流程就不是很清楚好啰,最近有時(shí)間轩娶,就具體學(xué)習(xí)了一下,分享給大家框往,希望看完我的這篇文章鳄抒,對(duì)大家有所幫助。

APNS的推送機(jī)制

0.jpg

這里 Provider 是指某個(gè)應(yīng)用的Developer椰弊,當(dāng)然如果開發(fā)者使用極光的服務(wù)许溅,那么這里的Provider就是極光的推送服務(wù)程序了。上圖可以分為三步:
第一步:極光推送服務(wù)程序把要發(fā)送的消息秉版、目的設(shè)備的唯一標(biāo)識(shí)打包贤重,發(fā)給APNs。
第二步:APNs在自身的已注冊(cè)Push服務(wù)的應(yīng)用列表中清焕,查找有相應(yīng)標(biāo)識(shí)的設(shè)備并蝗,并把消息發(fā)送到設(shè)備。
第三步:iOS系統(tǒng)把發(fā)來(lái)的消息傳遞給相應(yīng)的應(yīng)用程序秸妥,并且按照設(shè)定彈出Push通知

1.jpg

從上圖我們可以看到滚停。
1、首先是應(yīng)用程序注冊(cè)消息推送粥惧。
2键畴、 IOS跟APNS Server要deviceToken。應(yīng)用程序接受deviceToken突雪。
3起惕、應(yīng)用程序?qū)eviceToken發(fā)送給PUSH服務(wù)端程序。
4咏删、 服務(wù)端程序向APNS服務(wù)發(fā)送消息疤祭。
5、APNS服務(wù)將消息發(fā)送給iPhone應(yīng)用程序饵婆。
代碼里面如何實(shí)現(xiàn)推送

首先,我們要獲取DeviceToken。

App需要每次啟動(dòng)的時(shí)候都去注冊(cè)遠(yuǎn)程通知——通過(guò)調(diào)用UIApplication的registerForRemoteNotificationTypes:方法侨核,傳遞給它你希望支持的消息類型參數(shù)即可草穆,例如:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // do some initiale working
    ...
    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
    return YES;
}

如果注冊(cè)成功,APNs會(huì)返回給你設(shè)備的token搓译,iOS系統(tǒng)會(huì)把它傳遞給app delegate代理——application:didRegisterForRemoteNotificationsWithDeviceToken:方法悲柱,你應(yīng)該在這個(gè)方法里面把token保存到極光后臺(tái),例如:

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"Receive DeviceToken: %@", deviceToken);
    [JPUSHService registerDeviceToken:deviceToken];
}

如果注冊(cè)失敗些己,application:didFailToRegisterForRemoteNotificationsWithError:方法會(huì)被調(diào)用豌鸡,通過(guò)NSError參數(shù)你可以看到具體的出錯(cuò)信息,例如:

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"注冊(cè)失敗段标,無(wú)法獲取設(shè)備ID, 具體錯(cuò)誤: %@", error);
}

請(qǐng)注意涯冠,注冊(cè)流程需要在app每次啟動(dòng)時(shí)調(diào)用,這并不不會(huì)帶來(lái)額外的負(fù)擔(dān)逼庞,因?yàn)閕OS操作系統(tǒng)在第一次獲得了有效的device token之后蛇更,會(huì)本地緩存起來(lái),以后app再調(diào)用registerForRemoteNotificationTypes:的時(shí)候會(huì)立刻返回赛糟,并不會(huì)再進(jìn)行網(wǎng)絡(luò)請(qǐng)求派任。另外,app層面不應(yīng)該對(duì)device token進(jìn)行緩存璧南,因?yàn)閐evice token也有可能變化——如果用戶重裝了操作系統(tǒng)掌逛,那么APNs再次給出的device token就會(huì)和之前的不一樣,又或者是司倚,用戶restore了原來(lái)的backup到新的設(shè)備上豆混,那么原來(lái)的device token也會(huì)失效。

其次对湃,我們要處理收到消息之后的回調(diào)

我們可以設(shè)想一下消息通知的幾種使用場(chǎng)景:
1崖叫,在app沒(méi)有被啟動(dòng)的時(shí)候,接收到了消息通知拍柒。這時(shí)候操作系統(tǒng)會(huì)按照默認(rèn)的方式來(lái)展現(xiàn)一個(gè)alert消息心傀,在app icon上標(biāo)記一個(gè)數(shù)字,甚至播放一段聲音拆讯。
2脂男,用戶看到消息之后,點(diǎn)擊了一下action按鈕或者點(diǎn)擊了應(yīng)用圖標(biāo)
如果action按鈕被點(diǎn)擊了种呐,系統(tǒng)會(huì)通過(guò)調(diào)用application:didFinishLaunchingWithOptions:這個(gè)代理方法來(lái)啟動(dòng)應(yīng)用宰翅,并且會(huì)把notification的payload數(shù)據(jù)傳遞進(jìn)去。
如果應(yīng)用圖標(biāo)被點(diǎn)擊了爽室,系統(tǒng)也一樣會(huì)調(diào)用application:didFinishLaunchingWithOptions:這個(gè)代理方法來(lái)啟動(dòng)應(yīng)用汁讼,唯一不同的是這時(shí)候啟動(dòng)參數(shù)里面不會(huì)有任何notification的信息。
3,如果遠(yuǎn)程消息發(fā)送過(guò)來(lái)的時(shí)候嘿架,app正在運(yùn)行瓶珊,這時(shí)候會(huì)發(fā)生什么呢?
app代理的application:didReceiveRemoteNotification:方法會(huì)被調(diào)用耸彪,同時(shí)遠(yuǎn)程消息中的payload數(shù)據(jù)會(huì)作為參數(shù)傳遞進(jìn)去伞芹。
示例代碼如下:

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
MyAlertShow(@"(UIBackgroundFetchResult))completionHandler", @"6666");
    
    NSLog(@"(UIBackgroundFetchResult))completionHandler");
    
     [MyRemoteNoticeMangeZH dealWithRemoteDic:userInfo];
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝉娜,隨后出現(xiàn)的幾起案子唱较,更是在濱河造成了極大的恐慌,老刑警劉巖召川,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件南缓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扮宠,警方通過(guò)查閱死者的電腦和手機(jī)西乖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坛增,“玉大人获雕,你說(shuō)我怎么就攤上這事∈盏罚” “怎么了届案?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罢艾。 經(jīng)常有香客問(wèn)我楣颠,道長(zhǎng),這世上最難降的妖魔是什么咐蚯? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任童漩,我火速辦了婚禮,結(jié)果婚禮上春锋,老公的妹妹穿的比我還像新娘矫膨。我一直安慰自己,他們只是感情好期奔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布侧馅。 她就那樣靜靜地躺著,像睡著了一般呐萌。 火紅的嫁衣襯著肌膚如雪馁痴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天肺孤,我揣著相機(jī)與錄音罗晕,去河邊找鬼济欢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛攀例,可吹牛的內(nèi)容都是我干的船逮。 我是一名探鬼主播粤铭,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锨络,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤是钥,失蹤者是張志新(化名)和其女友劉穎悄泥,沒(méi)想到半個(gè)月后厨相,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祝蝠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朋贬。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糠亩,死狀恐怖沟娱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情济似,我是刑警寧澤矫废,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站砰蠢,受9級(jí)特大地震影響蓖扑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜台舱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一律杠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竞惋,春花似錦柜去、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浑厚,卻和暖如春股耽,著一層夾襖步出監(jiān)牢的瞬間根盒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工物蝙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炎滞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓诬乞,卻偏偏與公主長(zhǎng)得像册赛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丽惭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 概述 在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài)击奶,如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過(guò)通知...
    莫離_焱閱讀 6,512評(píng)論 1 8
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐责掏,SD...
    Isspace閱讀 6,719評(píng)論 10 16
  • 和本地通知不同,推送通知(遠(yuǎn)程推送)是由應(yīng)用服務(wù)提供商發(fā)起的湃望,通過(guò)蘋果的APNs(Apple Push Notif...
    AYuan_閱讀 1,141評(píng)論 0 1
  • 來(lái)源:崔江濤的博客 概述在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài)换衬,如果其他應(yīng)用此刻發(fā)生了一些用戶感...
    李棲桐閱讀 924評(píng)論 0 0
  • 想了解NSOperation與GCD的區(qū)別可參考iOS多線程之NSOperation及簡(jiǎn)單練習(xí) 文章內(nèi)容較長(zhǎng),介紹...
    肥貓記閱讀 1,187評(píng)論 0 17