iOS10全新推送功能實(shí)現(xiàn)代碼
從iOS8.0開(kāi)始推送功能的實(shí)現(xiàn)在不斷改變,功能也在不斷增加,iOS10又出來(lái)了一個(gè)推送插件的開(kāi)發(fā)(見(jiàn)最后圖),廢話不多說(shuō)直接上代碼:
#import <UserNotifications/UserNotifications.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. /* APP未啟動(dòng),點(diǎn)擊推送消息的情況下 iOS10遺棄UIApplicationLaunchOptionsLocalNotificationKey,使用代理UNUserNotificationCenterDelegate方法didReceiveNotificationResponse:withCompletionHandler:獲取本地推送 */ // NSDictionary *localUserInfo = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; // if (localUserInfo) { // NSLog(@"localUserInfo:%@",localUserInfo); // //APP未啟動(dòng),點(diǎn)擊推送消息 // } NSDictionary *remoteUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (remoteUserInfo) { NSLog(@"remoteUserInfo:%@",remoteUserInfo); //APP未啟動(dòng),點(diǎn)擊推送消息,iOS10下還是跟以前一樣在此獲取 } [self registerNotification]; return YES; }
注冊(cè)推送方法的改變:
新增庫(kù) #import <UserNotifications/UserNotifications.h> 推送單列UNUserNotificationCenter 等API
- (void)registerNotification{ /* identifier:行為標(biāo)識(shí)符,用于調(diào)用代理方法時(shí)識(shí)別是哪種行為。 title:行為名稱。 UIUserNotificationActivationMode:即行為是否打開(kāi)APP。 authenticationRequired:是否需要解鎖。 destructive:這個(gè)決定按鈕顯示顏色,YES的話按鈕會(huì)是紅色。 behavior:點(diǎn)擊按鈕文字輸入,是否彈出鍵盤 */ UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action1" title:@"策略1行為1" options:UNNotificationActionOptionForeground]; /*iOS9實(shí)現(xiàn)方法 UIMutableUserNotificationAction * action1 = [[UIMutableUserNotificationAction alloc] init]; action1.identifier = @"action1"; action1.title=@"策略1行為1"; action1.activationMode = UIUserNotificationActivationModeForeground; action1.destructive = YES; */ UNTextInputNotificationAction *action2 = [UNTextInputNotificationAction actionWithIdentifier:@"action2" title:@"策略1行為2" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"textInputButtonTitle" textInputPlaceholder:@"textInputPlaceholder"]; /*iOS9實(shí)現(xiàn)方法 UIMutableUserNotificationAction * action2 = [[UIMutableUserNotificationAction alloc] init]; action2.identifier = @"action2"; action2.title=@"策略1行為2"; action2.activationMode = UIUserNotificationActivationModeBackground; action2.authenticationRequired = NO; action2.destructive = NO; action2.behavior = UIUserNotificationActionBehaviorTextInput;//點(diǎn)擊按鈕文字輸入,是否彈出鍵盤 */ UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@"Category1" actions:@[action2,action1] minimalActions:@[action2,action1] intentIdentifiers:@[@"action1",@"action2"] options:UNNotificationCategoryOptionCustomDismissAction]; // UIMutableUserNotificationCategory * category1 = [[UIMutableUserNotificationCategory alloc] init]; // category1.identifier = @"Category1"; // [category1 setActions:@[action2,action1] forContext:(UIUserNotificationActionContextDefault)]; UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"action3" title:@"策略2行為1" options:UNNotificationActionOptionForeground]; // UIMutableUserNotificationAction * action3 = [[UIMutableUserNotificationAction alloc] init]; // action3.identifier = @"action3"; // action3.title=@"策略2行為1"; // action3.activationMode = UIUserNotificationActivationModeForeground; // action3.destructive = YES; UNNotificationAction *action4 = [UNNotificationAction actionWithIdentifier:@"action4" title:@"策略2行為2" options:UNNotificationActionOptionForeground]; // UIMutableUserNotificationAction * action4 = [[UIMutableUserNotificationAction alloc] init]; // action4.identifier = @"action4"; // action4.title=@"策略2行為2"; // action4.activationMode = UIUserNotificationActivationModeBackground; // action4.authenticationRequired = NO; // action4.destructive = NO; UNNotificationCategory *category2 = [UNNotificationCategory categoryWithIdentifier:@"Category2" actions:@[action3,action4] minimalActions:@[action3,action4] intentIdentifiers:@[@"action3",@"action4"] options:UNNotificationCategoryOptionCustomDismissAction]; // UIMutableUserNotificationCategory * category2 = [[UIMutableUserNotificationCategory alloc] init]; // category2.identifier = @"Category2"; // [category2 setActions:@[action4,action3] forContext:(UIUserNotificationActionContextDefault)]; [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:category1,category2, nil]]; [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) { NSLog(@"completionHandler"); }]; /*iOS9實(shí)現(xiàn)方法 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects: category1,category2, nil]]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; */ [[UIApplication sharedApplication] registerForRemoteNotifications]; [UNUserNotificationCenter currentNotificationCenter].delegate = self; }
代理方法的改變:
一些本地和遠(yuǎn)程推送的回調(diào)放在了同一個(gè)代理方法
#pragma mark - - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED{ NSLog(@"didRegisterUserNotificationSettings"); } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0){ NSLog(@"deviceToken:%@",deviceToken); NSString *deviceTokenSt = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"deviceTokenSt:%@",deviceTokenSt); } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0){ NSLog(@"didFailToRegisterForRemoteNotificationsWithError:%@",error); } /*iOS9使用方法 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_DEPRECATED_IOS(3_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:] for user visible notifications and -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] for silent remote notifications"){ } */ - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{ NSLog(@"willPresentNotification:%@",notification.request.content.title); // 這里真實(shí)需要處理交互的地方 // 獲取通知所帶的數(shù)據(jù) NSString *notMess = [notification.request.content.userInfo objectForKey:@"aps"]; } - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{ //在沒(méi)有啟動(dòng)本App時(shí),收到服務(wù)器推送消息,下拉消息會(huì)有快捷回復(fù)的按鈕,點(diǎn)擊按鈕后調(diào)用的方法,根據(jù)identifier來(lái)判斷點(diǎn)擊的哪個(gè)按鈕 NSString *notMess = [response.notification.request.content.userInfo objectForKey:@"aps"]; NSLog(@"didReceiveNotificationResponse:%@",response.notification.request.content.title); // response.notification.request.identifier } //遠(yuǎn)程推送APP在前臺(tái) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSLog(@"didReceiveRemoteNotification:%@",userInfo); } /* - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler NS_DEPRECATED_IOS(8_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED { } */ /* // 本地通知回調(diào)函數(shù),當(dāng)應(yīng)用程序在前臺(tái)時(shí)調(diào)用 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_DEPRECATED_IOS(4_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED{ NSLog(@"didReceiveLocalNotification:%@",notification.userInfo); // 這里真實(shí)需要處理交互的地方 // 獲取通知所帶的數(shù)據(jù) NSString *notMess = [notification.userInfo objectForKey:@"aps"]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前臺(tái))" message:notMess delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; // 更新顯示的徽章個(gè)數(shù) NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber; badge--; badge = badge >= 0 ? badge : 0; [UIApplication sharedApplication].applicationIconBadgeNumber = badge; // 在不需要再推送時(shí),可以取消推送 [FirstViewController cancelLocalNotificationWithKey:@"key"]; } - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandler NS_DEPRECATED_IOS(8_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED { //在非本App界面時(shí)收到本地消息,下拉消息會(huì)有快捷回復(fù)的按鈕,點(diǎn)擊按鈕后調(diào)用的方法,根據(jù)identifier來(lái)判斷點(diǎn)擊的哪個(gè)按鈕,notification為消息內(nèi)容 NSLog(@"%@----%@",identifier,notification); completionHandler();//處理完消息,最后一定要調(diào)用這個(gè)代碼塊 } */
還有推送插件開(kāi)發(fā): 類似iOS tody widget插件開(kāi)發(fā)
本文已被整理到了《iOS推送教程》,歡迎大家學(xué)習(xí)閱讀。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS10添加本地推送(Local Notification)實(shí)例
- iOS10 適配遠(yuǎn)程推送功能實(shí)現(xiàn)代碼
- 使用iOS推送時(shí)警告錯(cuò)誤的解決方法
- iOS10實(shí)現(xiàn)推送功能時(shí)的注意點(diǎn)和問(wèn)題總結(jié)
- iOS點(diǎn)擊推送消息跳到應(yīng)用指定頁(yè)面方法
- iOS實(shí)現(xiàn)遠(yuǎn)程推送原理及過(guò)程
- iOS自定義推送消息提示框
- 解析iOS10中的極光推送消息的適配
- 輕松搞定iOS本地消息推送
- iOS學(xué)習(xí)筆記之遠(yuǎn)程推送、靜默推送與自定義消息推送
相關(guān)文章
如何用IOS調(diào)用WebService(SOAP接口)
這篇文章主要介紹了如何用IOS調(diào)用WebService(SOAP接口),需要的朋友可以參考下2015-07-07IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式
這篇文章主要介紹了IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式的相關(guān)資料,需要的朋友可以參考下2016-11-11iOS實(shí)現(xiàn)日歷翻頁(yè)動(dòng)畫
本文的內(nèi)容主要是在IOS中實(shí)現(xiàn)日歷翻頁(yè)的動(dòng)畫,界面簡(jiǎn)單但效果很好,以后可以運(yùn)用到app中,下面一起來(lái)看看。2016-08-08Flutter?ScrollController滾動(dòng)監(jiān)聽(tīng)及控制示例詳解
這篇文章主要為大家介紹了Flutter?ScrollController滾動(dòng)監(jiān)聽(tīng)及控制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解
這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開(kāi)連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05淺談關(guān)于如何檢測(cè)iOS14本地網(wǎng)絡(luò)權(quán)限的一些思路
這篇文章主要介紹了淺談關(guān)于如何檢測(cè)iOS14本地網(wǎng)絡(luò)權(quán)限的一些思路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09