iOS10本地通知UserNotifications快速入门

来源:互联网 发布:js use strict 编辑:程序博客网 时间:2024/05/18 00:50

https://www.jianshu.com/p/5713fa2bfece


notification.png

iOS10更新变动最大的就是通知这部分了,新版通知变得更加统一,使用更加方便,设计更加自由。以前本地通知和远程推送是分开的,虽然这些到了iOS10都合在一起了,但是为了便于理解,我们还是把他俩分开来进行学习。这节我们学习的是本地通知。

以下的用语,如无特别表述,通知就代表本地通知,推送就代表远程服务器的推送。

快速添加一个通知

我们先举个完整的代码例子,大家了解下这个流程,然后分步介绍这几项:

//第一步:注册通知- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];//请求获取通知权限(角标,声音,弹框)[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {    if (granted) {        //获取用户是否同意开启通知        NSLog(@"request authorization successed!");    }}];}//第二步:新建通知内容对象UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]content.title = @"iOS10通知";content.subtitle = @"新通知学习笔记";content.body = @"新通知变化很大,之前本地通知和远程推送是两个类,现在合成一个了。这是一条测试通知,";content.badge = @1;UNNotificationSound *sound = [UNNotificationSound soundNamed:@"caodi.m4a"];content.sound = sound;//第三步:通知触发机制。(重复提醒,时间间隔要大于60s)UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];//第四步:创建UNNotificationRequest通知请求对象NSString *requertIdentifier = @"RequestIdentifier";UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requertIdentifier content:content trigger:trigger1];//第五步:将通知加到通知中心[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {    NSLog(@"Error:%@",error);}];

最终效果如下:

notification01.png

通知内容UNMutableNotificationContent

通知内容就是设定通知的一些展示信息,iOS10之后可以设置subtitle。
声音的设置需要借助一个新类UNNotificationSound,通知文件要放到bundle里面。另外在实际的测试过程中发现,添加通知的声音有时候会无效。这应该是iOS10存在的一个bug,删除掉程序,再安装运行就好了。

触发机制UNNotificationTrigger

Trigger是新加入的一个功能,通过此类可设置本地通知触发条件。它一共有一下几种类型:
1、UNPushNotificaitonTrigger
推送服务的Trigger,由系统创建
2、UNTimeIntervalNotificaitonTrigger
时间触发器,可以设置多长时间以后触发,是否重复。如果设置重复,重复时长要大于60s
3、UNCalendarNotificaitonTrigger
日期触发器,可以设置某一日期触发。例如,提醒我每天早上七点起床:

  NSDateComponents *components = [[NSDateComponents alloc] init];  components.hour = 7;  components.minute = 0; // components 日期              UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];

4、UNLocationNotificaitonTrigger
位置触发器,用于到某一范围之后,触发通知。通过CLRegion设定具体范围。

通知请求UNNotificationRequest

通知请求的构造
+ (instancetype)requestWithIdentifier:(NSString *)identifier content:(UNNotificationContent *)content trigger:(nullable UNNotificationTrigger *)trigger;
就是把上面三项连接起来。它有一个参数identifier,这相当于通知的一个身份。iOS10通知支持更新,就是基于此identifier再发一条通知。

通知中心UNUserNotificationCenter

获取通知[UNUserNotificationCenter currentNotificationCenter]然后通过addNotificaitonRequest:就完成了一个通知的添加。

扩展通知的内容

通知我们已经添加上了,现在我们需要扩展一下通知的内容,给它加一些内容。扩展的内容需要支持3D-touch的手机(6s以上),重压之后全面显示

添加附件

iOS10之前通知的样式不能更改,在iOS10之后引入了UNNotificationationAttachment,可以在通知中添加图片,音频,视频。苹果对这些附件的大小和类型有一个限制:


attachment_type.png

如果我想在通知里加一个图片,可以这样处理:

NSString *imageFile = [[NSBundle mainBundle] pathForResource:@"sport" ofType:@"png"];UNNotificationAttachment *imageAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"iamgeAttachment" URL:[NSURL fileURLWithPath:imageFile] options:nil error:nil];content.attachments = @[imageAttachment];//虽然是数组,但是添加多个只能显示第一个/* add request and notificaiton code ... */

效果如下:

notification02.png

重压之后:


notificaiton03.png

添加交互

