Advanced Notifications 之 Notifications Content Extension(自定义通知UI)

本文会涉及iOS10中的UserNotifications框架,关于UN框架的介绍可以看这里iOS 7 8 9 10本地和推送通知踩坑之旅,适配iOS10之自定义推送通知


日常的推送开发中我们接触到最多的就是系统默认的Notification's UI了,那么除了使用系统默认的UI样式,能不能自定义推送的UI呢?

我们可以借助Notifications Content Extension这个扩展进行非常方便的UI自定义。

如下图所示:


自定义ui.png

但需要注意的是,自定义UI不能响应点击事件。

创建 Notifications Content Extension


创建Notifications Content Extension.png

创建好的Notifications Content Extension包含四个文件,分别是:

  • NotificationViewController头文件与m文件
  • MainInterface.storyboard
  • Info.plist

Notifications Content Extension文件目录.png

其中NotificationViewController继承自UIViewController,且实现了UNNotificationContentExtension协议。

那么当一个通知发出之后,系统是如何得知这个通知的UI是通过Notifications Content Extension设置的呢。

这里就需要在Info.plist中配置UNNotificationExtensionCategory的值,如下图:

UNNotificationExtensionCategory配置.png

UNNotificationExtensionCategory的值为payload中设置的category,且需要在主工程中进行注册,关于如何注册上文中已经提过。payload格式示例如下:

{"aps":{"alert":"hahhahah","badge":1,"sound":"default", "category" : "iOS10-category-identifier"}}

如果不想用sb布局,那么你就可以把NSExtensionMainStoryboard这个key删掉,使用NSExtensionPrincipalClass配置你的初始化控制器。

注意NSExtensionPrincipalClassNSExtensionMainStoryboard必须存在一个。

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,某些操作的服务器上报等等。

action响应更新ui.gif

注意执行completion()

一些需要注意的问题

  • 1、关于控制器内部调整view的size,导致自定义视图大小跳动的问题。
     效果如下所示:
ui跳动问题.gif

由上图可以看到,自定义的视图由大变小,有一个动画效果。导致这个跳动的原因是因为,当开始展示通知视图的时候,系统并不知道自定义的视图有多大。

那么解决这个视图大小跳动的问题,我们就可以使用UNNotificationExtensionInitialContentSizeRatio这个key,来事先指定这个视图的高宽比。这样提前告知系统视图大概有多大,就不会有跳动效果了。

UNNotificationExtensionInitialContentSizeRatio值的范围大小为从0到1。

  • 2、在最初展示的图自定义ui.png中可以看到整个通知的UI被分成了四部分,在某些情况我们并不需要显示系统默认的通知视图。

而隐藏系统默认的通知视图也非常简单,使用UNNotificationExtensionDefaultContentHiddenkey,设置值为true即可。

你可能感兴趣的:(Advanced Notifications 之 Notifications Content Extension(自定义通知UI))