iOS10 新特性一出,各家纷纷出动研究新特性能给场景智能化所带来的好处,从widget到推送通知的拓展。不意外的,当我还没有来得及跟公司沟通新特性在软件上的应用时,就被公司拉来研究了,今天我先就iOS 10 在推送通知上的新增API以及使用方法说一说:
(不避讳的说,程序媛一枚,欢迎点赞)
iOS10 的推送通知支持图片啦!!支持视频了!!支持自定义样式了!!
首先认识一个类:UNNotificationSettings (枚举,通知支持的样式:声音,弹框,横幅,等等)
第一步注册通知:
//引入头文件
#import <UserNotifications/UserNotifications.h>
//注册推送通知,iOS10之后不论是否本地通知与远程推送通知,都将采用注册,以及请求发送的形式
UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
notificationCenter.delegate = self;
[notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
NSLog(@"%d--%@", granted, error);
}];; //option参数设置支持通知的样式,声音,横幅,弹框,等
磨刀不误砍材工,再来认识几个类:
trigger
设置通知的触发时机:
UNCalenderNotificaitionTrigger(设置某时固定触发通知)
UNLocationNotificaitionTrigger (设置当进入某一区域触发通知)
UNTimeIntervalNotificaitionTrigger (设置多久后触发通知)
content
UNNoticificationContent (一个设置通知组件的类,title,message,categoryIdentifier,媒体图片,视频,等都装在这个结构体中发出通知请求,它还有一个和它一对的类UNMutableNoticificationContent)
UNNotificationAction (添加交互事件,包括输入文字,点击按钮)
UNNotificationAttachment (媒体相关,想要推送带“图片”和”视频“的通知,但是只支持本地的图片和视频,想要获取数据只能下载到本地再推送哦。
PS:我踩过一个坑,你以为要自己清除下载到本地的缓存?想多啦,即使是存储在Document,发送完通知之后苹果会找到这条路径自动清空缓存,做demo的时候发现自己存在那个路径的图片都在发送通知后的一瞬间被清空了,也就是说,想再利用这张图,要再下载哦,或者把这张图本地持久化,我是把图转成data存在NSUserDefaults了,个人觉得有点麻烦,有更好方法的大神给我留言哦~~!!)
第二步:初始化通知组件
//1.初始化通知
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.badge = @1;
content.title = self.titleTF.text;
content.body = self.messageTextView.text; //如果没有body则不会弹出通知
UNNotificationSound *sound = [UNNotificationSound defaultSound];
content.sound = sound;//通知声音
content.categoryIdentifier = @"uid";//不要急,后面有解释
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];//5秒后推送
NSString *localPath = [self getPathWithPhoteData:[[NSUserDefaults standardUserDefaults]objectForKey:@"photo"]];
if (localPath && ![localPath isEqualToString:@""]) {
UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"photo" URL:[NSURL URLWithString:[@"file://" stringByAppendingString:localPath]] options:nil error:nil];
if (attachment) {
content.attachments = @[attachment];
}
//localPath是我通过拿到相册图片存到本地的路径(为什么不用url直接下载图片拼接本地路径呢,因为产品想要用,他们想自己从相册选照片!!!),总之把一个本地图片的url丢到attachment里面就可以发送一个有图片的通知了,视频也是一样用法呢。
第三部:伟大的推送请求~
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"push" content:content trigger:trigger];
//参数就是触发时机和通知组建
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
}
}];
这是我的demo是一个可以自己输入内容发送通知,并且可以设置点击通知跳转到某网页的操作。
第四部:处理通知
用到这个代理:UNUserNotificationCenterDelegate
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(nonnull UNNotificationResponse *)response withCompletionHandler:(nonnull void (^)())completionHandler {
处理用户与通知交互后的操作,我demo中的点击跳转网页就是在这里处理
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
// 允许在前台展示消息,不设置的话,默认是不行的
completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionSound);
}
接下来具体说说苹果关于通知的拓展框架:
这部分写的人比较多,我来补个漏
有的人自定义的UI之后发现根本不显示,实际上要注意在info.里面的配置:
在NotificationContent里面的info.中,有3个key注意设置:
1.ExtensionCategory负责绑定到通知中去,记得上面的content.categoryIdentifier = @"uid";
这里的ExtensionCategory要和content中设置的分类ID一致才能用过这个拓展框架显示自定义的UI
2.UNNotificationExtensionDefaultContentHidden 这个key是boolean类型,之前我设置好自定义UI之后发现,出现了两个title,两个message,是因为我们没有隐藏苹果官方格式的通知,隐藏掉就好了,这里要设置为YES