最近在研究iOS10關(guān)于推送的新特性, 相比之前確實(shí)做了很大的改變,總結(jié)起來主要是以下幾點(diǎn):
	 1.推送內(nèi)容更加豐富,由之前的alert 到現(xiàn)在的title, subtitle, body
	 2.推送統(tǒng)一由trigger觸發(fā)
	 3.可以為推送增加附件,如圖片、音頻、視頻,這就使推送內(nèi)容更加豐富多彩
	 4.可以方便的更新推送內(nèi)容 
import 新框架
添加新的框架 UserNotifications.framework
	 
#import <UserNotifications/UserNotifications.h>
注冊(cè)推送
	在設(shè)置通知的時(shí)候,需要先進(jìn)行注冊(cè),獲取授權(quán)
	iOS10 所有通知都是通過UNUserNotificationCenter來管理,包括遠(yuǎn)程通知和本地通知
  //iOS8以下  [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];  //iOS8 - iOS10  [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];  //iOS10  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];  [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {  }獲取用戶設(shè)置
iOS10 提供了獲取用戶授權(quán)相關(guān)設(shè)置信息的接口getNotificationSettingsWithCompletionHandler: , 回調(diào)帶有一個(gè)UNNotificationSettings對(duì)象,它具有以下屬性,可以準(zhǔn)確獲取各種授權(quán)信息
	authorizationStatus
	soundSetting
	badgeSetting
	alertSetting
	notificationCenterSetting
	lockScreenSetting
	carPlaySetting
	alertStyle 
像下面的方法,點(diǎn)擊allow
	
   UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];  [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {     if (granted) {        //點(diǎn)擊允許        NSLog(@"注冊(cè)通知成功");        [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {        NSLog(@"%@", settings);        }];      } else {        //點(diǎn)擊不允許        NSLog(@"注冊(cè)通知失敗");      }    }];打印信息: *<UNNotificationSettings: 0x174090a90; authorizationStatus: Authorized, notificationCenterSetting: Enabled, soundSetting: Enabled, badgeSetting: Enabled, lockScreenSetting: Enabled, alertSetting: NotSupported, carPlaySetting: Enabled, alertStyle: Banner>*
注冊(cè)APNS, 獲取token
	iOS10, 注冊(cè)APNS和獲取token的方法還和之前一樣
	在application: didFinishLaunchingWithOptions:調(diào)用 registerForRemoteNotifications方法
	 [[UIApplication sharedApplication] registerForRemoteNotifications]; 
在代理方法application: didRegisterForRemoteNotificationsWithDeviceToken:中獲取token
 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0){    NSLog(@"deviceToken:%@",deviceToken);  }- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0){    NSLog(@"didFailToRegisterForRemoteNotificationsWithError:%@",error);  } 設(shè)置處理通知的action 和 category
	在iOS8以前是沒有category這個(gè)屬性的;
	在iOS8注冊(cè)推送,獲取授權(quán)的時(shí)候,可以一并設(shè)置category, 注冊(cè)的方法直接帶有這個(gè)參數(shù);
	在iOS10, 需要調(diào)用一個(gè)方法setNotificationCategories:來為管理推送的UNUserNotificationCenter實(shí)例設(shè)置category, category又可以對(duì)應(yīng)設(shè)置action;
//設(shè)置category//UNNotificationActionOptionAuthenticationRequired 需要解鎖//UNNotificationActionOptionDestructive 顯示為紅色//UNNotificationActionOptionForeground 點(diǎn)擊打開appUNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action1" title:@"策略1行為1" options:UNNotificationActionOptionForeground];UNTextInputNotificationAction *action2 = [UNTextInputNotificationAction actionWithIdentifier:@"action2" title:@"策略1行為2" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"comment" textInputPlaceholder:@"reply"]; //UNNotificationCategoryOptionNone //UNNotificationCategoryOptionCustomDismissAction 清除通知被觸發(fā)會(huì)走通知的代理方法 //UNNotificationCategoryOptionAllowInCarPlay 適用于行車模式UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@"category1" actions:@[action2,action1] minimalActions:@[action2,action1] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"action3" title:@"策略2行為1" options:UNNotificationActionOptionForeground];UNNotificationAction *action4 = [UNNotificationAction actionWithIdentifier:@"action4" title:@"策略2行為2" options:UNNotificationActionOptionForeground];UNNotificationCategory *category2 = [UNNotificationCategory categoryWithIdentifier:@"category2" actions:@[action3,action4] minimalActions:@[action3,action4] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:category1,category2, nil]];
設(shè)置通知內(nèi)容
	因?yàn)閕OS10遠(yuǎn)程通知與本地通知統(tǒng)一起來了,通知內(nèi)容屬性是一致的,不過遠(yuǎn)程推送就需要在payload進(jìn)行具體設(shè)置了,下面以本地通知為例,介紹關(guān)于UNNotificationContent的內(nèi)容
	官網(wǎng)上明確說明了,我們是不能直接創(chuàng)建UNNotificationContent的實(shí)例的, 如果我們需要自己去配置內(nèi)容的各個(gè)屬性,我們需要用到UNMutableNotificationContent
	看一下它的一些屬性:
	attachments          //附件
	badge                //徽標(biāo)
	body                 //推送內(nèi)容body
	categoryIdentifier   //category標(biāo)識(shí)
	launchImageName      //點(diǎn)擊通知進(jìn)入應(yīng)用的啟動(dòng)圖
	sound               //聲音
	subtitle            //推送內(nèi)容子標(biāo)題
	title               //推送內(nèi)容標(biāo)題
	userInfo           //遠(yuǎn)程通知內(nèi)容
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];  content.title = @"Test";  content.subtitle = @"1234567890";  content.body = @"Copyright © 2016年 jpush. All rights reserved.";  content.badge = @1;  NSError *error = nil;  NSString *path = [[NSBundle mainBundle] pathForResource:@"718835727" ofType:@"png"];  UNNotificationAttachment *att = [UNNotificationAttachment attachmentWithIdentifier:@"att1" URL:[NSURL fileURLWithPath:path] options:nil error:&error];  if (error) {    NSLog(@"attachment error %@", error);  }  content.attachments = @[att];  content.categoryIdentifier = @"category1”; //這里設(shè)置category1, 是與之前設(shè)置的category對(duì)應(yīng)  content.launchImageName = @"1-Eb_0OvtcxJXHZ7-IOoBsaQ";UNNotificationSound *sound = [UNNotificationSound defaultSound];content.sound = sound;	 
通知觸發(fā)器
	UNNotificationTrigger
	iOS 10觸發(fā)器有4種
	 •UNPushNotificationTrigger 觸發(fā)APNS服務(wù),系統(tǒng)自動(dòng)設(shè)置(這是區(qū)分本地通知和遠(yuǎn)程通知的標(biāo)識(shí))
	 •UNTimeIntervalNotificationTrigger 一段時(shí)間后觸發(fā)
	 •UNCalendarNotificationTrigger 指定日期觸發(fā)
	 •UNLocationNotificationTrigger 根據(jù)位置觸發(fā),支持進(jìn)入某地或者離開某地或者都有
