iOS 遠(yuǎn)程推送

iOS遠(yuǎn)程推送主要流程為:注冊(cè)推送的token肴甸,把token上傳到服務(wù)器->接收到服務(wù)器的推送->處理推送。
注冊(cè)token時(shí)囚巴,需要用戶同意授權(quán)進(jìn)行推送原在,否則不能獲取token,則推送功能無(wú)法實(shí)現(xiàn)彤叉。
遠(yuǎn)程推送的框架在iOS10之后有更新庶柿,因此如果要兼容iOS10之前的系統(tǒng),則需要進(jìn)行判斷系統(tǒng)版本秽浇。

1浮庐、注冊(cè)推送的token并上傳

首先打開(kāi)項(xiàng)目的推送功能,如下圖:


圖片.png

然后實(shí)現(xiàn)注冊(cè)token的方法柬焕,代碼如下:

//iOS10之后需要引入新框架
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif

- (void)replyPushNotificationAuthorization:(UIApplication *)application{
    
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
        //iOS 10 later
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        //必須寫代理审残,不然無(wú)法監(jiān)聽(tīng)通知的接收與點(diǎn)擊事件
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error && granted) {
                //用戶點(diǎn)擊允許
                NSLog(@"PushNotification====注冊(cè)成功");
            }else{
                //用戶點(diǎn)擊不允許
                NSLog(@"PushNotification====注冊(cè)失敗");
            }
        }];
        
        //獲取通知注冊(cè)狀態(tài)
        //        [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
        //            NSLog(@"PushNotification====%@",settings);
        //        }];
    }else if ([[UIDevice currentDevice].systemVersion floatValue] >8.0){
        //iOS 8 - iOS 9系統(tǒng)
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }
    //注冊(cè)遠(yuǎn)端消息通知獲取device token
    [application registerForRemoteNotifications];
}

我們?nèi)缓笤贏ppDelegate里面實(shí)現(xiàn)兩個(gè)代理方法,在第一次申請(qǐng)token時(shí)斑举,需要取得用戶的同意搅轿,會(huì)彈出推送權(quán)限申請(qǐng)對(duì)話框,當(dāng)用戶同意后會(huì)調(diào)用token申請(qǐng)成功的代理方法富玷,當(dāng)用戶拒絕后會(huì)調(diào)用token申請(qǐng)失敗的方法璧坟。代碼如下:

#pragma mark - 授權(quán)申請(qǐng)token回調(diào)
//token獲取成功
- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSData  *apnsToken = [NSData dataWithData:deviceToken];
    
    NSString *tokenString = [self getHexStringForData:apnsToken];
    NSLog(@"My token = %@", tokenString);
    
}

- (NSString *)getHexStringForData:(NSData *)data {
    NSUInteger length = [data length];
    char *chars = (char *)[data bytes];
    NSMutableString *hexString = [[NSMutableString alloc] init];
    for (NSUInteger i = 0; i < length; i++) {
        [hexString appendString:[NSString stringWithFormat:@"%0.2hhx", chars[i]]];
    }
    return hexString;
}
//token獲取失敗
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}

當(dāng)我們token獲取成功后没宾,把token上傳到服務(wù)器,服務(wù)器即可根據(jù)token及相關(guān)參數(shù)可以進(jìn)行推送沸柔。上傳根據(jù)自己的后臺(tái)服務(wù)器接口進(jìn)行上傳即可。

2铲敛、接收到推送及處理

接收到推送時(shí)的情況有幾種褐澎,如下:
APP在沒(méi)有啟動(dòng)及在后臺(tái)的情況下收到推送,此時(shí)會(huì)在通知欄進(jìn)行顯示伐蒋;
APP在前臺(tái)收到推送工三,此時(shí)會(huì)調(diào)用收到推送的方法,是否顯示由代碼決定先鱼。
當(dāng)用戶點(diǎn)擊推送時(shí)俭正,我們也需要進(jìn)行處理,此時(shí)調(diào)用的代理方法也有區(qū)別焙畔,處理推送的流程如下圖(對(duì)應(yīng)推送的處理掸读,我們也需要區(qū)分iOS10及iOS10之前的系統(tǒng)):


