泛談iOS 通知服務(wù)

APNs

說(shuō)起蘋果設(shè)備的push推送服務(wù)就要提到蘋果公司偉大的一個(gè)架構(gòu)設(shè)計(jì) APNs(Apple Push Notification Service)。蘋果設(shè)備收到的 push消息實(shí)際上是由APNs向設(shè)備推送的膝舅,并不是直接由開(kāi)發(fā)者向用戶本身推送消息谊迄。有了APNs開(kāi)發(fā)者需要做的只是將DeviceToken和消息內(nèi)容發(fā)送到APNs服務(wù)器,其它都是APNs服務(wù)器完成的豆励。具體過(guò)程如下:

APNs.png
Provider.png

Provider 是自己應(yīng)用服務(wù)器夺荒。

1.客戶端向蘋果公司注冊(cè)push證書(shū)。

2.APNs會(huì)給客戶端返回一個(gè)deviceToken 良蒸。

3.客戶端將deviceToken上傳給Provide技扼。

4.Provider將deviceToken和通知內(nèi)容發(fā)送給APNs。

5.APNs根據(jù)deviceToken查找指定的設(shè)備嫩痰,將通知推送給設(shè)備剿吻。

6.設(shè)備收到通知后根據(jù)SSL證書(shū)判斷這個(gè)push通知是發(fā)個(gè)那個(gè)應(yīng)用。

客戶端部署

更新到iOS 10 之后串纺,Xcode就不需要再兼容iOS 7 丽旅,然而iOS 8 的push系統(tǒng)還是跟iOS 10 不一樣的椰棘。這邊還是要做一下處理。

1.push證書(shū)生成

向蘋果公司注冊(cè)push證書(shū)魔招。在蘋果開(kāi)發(fā)者中心生成push證書(shū)并下載晰搀,將相關(guān)證書(shū)文件添加到Xcode中。

2.注冊(cè)通知

客戶端向系統(tǒng)注冊(cè)通知

- (void)registerPushNotification
{
    
#if !TARGET_IPHONE_SIMULATOR
    if (OSVersionIsAtLeastiOS10()) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if(granted & !error){
                [[UIApplication sharedApplication] registerForRemoteNotifications];
//                [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
//                    // todo 可以獲取用戶設(shè)定信息
//                }];
            }else{
                //點(diǎn)擊不允許
                DDLogWarn(@"User Close Notification.");
            }
        }];
    }else {
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    }
//    else{ // iOS 7
//        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
//    }
#else
    DDLogWarn(@"Simulator not support push");
#endif
}

3.devToken

向系統(tǒng)注冊(cè)通知办斑,請(qǐng)求成功之后會(huì)給客戶端返回devToken外恕,因?yàn)閐eviceToken 隨時(shí)會(huì)發(fā)生變化,每次啟動(dòng)App的時(shí)候都要請(qǐng)求一次乡翅。得到devToken 需要上傳到服務(wù)器Provider鳞疲。

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken
{
    DDLogInfo(@"application didRegisterForRemoteNotificationsWithDeviceToken : %@", devToken);
    // 上傳devToken
    [self doPushRegDeviceTask:devToken];
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err
{
    //注冊(cè)失敗
    DDLogError(@"application didFailToRegisterForRemoteNotificationsWithError : %@", err);
}

4.處理回調(diào)函數(shù)

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
   // 處理通知消息
}

第一次安裝App 有個(gè)彈框獲取用戶的許可是否允許接受App的通知,如果用戶選擇"不允許"蠕蚜,App是不會(huì)收到push通知尚洽。iOS 10 可以獲取用戶對(duì)"通知"操作信息,如果用戶不允許通知靶累,你可以在恰當(dāng)?shù)臅r(shí)機(jī)選擇通知用戶是否開(kāi)啟通知腺毫。想重新收到通知,用戶必須自己去設(shè)置->通知->App->允許通知.

蘋果公司對(duì)iOS10通知系統(tǒng)進(jìn)行了大重構(gòu)挣柬,豐富了push通知內(nèi)容了潮酒。
喵大 -- 活久見(jiàn)的重構(gòu)

信鴿

信鴿 是一款專業(yè)的移動(dòng)App推送平臺(tái),支持百億級(jí)的通知/消息推送邪蛔,秒級(jí)觸達(dá)移動(dòng)用戶急黎,現(xiàn)已全面支持Android和iOS兩大主流平臺(tái)。開(kāi)發(fā)者可以方便地通過(guò)嵌入SDK侧到,通過(guò)API調(diào)用或者Web端可視化操作勃教,實(shí)現(xiàn)對(duì)特定用戶推送,大幅提升用戶活躍度匠抗,有效喚醒沉睡用戶故源,并實(shí)時(shí)查看推送效果。如果不想自己搭建一個(gè)Provider服務(wù)器汞贸,找一個(gè)第三方的服務(wù)器信鴿還是不錯(cuò)的選擇心软,信鴿的接入也比較簡(jiǎn)單。

