iOS推送那點(diǎn)事兒

我感覺(jué)我是幸運(yùn)的,因?yàn)楫?dāng)我準(zhǔn)備調(diào)研推送和webview的時(shí)候娩怎,蘋(píng)果爸爸已經(jīng)對(duì)他們進(jìn)行觸及靈魂的改造了搔课,我自然可以靠著大樹(shù)乘涼,直接入手iOS新版本的推送和iOS8出道的WKWebview截亦。扯皮了這么多爬泥,是時(shí)候展現(xiàn)真正的技術(shù)了柬讨!

       --------------------------前方蘭博紅溫預(yù)警------------------------

本文是iOS推送系列的第一篇,主要講一下實(shí)現(xiàn)推送功能之前的準(zhǔn)備工作袍啡,以及前期的推送注冊(cè)踩官,后續(xù)將會(huì)更新更多關(guān)于iOS10推送的新鮮內(nèi)容。

iOS10的推送相比較之前的來(lái)說(shuō)葬馋,真的可以用脫胎換骨來(lái)形容卖鲤,新增了UserNotifications Framework,但使用起來(lái)其實(shí)很簡(jiǎn)單畴嘶。

一、戰(zhàn)前準(zhǔn)備

1.你必須要有1個(gè)development證書(shū)集晚,如果要發(fā)布當(dāng)然還要有一個(gè)distribution證書(shū)窗悯;
2.你必須要打開(kāi)工程里的推送開(kāi)關(guān),不打開(kāi)則一切皆為虛空偷拔。蒋院。。

Push Notifications

3.你可能還需要打開(kāi)Background Modes里的Romote notification莲绰,雖然作者現(xiàn)在還有搞清這東西有軟用欺旧,還忘知道的同志留言分享。
Reomote notification

4.閱讀蘋(píng)果爸爸給孩子們寫(xiě)的信---官方文檔蛤签,既能提升文檔閱讀能力辞友,還能加深對(duì)框架的理解,順便把英語(yǔ)給學(xué)了震肮,穩(wěn)賺不賠的買(mǎi)賣(mài)称龙。其實(shí)看文檔,寫(xiě)文檔是一個(gè)開(kāi)發(fā)人員行走江湖的必備技能戳晌。

二鲫尊、iOS10前后的推送注冊(cè)

(附贈(zèng)兩個(gè)三方推送注冊(cè))

#import <UserNotifications/UserNotifications.h>

@interface AppDelegate () <UNUserNotificationCenterDelegate>

@end

/* 判斷機(jī)型 */
// 建議宏和一些常用參數(shù)都添加到項(xiàng)目的config文件中
#define isiOS10                       ([[[UIDevice currentDevice]systemVersion]floatValue] >=  10.0)
#define isiOS7                          ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0)
#define isiOS8                          ([[[UIDevice currentDevice]systemVersion]floatValue] >= 8.0)
#define isiOS7_1                        ([[[UIDevice currentDevice]systemVersion]floatValue] >  7.0)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 1.系統(tǒng)通知
   // 推送注冊(cè),分為iOS10之后和之前
    if (ISIOS10) {
        // iOS10使用以下方法注冊(cè)沦偎,才能得到授權(quán)
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        UNAuthorizationOptions types10 = UNAuthorizationOptionBadge | UNAuthorizationOptionAlert | UNAuthorizationOptionSound;
        [center requestAuthorizationWithOptions:types10 completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error) { // 獲取通知授權(quán)成功
                NSLog(@"Request UNUserNofication authorization succeeded.");
                if (granted) { // 點(diǎn)擊允許,這里可以添加一些自己的邏輯
                    NSLog(@"用戶允許通知");
                } else { // 點(diǎn)擊不允許,這里可以添加一些自己的邏輯
                    NSLog(@"用戶不允許通知");
                }
                
                // (2)獲取當(dāng)前通知疫向,  UNNotificationSetting只是讀對(duì)象,不能修改豪嚎,只能通過(guò)以下方法獲取
                [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                    // 此處查看并設(shè)置通知相關(guān)信息
                }];
            } else {
                NSLog(@"Request UNUserNofication authorization failed.");
            }
        }];
    }
    
    //iOS8系統(tǒng)以下
    else if (isiOS8){
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];
    }
    
    // iOS8系統(tǒng)以下
    else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
    }
    
    // 遠(yuǎn)程推送注冊(cè)-必須加的一個(gè)方法搔驼!
    [[UIApplication sharedApplication] registerForRemoteNotifications];
        
    // 2.UMPush
    // (1)UM推送初始化
    [UMessage startWithAppkey:UMAppKey launchOptions:launchOptions];
    
    // (2)UM通知注冊(cè)
    [UMessage registerForRemoteNotifications];
    
    // (3)UM日志
    [UMessage setLogEnabled:YES];

    // 3.用友有信
    // (1)有信IM相關(guān)設(shè)置
    [[YYIMChat sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
    
    // (2)注冊(cè)app
    [[YYIMChat sharedInstance] registerApp:YYAPPIDNew etpKey:@"cidtech"];
    
    // (3)注冊(cè)多方通話
    [[YYIMChat sharedInstance].chatManager registerDuduWithAccountIdentify:@"" appkeyTemp:@""];
    
    // (4)添加代理
    [[YYIMChat sharedInstance].chatManager addDelegate:self];
    
    // (5)注冊(cè)token代理
    [[YYIMChat sharedInstance].chatManager registerTokenDelegate:self];
    
    // (6)設(shè)置日志級(jí)別
    [[YYIMChat sharedInstance] setLogLevel:YYIM_LOG_LEVEL_VERBOSE];
    
    // (7)本地推送
    [[YYIMChat sharedInstance].chatManager setEnableLocalNotification:YES];
    
    // (8)注冊(cè)推送證書(shū)
#if defined(DEBUG) && DEBUG
    [[YYIMChat sharedInstance] registerApnsCerName:@"你的開(kāi)發(fā)push證書(shū)"];
#else
    [[YYIMChat sharedInstance] registerApnsCerName:@"你的生產(chǎn)push證書(shū)"];
#endif
    
    // (9)設(shè)置高德地圖key,參見(jiàn)高德地圖官網(wǎng)(有信IM內(nèi)置的發(fā)送位置功能需要集成高德地圖API)
    [MAMapServices sharedServices].apiKey = kYYMapKey;
    }
    
/** 獲取deviceToken 存儲(chǔ)本地以及相關(guān)注冊(cè) */
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
    // 1.有信IM推送注冊(cè)
    [[YYIMChat sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
    
    // 2.有盟U-Push推送注冊(cè)
    [UMessage registerDeviceToken:deviceToken];
    
    // 3.deviceToken存儲(chǔ)
    NSString *deviceTokenAppend = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
                                    stringByReplacingOccurrencesOfString: @">" withString: @""]
                                   stringByReplacingOccurrencesOfString: @" " withString: @""];
    [[NSUserDefaults standardUserDefaults] setObject:deviceTokenAppend forKey:DEVICETOKEN];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"deviceToken-------%@",deviceTokenAppend);
}

 // iOS10以下系統(tǒng)
    else {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }
}    
    // 遠(yuǎn)程推送注冊(cè)-必須加的一個(gè)方法疙渣!
    [[UIApplication sharedApplication] registerForRemoteNotifications];

