本文会涉及iOS10中的UserNotifications框架,关于UN框架的介绍可以看这里iOS 7 8 9 10本地和推送通知踩坑之旅,适配iOS10之自定义推送通知
日常的推送开发中我们接触到最多的就是系统默认的Notification's UI了,那么除了使用系统默认的UI样式,能不能自定义推送的UI呢?
我们可以借助Notifications Content Extension
这个扩展进行非常方便的UI自定义。
如下图所示:
但需要注意的是,自定义UI不能响应点击事件。
创建 Notifications Content Extension
创建好的
Notifications Content Extension
包含四个文件,分别是:
-
NotificationViewController
头文件与m文件 MainInterface.storyboard
Info.plist
其中
NotificationViewController
继承自UIViewController
,且实现了UNNotificationContentExtension
协议。
那么当一个通知发出之后,系统是如何得知这个通知的UI是通过Notifications Content Extension
设置的呢。
这里就需要在Info.plist
中配置UNNotificationExtensionCategory
的值,如下图:
UNNotificationExtensionCategory
的值为payload中设置的category
,且需要在主工程中进行注册,关于如何注册上文中已经提过。payload格式示例如下:
{"aps":{"alert":"hahhahah","badge":1,"sound":"default", "category" : "iOS10-category-identifier"}}
如果不想用sb布局,那么你就可以把NSExtensionMainStoryboard
这个key删掉,使用NSExtensionPrincipalClass
配置你的初始化控制器。
注意
NSExtensionPrincipalClass
和NSExtensionMainStoryboard
必须存在一个。
UNNotificationContentExtension协议
- 方法1、获取通知对象
- (void)didReceiveNotification:(UNNotification *)notification;
在此方法中,可以获取到UNNotification
,然后对自定义UI做一些赋值与调整。例如获取UNNotification
对象中的媒体附件:
// 获取到通知content
UNNotificationContent *content = notification.request.content;
// 获取到通知的媒体附件
UNNotificationAttachment *attachment = content.attachments.firstObject;
if([attachment.URL startAccessingSecurityScopedResource]){
UIImage *image = [UIImage imageWithContentsOfFile:attachment.URL.path];
[attachment.URL stopAccessingSecurityScopedResource];
}
- 方法2、拦截通知的action(optional)
- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(void (^)(UNNotificationContentExtensionResponseOption option))completion;
当点击了通知的action之后,会执行该方法,在该方法中可以根据具体action的identifier针对不同的action作出响应。例如,更新UI,某些操作的服务器上报等等。
注意执行completion()
一些需要注意的问题
- 1、关于控制器内部调整view的size,导致自定义视图大小跳动的问题。
效果如下所示:
由上图可以看到,自定义的视图由大变小,有一个动画效果。导致这个跳动的原因是因为,当开始展示通知视图的时候,系统并不知道自定义的视图有多大。
那么解决这个视图大小跳动的问题,我们就可以使用UNNotificationExtensionInitialContentSizeRatio
这个key,来事先指定这个视图的高宽比。这样提前告知系统视图大概有多大,就不会有跳动效果了。
UNNotificationExtensionInitialContentSizeRatio值的范围大小为从0到1。
- 2、在最初展示的图
自定义ui.png
中可以看到整个通知的UI被分成了四部分,在某些情况我们并不需要显示系统默认的通知视图。
而隐藏系统默认的通知视图也非常简单,使用UNNotificationExtensionDefaultContentHidden
key,设置值为true即可。