//点击可以显示文本输入框UNTextInputNotificationAction *action1 = [UNTextInputNotificationAction actionWithIdentifier:@"replyAction" title:@"文字回复" options:UNNotificationActionOptionNone];//点击进入应用UNNotificationAction *action2 = [UNNotificationAction actionWithIdentifier:@"enterAction" title:@"进入应用" options:UNNotificationActionOptionForeground];//点击取消,没有任何操作UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"cancelAction" title:@"取消" options:UNNotificationActionOptionDestructive];//通过UNNotificationCategory对象将这几个action行为添加到通知里去UNNotificationCategory *categroy = [UNNotificationCategory categoryWithIdentifier:@"Categroy" actions:@[action1,action2,action3] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];//将categroy赋值到通知内容上content.categoryIdentifier = @"Categroy";//设置通知代理,用于检测点击方法[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];/* add request and notificaiton code ... */

效果如下:

notificaiotn04.png
notification05.png

获取通知交互内容:

//识别通知交互处理的代理方法- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{NSString *categoryIdentifier = response.notification.request.content.categoryIdentifier;if ([categoryIdentifier isEqualToString:@"Categroy"]) {    //识别需要被处理的拓展    if ([response.actionIdentifier isEqualToString:@"replyAction"]){        //识别用户点击的是哪个 action        UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse*)response;        //获取输入内容        NSString *userText = textResponse.userText;        //发送 userText 给需要接收的方法        NSLog(@"要发送的内容是:%@",userText);        //[ClassName handleUserText: userText];    }else if([response.actionIdentifier isEqualToString:@"enterAction"]){        NSLog(@"点击了进入应用按钮");    }else{        NSLog(@"点击了取消");    }}completionHandler();}

由此我们可以知道action,categroy,request这些东西都是通过各自的identifier获取的。这样可以很方便的定位到某一个通知或者action上,为交互的处理提供了很大的便利。

自定义通知样式

在Xcode中File->New->Targe会出现下面的视图

notification06.png

Notification Content对应的是通知,Notification Service Extension对应的是推送。我们这里要实现通知的自定义,选择左边那个。创建成功之后会在工程里多一个文件件
notification07.png

NotificationViewController文件是自动生成的,里面有一个
- (void)didReceiveNotification:(UNNotification *)notification
可以在这里定义一些通知的显示。

MainInterface.storyboard文件是控制通知的storyboard文件,可以编辑需要的通知样式。我们设计一下文字的颜色和显示位置

notificaiton08.png

接下来你可能会问,怎么把这个自定义的通知样式应用到当前通知里呢?先别急,我们看下一个文件Info.flist里面的内容

notification09.png

第一项UNNotificationExtensionCategory就是UNNotificationCategory的标示,我们把他换成我们通知里使用的标示"Category",系统就会自动匹配通知显示的样式。
第二项UNNotificationExtensionIntialContentSizeRation初始内容 Size 的比例。也可以在 viewDidLoad 中使用 self.preferredContentSize 直接设置 Size。
第三项UNNotificationExtensionDefaultContentHidden是否隐藏默认内容,如果设为YES,默认内容会被隐藏。
显示的效果:

notification10.png

总结

至此,iOS通知部分的内容就学完了,参考代码:Demo。
参考文档:
iOS10 User Notificaitons学习笔记
活久见的重构-iOS10 UserNotificaiotns框架解析

 iOS开发

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 炉子烟筒安装示意图 蜂窝煤炉子带暖气片 液化气炉子改天然气 山东杂粮煎饼炉子 家用烧煤取暖炉子 全自动烤羊腿炉子 哪里有卖烧烤炉子的 家用烧煤暖气炉子 自制烤地瓜的炉子 哪里有卖烤地瓜炉子的 生存战争怎么用炉子 炉料价格 铁合金炉料 中频电炉炉料 冶金炉料 钢铁炉料价格 中频炉浇注料 炉顶浇注料 炉料 炉果 炉果的做法和配方烤箱 炉桥 炉桥手擀面培训 炉渣 高炉炉渣 炉渣破碎机 炉渣的价格 炉渣磨粉机 炉渣价格 炉渣制砖机 炉渣粉碎机价格 炉渣磨粉设备 炉火纯青 炉火 炉火照天地 孑然炉火 炉火纯青意思 炉火纯青的近义词 炉火纯青是什么意思 电磁炉火锅台 炉火纯青的意思是什么意思