//十秒后UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10 repeats:NO];//每周日早上8:00NSDateComponents *component = [[NSDateComponents alloc] init];component.weekday = 1;component.hour = 8;UNCalendarNotificationTrigger *trigger2 = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:component repeats:YES];//圓形區(qū)域,進(jìn)入時(shí)候進(jìn)行通知CLLocationCoordinate2D cen = CLLocationCoordinate2DMake(80.335400, -90.009201);CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:cen radius:500.0 identifier:@“center"];region.notifyOnEntry = YES; //進(jìn)入的時(shí)候region.notifyOnExit = NO; //出去的時(shí)候UNLocationNotificationTrigger *trigger3 = [UNLocationNotificationTrigger triggerWithRegion:region repeats:NO];
添加通知 / 更新通知
	 1.創(chuàng)建一個(gè)UNNotificationRequest類的實(shí)例,一定要為它設(shè)置identifier, 在后面的查找,更新, 刪除通知,這個(gè)標(biāo)識(shí)是可以用來區(qū)分這個(gè)通知與其他通知
	 2.把request加到UNUserNotificationCenter, 并設(shè)置觸發(fā)器,等待觸發(fā)
	 3.
	如果另一個(gè)request具有和之前request相同的標(biāo)識(shí),不同的內(nèi)容, 可以達(dá)到更新通知的目的
  NSString *requestIdentifer = @"TestRequest";  UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger1];  //把通知加到UNUserNotificationCenter, 到指定觸發(fā)點(diǎn)會(huì)被觸發(fā)  [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {  }]; //在另外需要更新通知的地方UNMutableNotificationContent *newContent = [[UNMutableNotificationContent alloc] init];newContent.title = @"Update";newContent.subtitle = @"XXXXXXXXX";newContent.body = @"Copyright © 2016年 jpush. All rights reserved.";UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"TestRequest" content:newContent trigger:trigger1];[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {}];	 
獲取和刪除通知
	這里通知是有兩種狀態(tài)
	 •Pending 等待觸發(fā)的通知
	 •Delivered 已經(jīng)觸發(fā)展示在通知中心的通知
 //獲取未觸發(fā)的通知[[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {  NSLog(@"pending: %@", requests);}];//獲取通知中心列表的通知[[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) {  NSLog(@"Delivered: %@", notifications);}]; //清除某一個(gè)未觸發(fā)的通知 [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:@[@"TestRequest1"]]; //清除某一個(gè)通知中心的通知 [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[@"TestRequest2"]]; //對(duì)應(yīng)的刪除所有通知[[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];[[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];delegate
<UNUserNotificationCenterDelegate>
iOS10收到通知不再是在application: didReceiveRemoteNotification:方法去處理, iOS10推出新的代理方法,接收和處理各類通知(本地或者遠(yuǎn)程)
 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {  //應(yīng)用在前臺(tái)收到通知  NSLog(@"========%@", notification);}- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {  //點(diǎn)擊通知進(jìn)入應(yīng)用  NSLog(@"response:%@", response);}最后
下一篇文章繼續(xù)介紹關(guān)于富媒體推送的 UNNotificationServiceExtension 和 Notification content extension, 未完待續(xù)。。。
| 
 
 | 
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注