/** iOS10以下-接收到遠(yuǎn)程通知 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [self.rootVC.tabBarView selectWithIndex:0];
    [self.rootVC selectViewControllerWithIndex:0];
    [[YYIMChat sharedInstance] application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
    [[NSNotificationCenter defaultCenter] postNotificationName:VERIFYNOTIFICATION_REMOTE object:userInfo];
}


/** iOS10以下-接收到本地通知 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    [[YYIMChat sharedInstance] application:application didReceiveLocalNotification:notification];
}

// iOS10新增:處理前臺(tái)收到通知的代理方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        //應(yīng)用處于前臺(tái)時(shí)的遠(yuǎn)程推送接受
        //關(guān)閉友盟自帶的彈出框
        [UMessage setAutoAlert:NO];
        //必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
        
    } else {
        //應(yīng)用處于前臺(tái)時(shí)的本地推送接受
    }
    //當(dāng)應(yīng)用處于前臺(tái)時(shí)提示設(shè)置匙奴,需要哪個(gè)可以設(shè)置哪一個(gè)
    completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

// iOS10新增:處理后臺(tái)點(diǎn)擊通知的代理方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        // 必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
        
        // 應(yīng)用處于后臺(tái)時(shí)的遠(yuǎn)程推送接受
        
    } else {
        // 應(yīng)用處于后臺(tái)時(shí)的本地推送接受
    }
}

以上是iOS10以及之前版本推送和三方推送有盟推送、用友推送的注冊(cè)妄荔,下面我們就來(lái)看看iOS10推送真正令人驚艷的地方

三泼菌、真正令人激動(dòng)的功能

iOS10之前的推送是這樣的

iOS10前的推送

iOS10之后的推送是這樣的

iOS10后的推送

還可以是這樣的
附帶語(yǔ)音的推送

作者會(huì)在后面繼續(xù)更新新的博客和大家分享谍肤、交流,初來(lái)乍到哗伯,希望得到大家的批評(píng)和指正荒揣!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焊刹,隨后出現(xiàn)的幾起案子系任,更是在濱河造成了極大的恐慌,老刑警劉巖虐块,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俩滥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贺奠,警方通過(guò)查閱死者的電腦和手機(jī)霜旧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)儡率,“玉大人挂据,你說(shuō)我怎么就攤上這事《眨” “怎么了崎逃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)眉孩。 經(jīng)常有香客問(wèn)我个绍,道長(zhǎng),這世上最難降的妖魔是什么勺像? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任障贸,我火速辦了婚禮,結(jié)果婚禮上吟宦,老公的妹妹穿的比我還像新娘篮洁。我一直安慰自己,他們只是感情好殃姓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布袁波。 她就那樣靜靜地躺著,像睡著了一般蜗侈。 火紅的嫁衣襯著肌膚如雪篷牌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天踏幻,我揣著相機(jī)與錄音枷颊,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夭苗,可吹牛的內(nèi)容都是我干的信卡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼题造,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼傍菇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起界赔,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丢习,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淮悼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體咐低,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年敛惊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渊鞋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞧挤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出儡湾,到底是詐尸還是另有隱情特恬,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布徐钠,位于F島的核電站癌刽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尝丐。R本人自食惡果不足惜显拜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爹袁。 院中可真熱鬧远荠,春花似錦、人聲如沸失息。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盹兢。三九已至邻梆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绎秒,已是汗流浹背浦妄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剂娄。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓蠢涝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宜咒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惠赫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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