iOS10新增了UserNotificationKit框架,下面就简单的总结下,我遇到的用法以及一些知识点
首先我们要去请求用户的权限,请求授权,一般来说我们是在didFinishLaunchingWithOptions 这个方法中调用的,下面设置了这个通知中心的代理,那么appDelegate中要遵守<UNUserNotificationCenterDelegate>这个协议
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//使用 UNUserNotificationCenter 来管理通知
UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
//监听回调事件
center.delegate = self;
//ios10及之后用下面的方法注册
// UNAuthorizationOptionBadge = (1 << 0), 图标标记
// UNAuthorizationOptionSound = (1 << 1), 声音
// UNAuthorizationOptionAlert = (1 << 2), 提醒
// UNAuthorizationOptionCarPlay = (1 << 3), 这个一般没什么用,专为车载系统定制
[center requestAuthorizationWithOptions:UNAuthorizationOptionBadge |UNAuthorizationOptionSound | UNAuthorizationOptionAlert
completionHandler:^(BOOL granted, NSError * _Nullable error) {
//此处granted表示的是有没有全部授权成功,如果为YES就表示全部授权成功,NO的话就表示没有。
//这里之所以这么说是因为文档中显示如下图所示
}];
//获取用户授权相关设置信息的接口,UNNotificationSettings 是只读对象,是不能直接修改,只能通过以下方法获取
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@",settings);
/*
UNAuthorizationStatusNotDetermined : 没有做出选择
UNAuthorizationStatusDenied : 用户未授权
UNAuthorizationStatusAuthorized :用户已授权
*/
if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined)
{
NSLog(@"未选择");
}else if (settings.authorizationStatus == UNAuthorizationStatusDenied){
NSLog(@"未授权");
}else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){
NSLog(@"已授权");
}
}];
return YES;
}
这里解释了granted值的情况
UNUserNotificationCenterDelegate 这个协议中总共有两个方法,而且都是可选的,如下所示,
//当应用处于前台时,收到的通知是无法进行展示的。如果我们希望在应用内也能显示通知的话,需要额外的工作,重写下面的方法回调了下面才可以在前台显示
//completionHandler后的任何代码都不执行,所以要把completionHandler放在你写的代码之后
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withComple
tionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
NSLog(@"-------");
//可设置是否在应用内弹出通知
completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionSound);
}
还有个方法是点击了推送消息之后的回调,我们完全可以在这里面进行设置点击了推送消息中,跳到app中的某个界面。
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)
response withCompletionHandler:(void (^)(void))completionHandler
{
/**
对应action的处理
点击了推送消息之后,我们可以通过获取request中的categoryIdentifier和response中的actionIdentifier就能知道是哪个通知中的哪个action被执行。
如果action是带有文本信息的UNTextInputNotificationAction,可以把response转为UNTextInputNotificationResponse类型,就可以拿到用户输入的内容
*/
NSLog(@"userInfo--%@",response.notification.request.content.userInfo);
UITabBarController * vc = (UITabBarController *)self.window.rootViewController;
vc.selectedIndex = [response.notification.request.content.userInfo[@"selectIndex"]intValue];
获取通知中心的所有的Categories,也就是通知的策略,可以根据下面方法来获取
// [center getNotificationCategoriesWithCompletionHandler:^(NSSet<UNNotificationCategory *> * _Nonnull categories) { }];
//此处结束之后要去调用,其实就是苹果需要知道你这个程序前面的代码什么时候执行完,可以方便的去做一个资源的调配工作
completionHandler();
}
因为介绍中有这么一段话,这段话的意思就是,使用此方法执行与应用程序的自定义操作相关联的任务。当用户响应通知时,系统将调用该方法和结果。您使用此方法执行与
该操作相关联的任务,如果有的话。在你实施结束时,你必须调用completionhandler块让系统知道你是做过处理的通知。
包括下面对这个参数的描述也是这个意思,大致的意思就是完成用户响应后执行的块。必须从方法中执行此块,并应尽快调用它。块没有返回值或参数。
发送通知的方法
//使用UNUserNotification来管理通知
UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
//需创建一个包含待通知内容的 UNMutableNotificationContent 对象,注意不是 UNNotificationContent ,此对象为不可变对象,一般用于远程通知。
//通知内容分为可变的以及不可变的两种类型,类似于可变数组跟不可变数组。后续我们通过某一特定标识符更新通知,便是用可变通知了
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
// attachments //附件
// badge //数字标志
// title //推送内容标题
// subtitle //推送内容子标题
// body //推送内容body
// categoryIdentifier //category标识,操作策略
// launchImageName //点击通知进入应用的启动图
// sound //声音
// userInfo //附带通知内容
content.title = @"sss";
content.body = @"哈哈";
content.badge = @5;
content.sound = [UNNotificationSound defaultSound];
content.userInfo = @{@"selectIndex":@(1)};
//设置通知的触发时间
//上面的方法是指5秒钟之后执行。repeats这个属性,如果需要为重复执行的,则TimeInterval必须大于60s,否则会报time interval must be at least
//60 if repeating,这里如果重复的去调用的话,通知还是只有一个
//下面设置延迟5s,发送通知
UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];
//包装成通知请求
UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@"tongzhi" content:content trigger:trigger];
//通知中心添加这个通知请求
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
}];
通知触发模式有下面四种
UNPushNotificationTrigger 系统自动设置(是区分本地通知和远程通知的标识)
UNTimeIntervalNotificationTrigger 我们设置的指定什么时间后触发
UNCalendarNotificationTrigger 指定一个日期然后去触发
UNLocationNotificationTrigger 根据位置来触发,进入某地或者离开某地或者都可以触发
还有需要注意的是这里用的是UNMutableNotificationContent而不是UNNotificationContent是因为UNNotificationContent中的属性都是只读的,创建了也根本无法进行修改,还有一点就是根据文档显示
还有就是我们可以给通知设置成可以和用户交互了,这里引入一个Category类目的概念还有个是Action可以理解成按钮一样的东西,可以在这里进行设置
//UNTextInputNotificationAction,这个就是带有文本输入的按钮
//textInputPlaceholder文本框的默认文字,输入就是文本框右边的按钮的名字
UNTextInputNotificationAction *textAction = [UNTextInputNotificationAction actionWithIdentifier:@"text" title:
@"文本输入按钮" options:UNNotificationActionOptionForeground textInputButtonTitle:@"输入" textInputPlaceholder:@"输入内容"];
//UNNotificationActionOptionDestructive,代表的就是销毁此条推送
UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:@"destructive" title:@"销毁" options:
NNotificationActionOptionDestructive];
//UNNotificationActionOptionAuthenticationRequired在锁屏状态需要解锁显示,点击不会进app,
// UNNotificationActionOptionForeground = (1 << 2),当在锁屏状态下点击之后会要求先解锁,然后再进去,设置起来是黑色的文字。点击会进app。
UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action_1" title:@"哈哈" options:
UNNotificationActionOptionAuthenticationRequired];
//一个通知可以注册多个category. 发送通知时,UNMutableNotificationContent选择一个category进行绑定
UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"my_category" actions:
@[textAction,action,action1] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
// 将 category 添加到通知中心
NSSet *setting = [NSSet setWithObjects:category, nil];
[center setNotificationCategories:setting];
content.categoryIdentifier = @"my_category";
然后我们可以在下面这个方法中做一些操作
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
if([response.actionIdentifier isEqualToString:@"text"])
{
UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse *)response;
NSLog(@"%@",textResponse.userText);
}
}