圖片.png

我們?cè)贏ppDelegate實(shí)現(xiàn)相關(guān)代理方法,即可處理相應(yīng)的推送宏多,代碼如下:

#pragma mark - function 1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self replyPushNotificationAuthorization:application];
    NSLog(@"launchOptions == %@",launchOptions);
    return YES;
}

#pragma mark - function 2 iOS 10之前以前的用戶
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"push notification did receive remote notification:%@", userInfo);
    completionHandler(UIBackgroundFetchResultNewData);
}

#pragma mark - function 3 iOS10及以后的用戶
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    NSLog(@"push notification did receive remote notification:%@",notification.request.content.userInfo);
    // 需要執(zhí)行這個(gè)方法儿惫,選擇是否提醒用戶,有Badge伸但、Sound肾请、Alert三種類型可以設(shè)置,決定是否再顯示此通知來(lái)提醒用戶
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}

#pragma mark - function 4 iOS10及以后的用戶
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler {
    NSLog(@"push notification did receive remote notification:%@",response.notification.request.content.userInfo);
  completionHandler();
}

對(duì)于接收到的推送處理完畢后,一個(gè)推送就形成了閉合更胖,完成了它的使命铛铁。
Demo地址:https://github.com/XMSECODE/ESCPushNotificationDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市却妨,隨后出現(xiàn)的幾起案子饵逐,更是在濱河造成了極大的恐慌,老刑警劉巖管呵,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梳毙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捐下,警方通過(guò)查閱死者的電腦和手機(jī)账锹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坷襟,“玉大人奸柬,你說(shuō)我怎么就攤上這事∮こ蹋” “怎么了廓奕?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我桌粉,道長(zhǎng)蒸绩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任铃肯,我火速辦了婚禮患亿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘押逼。我一直安慰自己步藕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布挑格。 她就那樣靜靜地躺著咙冗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漂彤。 梳的紋絲不亂的頭發(fā)上雾消,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音显歧,去河邊找鬼仪或。 笑死,一個(gè)胖子當(dāng)著我的面吹牛士骤,可吹牛的內(nèi)容都是我干的范删。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拷肌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼到旦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起巨缘,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤添忘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后若锁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體搁骑,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年又固,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仲器。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仰冠,死狀恐怖乏冀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洋只,我是刑警寧澤辆沦,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布昼捍,位于F島的核電站,受9級(jí)特大地震影響肢扯,放射性物質(zhì)發(fā)生泄漏妒茬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一蔚晨、第九天 我趴在偏房一處隱蔽的房頂上張望郊闯。 院中可真熱鬧,春花似錦蛛株、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至熬丧,卻和暖如春笋粟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背析蝴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工害捕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷畸。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓尝盼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親佑菩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盾沫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 引言:iOS開(kāi)發(fā),推送可以說(shuō)是必須的殿漠,但是之前對(duì)于推送總是概念模糊赴精,最近借公司項(xiàng)目需求,深入了解了一下绞幌±儆矗“對(duì)于知識(shí)...
    ibabyblue閱讀 1,335評(píng)論 36 8
  • 轉(zhuǎn)載請(qǐng)聯(lián)系作者獲取授權(quán),并標(biāo)明文章作者莲蜘,謝謝! 大家好谭确,之前的文章講過(guò)了APNs推送的原理。推送開(kāi)發(fā)證書和發(fā)布證書...
    OliviaZqy閱讀 2,136評(píng)論 0 8
  • 基本原理 iOS推送分為L(zhǎng)ocal Notifications(本地推送) 和 Remote Notificati...
    小小球員閱讀 1,825評(píng)論 1 1
  • 概念相關(guān) 1.什么是遠(yuǎn)程推送通知菇夸? 顧名思義琼富,就是從遠(yuǎn)程服務(wù)器推送給客戶端的通知(需要聯(lián)網(wǎng)) 遠(yuǎn)程推送服務(wù),又稱為...
    我是滕先生閱讀 3,699評(píng)論 9 44
  • Notification 歷史和現(xiàn)狀 前言 蘋果在 iOS 10 中添加了新的框架:UserNotificatio...
    靈度Ling閱讀 9,138評(píng)論 4 24