1.注冊(cè)信鴿

首先注冊(cè)信鴿著蛙,只要登錄QQ就可以,配置自己的應(yīng)用信息耳贬,關(guān)鍵是配置上傳push證書(shū)(iOS 證書(shū)設(shè)置指南)踏堡。獲取access_idaccess_key ,下載SDK 咒劲。

2.初始化信鴿

初始化信鴿顷蟆,這里就用到從官網(wǎng)獲取的access_idaccess_key需要注意的是用戶如果注銷的诫隅,再次使用信鴿還是需要重新注冊(cè)的。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    //.....
    // 信鴿初始化
    [XGPush startApp:kXGPush_Id appKey:kXGPush_Key];

    //設(shè)置設(shè)備的帳號(hào)
    // user_key : 本質(zhì)上是registerDevice的一個(gè)參數(shù)
    [XGPush setAccount:user_key]

    //注銷之后需要再次注冊(cè)前的準(zhǔn)備
    __weak typeof(self) weakSelf = self;
    void (^successCallback)(void) = ^(void){
        //如果變成需要注冊(cè)狀態(tài)
        if(![XGPush isUnRegisterStatus] ){
            [weakSelf registerPush];
        }
    };
    [XGPush initForReregister:successCallback];
    //[XGPush registerPush];  //注冊(cè)Push服務(wù)帐偎,注冊(cè)后才能收到推送
}

3.注冊(cè)通知 & devToken

這跟上面的操作步驟是一樣的逐纬,一樣要獲取到devToken上傳給信鴿。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString * deviceTokenStr = [XGPush registerDevice:deviceToken];
}

大致就是以上的步驟削樊,官方有提供詳細(xì)Demo 和SDK接入說(shuō)明豁生,感覺(jué)還是很詳細(xì),能幫大家解決大部分問(wèn)題漫贞。

Pusher

Pusher 這是一個(gè)開(kāi)源軟件甸箱,幫助測(cè)試通知的,只需要push證書(shū)和設(shè)備的devToken就可以模擬測(cè)試通知了迅脐。

keychain.png

Pusher.png
push.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芍殖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谴蔑,更是在濱河造成了極大的恐慌豌骏,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隐锭,死亡現(xiàn)場(chǎng)離奇詭異窃躲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)成榜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門框舔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人赎婚,你說(shuō)我怎么就攤上這事刘绣。” “怎么了挣输?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵纬凤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撩嚼,道長(zhǎng)停士,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任完丽,我火速辦了婚禮恋技,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逻族。我一直安慰自己蜻底,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布聘鳞。 她就那樣靜靜地躺著薄辅,像睡著了一般要拂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站楚,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天脱惰,我揣著相機(jī)與錄音,去河邊找鬼窿春。 笑死拉一,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谁尸。 我是一名探鬼主播舅踪,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼良蛮!你這毒婦竟也來(lái)了抽碌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤决瞳,失蹤者是張志新(化名)和其女友劉穎货徙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體皮胡,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痴颊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屡贺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢棱。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甩栈,靈堂內(nèi)的尸體忽然破棺而出泻仙,到底是詐尸還是另有隱情,我是刑警寧澤量没,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布玉转,位于F島的核電站,受9級(jí)特大地震影響殴蹄,放射性物質(zhì)發(fā)生泄漏究抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一袭灯、第九天 我趴在偏房一處隱蔽的房頂上張望刺下。 院中可真熱鬧,春花似錦稽荧、人聲如沸橘茉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捺癞。三九已至,卻和暖如春构挤,著一層夾襖步出監(jiān)牢的瞬間髓介,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工筋现, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唐础,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓矾飞,卻偏偏與公主長(zhǎng)得像一膨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洒沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 極光推送: 1.JPush當(dāng)前版本是1.8.2豹绪,其SDK的開(kāi)發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,696評(píng)論 10 16
  • 概述 在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài)申眼,如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過(guò)通知...
    莫離_焱閱讀 6,493評(píng)論 1 8
  • @(〓〓 iOS-實(shí)用技術(shù))[遠(yuǎn)程/本地推送] 作者: Liwx 郵箱: 1032282633@qq.com 目...
    Liwx閱讀 5,099評(píng)論 8 67
  • 推送通知注意:這里說(shuō)的推送通知跟NSNotification有所區(qū)別NSNotification是抽象的瞒津,不可見(jiàn)的...
    醉葉惜秋閱讀 1,504評(píng)論 0 3
  • 愛(ài)情自古以來(lái)都是文人墨客鐘愛(ài)的題材,在如今歌曲括尸、影視劇中巷蚪,愛(ài)情也成為了不可或缺的元素,可實(shí)際上濒翻,談戀愛(ài)既不像歌曲中...
    魚(yú)小婧閱讀 570評(píng)論 29 7