iOS 10以前的通知比较杂乱,把本地通知和远程通知分开了,诞生了许多功能类似的API,很容易让初学者犯迷糊。而iOS 10的通知把API做了统一,利用独立的UserNotifications.framework框架来管理通知;并且,还增加了撤销单条通知、更新已展示通知、中途修改通知内容等等,以及在通知中展示图片视频,自定义通知UI等一系列新功能;总之,iOS 10的通知功能十分强大。

的通知之前,有必要了解一下通知的历史现状。由于通知可以方便的提示用户应用的状态、传递重要的信息,所以自从iOS 3引入通知以来,几乎每个新的版本,Apple都会增强通知的功能。

一、发展历程:

iOS 3 - 引入推送通知

UIApplication 的 registerForRemoteNotificationTypesUIApplicationDelegateapplication(_:didRegisterForRemoteNotificationsWithDeviceToken:)application(_:didReceiveRemoteNotification:)

iOS 4 - 引入本地通知

scheduleLocalNotificationpresentLocalNotificationNow:application(_:didReceive:)

iOS 5 - 加入通知中心页面

iOS 6 - 通知中心页面与 iCloud 同步

iOS 7 - 后台静默推送

application(_:didReceiveRemoteNotification:fetchCompletionHandle:)

iOS 8 - 重新设计notification权限请求,加入交互式通知

Actionable 通知 registerUserNotificationSettings(_:),UIUserNotificationAction UIUserNotificationCategoryapplication(_:handleActionWithIdentifier:forRemoteNotification:completionHandler:)

iOS 9 - Text Input action

基于 HTTP/2 的推送请求 UIUserNotificationActionBehavior,全新的 Provider API 等

二、通知应用

申请权限

	// 获取通知中心对象
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; // 申请通知权限
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"通知开启");
} else {
NSLog(@"关闭通知");
}
}]; // 获取授权的通知权限
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@", settings);
}];

requestAuthorizationWithOptions:

申请通知的权限,iOS 10不再区分远程通知和本地通知的权限申请,统一用该方法做权限申请

添加通知

	// 创建通知对象
UNMutableNotificationContent *noticeContent = [[UNMutableNotificationContent alloc] init]];
// 设置通知标题
noticeContent.title = @"iOS10通知";
// 设置通知子标题
noticeContent.subtitle = @"新通知学习笔记";
// 设置通知内容
noticeContent.body = @"新通知变化很大,之前本地通知和远程推送是两个类,现在合成一个了。";
// 添加通知的声音
UNNotificationSound *sound = [UNNotificationSound soundNamed:@"caodi.m4a"];
noticeContent.sound = sound;

UNMutableNotificationContent

通知的内容,可以设置通知的标题、副标题、具体内容,以及通知的图片、视频、声音和交互信息等等

UNNotificationSound

应用在后台时收到通知时的提示音

触发机制

	// 如果repeats为YES,那么triggerWithTimeInterval的值要大于60s
UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO]; NSString *requestIdentifier = @"requestIdentifier"; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifier content:content trigger:trigger1];

UNTimeIntervalNotificationTrigger

设置通知触发的条件,分为以下几类:

  • 1.UNPushNotificaitonTrigger

推送服务的Trigger,由系统创建

  • 2.UNTimeIntervalNotificaitonTrigger

时间触发器,可以设置多长时间后触发通知,repeats参数为是否重复触发,如果设置YES,那么triggerWithTimeInterval的时间必须大于60s

  • 3.UNCalendarNotificaitonTrigger

日期触发器,可以设置特定日期触发

  • 4.UNLocationNotificaitonTrigger

位置触发器,用于到达特定位置后才触发通知,需要设置CLRegion的具体区域

发送通知

	[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
NSLog(@"发送通知出错: %@", error);
}];

addNotificationRequest:withCompletionHandler:

把通知添加到通知中心,就可以发送通知了

扩展通知

我们可以在通知中添加声音、图片和视频,来丰富通知的内容,在支持3D-touch的手机上,重压之后会全面显示;另外,我们也可以添加交互式通知,进一步提高用户体验

UNNotificationationAttachment

通知的附近,我们可以在附近中添加图片、音频或视频。

添加图片

	UNMutableNotificationContent *noticeContent = [[UNMutableNotificationContent alloc] init];

    NSString *imageFile = [[NSBundle mainBundle] pathForResource:@"sport" ofType:@"png"];
UNNotificationAttachment *imageAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"imageAttachment" URL:[NSURL fileURLWithPath:imageFile] options:nil error:nil];
NSAssert(imageAttachment != nil, @"imageAttach 不能为空");
noticeContent.attachments = @[imageAttachment];

添加视频

	UNMutableNotificationContent *noticeContent = [[UNMutableNotificationContent alloc] init];

    NSString *movieFile = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"mp4"];
UNNotificationAttachment *movieAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"movieAttachment" URL:[NSURL fileURLWithPath:movieFile] options:nil error:nil];
NSAssert(movieAttachment != nil, @"movieAttach 不能为空");
noticeContent.attachments = @[movieAttachment];

添加交互式通知

添加交互式通知

	UNMutableNotificationContent *noticeContent = [[UNMutableNotificationContent alloc] init];

    // 文字action
UNTextInputNotificationAction *action1 = [UNTextInputNotificationAction actionWithIdentifier:@"replyAction" title:@"文字回复" options:UNNotificationActionOptionNone];
// 进入应用action
UNNotificationAction *action2 = [UNNotificationAction actionWithIdentifier:@"enterAction" title:@"进入应用" options:UNNotificationActionOptionForeground];
// 取消action
UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"cancelAction" title:@"取消" options:UNNotificationActionOptionDestructive]; UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"Categroy" actions:@[action1, action2, action3] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction]; [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]]; noticeContent.categoryIdentifier = @"Categroy";

获取交互动作

	- (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"]) {
UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse*)response; NSString *userText = textResponse.userText; NSLog(@"您输入的内容:%@", userText); } else if ([response.actionIdentifier isEqualToString:@"enterAction"]) {
NSLog(@"点击进入了应用");
} else {
NSLog(@"点击了取消");
}
} completionHandler();
}

iOS 10把接收通知的方法做了统一,不再区分接收本地和远程的通知,只分前台和后台时受到的通知。

接收通知的步骤:

1.设置通知的代理,一般设置在AppDelegate

[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];

2.实现代理方法

	// 应用在前台收到通知的处理方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler // 应用在后台收到通知的处理方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler

自定义通知样式

iOS 10可以设置通知的UI样式,更加方便给用户定制化。必须用iPhone7或iPhone7 Plus,iPhone6s及以下硬件,即使升级到iOS 10也无法显示自定义通知的样式

1.创建自定义通知UI文件,在XcodeFile->New->Targe会出现下面的视图

其中,与通知相关的扩展有两个:Notification ContentNotification Service Extension,前者是自定义通知的类型,后者是我们收到远程通知后,在展示之前对通知的修改。所以,我们采用前者

2.修改通知视图的控制器,自定义通知样式

  • NotificationViewController文件:

- (void)didReceiveNotification:(UNNotification *)notification可以设置UI显示的数据

  • MainInterface.storyboard文件

我们可以通过这个storyboard来具体定制通知的样式

3.应用自定义通知样式

修改NotificationViewControllerinfo.plist文件

  • UNNotificationExtensionCategory

UNNotificationCategory的标识,需要设置为我们的通知的标识

  • UNNotificationExtensionInitialContentSizeRatio

通知内容显示的比例大小,默认为1

  • UNNotificationExtensionDefaultContentHidden

是否隐藏默认通知,设置为YES后,默认通知会隐藏

移除通知

[[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:@[@"requestIdentifier"]];

至此,iOS 10本地通知已经解析完毕,下一篇是远程通知,......

实例项目

https://github.com/BirdandLion/UNNotificationDemo.git

参考资料

https://developer.apple.com/reference/usernotifications

https://onevcat.com/2016/08/notification/

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

iOS 10 UserNotification框架解析 – 本地通知的更多相关文章

  1. [转载]iOS 10 UserNotifications 框架解析

    活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  2. iOS 10 UserNotifications 框架解析

    摘自:https://onevcat.com/2016/08/notification/ iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  3. 10 - 应用程序间通信、本地通知、加速计、URL传输中文

    一.应用间通信 URL 调用系统服务: tel:11111 sms:xxx@163.com http:// URL深入 类型://主机:端口/地址?参数 label框等于文字大小快捷键:command ...

  4. Ios开发中UILocalNotification实现本地通知实现提醒功能

    这两天在做一个日程提醒功能,用到了本地通知的功能,记录相关知识如下: 1.本地通知的定义和使用: 本地通知是UILocalNotification的实例,主要有三类属性: scheduled time ...

  5. Spring 10: AspectJ框架 + @Before前置通知

    AspectJ框架 概述 AspectJ是一个优秀的面向切面编程的框架,他扩展了java语言,提供了强大的切面实现 本身是java语言开发的,可以对java语言面向切面编程进行无缝扩展 AOP常见术语 ...

  6. iOS 10 开发问题总结

    兼容iOS 10 资料整理笔记   1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大 ...

  7. 开发者所需要知道的 iOS 10 SDK 新特性

    转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...

  8. 兼容iOS 10 资料整理笔记

    原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化 ...

  9. iOS开发 - 兼容iOS 10

    1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserN ...

随机推荐

  1. Mybatis(七) mybatis的逆向工程的配置详解

    还是觉得看书学习有意思~嘿嘿.今天把mybatis给结束掉. --WH 一.什么是逆向工程? 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自 ...

  2. Ant部署(linux)

    1.下载 mkdir /opt/ant cd /opt/ant wget http://mirror.bit.edu.cn/apache//ant/binaries/apache-ant-1.9.4- ...

  3. Java虚拟机:如何判定哪些对象可回收?

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在堆内存中存放着Java程序中几乎所有的对象实例,堆内存的容量是有限的,Java虚拟机会对堆内存进行管理,回收已经"死去&quo ...

  4. (转)Linux开机启动(bootstrap)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机开机是一个神秘的过程.我们只是按了开机键,就看到屏幕上的进度条或者一行行的输 ...

  5. 动态rem与1px边框问题的理解

    当我们在项目开发中,拿到设计师的设计图,满怀欣喜的准备按照设计图将页面实现出来的时候,我们通常会遇到这个问题: 如何将页面的内容按照在不同手机屏幕浏览的情况下,比例都是不变的呢?这个时候我们就需要使用 ...

  6. Fiddler基础使用一之捕获https请求

    fiddler抓包工具: http协议cookieFiddler是一个调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddle ...

  7. CubieBoard开发板数据源介绍

    1: Linaro/Ubuntu Linaro is a not-for-profit engineering organization consolidating and optimizing op ...

  8. angularjs 选项卡tab切换(移动端用户订单状态)

    <!--头部导航tabs切换--> <div class="tabs-striped tabs-top tabs-background-positive tabs-colo ...

  9. python函数(4):递归函数及二分查找算法

    人理解循环,神理解递归!  一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? ""& ...

  10. C#委托基础学习

    什么是委托       委托,顾名思义就是在你忙着做另一件事时候,你要去做另一件事,于是你可能就会委托别人帮你做,让别人把结果返回给你.编程时,委托也有这个思想. 我目前对委托的看法是,在编程中,委托 ...