UNNotificationContentExtension简介
- UNNotificationContentExtension这个类,也是iOS10推送的新特性,官方文档用这么一句话,简单的解释了一下,Presents a custom interface for a delivered local or remote notification.(当你收到远程或者本地通知的时候,弹出一个自定义界面)
- 界面可以分为三大部分
- 顶部:App名称;
- 中部:上中下三个视图和一个自定义的View视图
- 底部:原本的推送标题、推送内容等
如何新建一个UNNotificationContentExtension
创建target
File->New->Target…
选择NotificationContentExtension按钮,然后进行程序的命名
最终会生成下图所示文件夹
- 看过UNNotificationServiceExtension的可以发现,两者的创建流程基本一致,无非生成的文件不同。
如何使用UNNotificationContentExtension
- 下面介绍一下生成的四个文件
NotificationViewController文件
- 看名字就知道这是一个继承UIViewController的控制器文件。
- 在此文件内有两个方法:
- 对于
- (void)viewDidLoad;
就不多说了,基本都会用。 - 对于
- (void)didReceiveNotification:(UNNotification *)notification;
这个方法,内部有一行代码self.label.text = notification.request.content.body;
从这行代码中我们可以看出,这是接收到通知时,进行的回调方法,在这个方法内,我们对页面效果进行修改和展示。 - 使用示例如下:
- 对于
- (void)didReceiveNotification:(UNNotification *)notification {
// 这个方法,可以给自己的控件赋值啊,调整frame啊等等,我在这里打印出来了通知的内容,供大家使用。
NSDictionary *dict = notification.request.content.userInfo;
// 这里可以把打印的所有东西拿出来
NSLog(@"%@",dict);
/****************************打印的信息是************
aps = {
alert = "This is some fancy message.";
badge = 1;
from = "hello word";
imageAbsoluteString = "http://upload.univs.cn/2012/0104/1325645511371.jpg";
"mutable-content" = 1;
sound = default;
};
}
*******************************************/
}
简单介绍其遵守的协议<UNNotificationContentExtension>
- 在
<UNNotificationContentExtension>
中,存在下面这个方法,这个方法的用法与UNNotificationServiceExtension中的一样。
- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(void (^)(UNNotificationContentExtensionResponseOption option))completion;
- 在
<UNNotificationContentExtension>
中,有着这么一个枚举
typedef NS_ENUM(NSUInteger, UNNotificationContentExtensionMediaPlayPauseButtonType) {
// 没有播放按钮
UNNotificationContentExtensionMediaPlayPauseButtonTypeNone,
// 有播放按钮,点击播放之后,按钮依旧存在,类似音乐播放的开关
UNNotificationContentExtensionMediaPlayPauseButtonTypeDefault,
// 有播放按钮,点击后,播放按钮消失,再次点击暂停播放后,按钮恢复
UNNotificationContentExtensionMediaPlayPauseButtonTypeOverlay,
}
- 在
<UNNotificationContentExtension>
中,有以下几个属性
// 设置播放按钮的属性
@property (nonatomic, readonly, assign) UNNotificationContentExtensionMediaPlayPauseButtonType mediaPlayPauseButtonType;
// 设置播放按钮的frame
@property (nonatomic, readonly, assign) CGRect mediaPlayPauseButtonFrame;
// 设置播放按钮的颜色
@property (nonatomic, readonly, copy) UIColor *mediaPlayPauseButtonTintColor;
// 开始跟暂停播放
- (void)mediaPlay;
- (void)mediaPause;
- 在这个协议内也有以下内容:
// 这两个方法只是会被单纯的调用,不会被监听到,因此,也不会在这两个方法内回调。
@interface NSExtensionContext (UNNotificationContentExtension)
// 控制播放
- (void)mediaPlayingStarted
// 控制暂停
- (void)mediaPlayingPaused
@end
- 由于这些属性都是只读的,因此我们只能调用他们的get方法,来设置buttton的样式、大小、颜色
MainInterface.storyboard文件
- 这就是个storyboard文件,系统在创建时就与NotificationViewController进行了绑定,便于开发者进行可视化编程,布局页面效果。
Info.plist文件
- 从上面的截图,可以看出,主要有三个字段NSExtensionAttributes、NSExtensionMainStoryboard、NSExtensionPointIdentifier。
NSExtensionAttributes
- 在这个字段内有UNNotificationExtensionCategory、UNNotificationExtensionInitialContentSizeRatio这两个字段。
UNNotificationExtensionCategory
- 系统生成的是一个字符串类型的Value值,我们可以将其修改成数组类型,然后在内添加元素,示例如下图所示:
- 这里面的两个值是我随便写的,可以与后台商量,确定字段的值。
- 在收到通知的时候,我们可以让后台把这个通知的categoryIdentifier带上,作用是,我们可以根据视频,音乐,图片,来分别自定义我们的通知内容。不同的分类标识符,也会在我们讲到UNNotificationAction的时候,帮助我们区分是什么类型的通知,方便我们对不同类型的通知做出不同的操作行为。
- (void)didReceiveNotification:(UNNotification *)notification {
// 不同的分类标识符
NSString *categoryId = notification.request.content.categoryIdentifier;
}
UNNotificationExtensionInitialContentSizeRatio
- 这个值的类型是一个浮点类型,代表的是高度与宽度的比值。系统会使用这个比值,作为初始化view的大小。举个简单的例子来说,如果该值为1,则该视图为正方形。如果为0.5,则代表高度是宽度的一半。
NSExtensionMainStoryboard
- 系统默认生成的,用于绑定Storyboard和ViewController,可以进行修改,只要不嫌自己重新建一个麻烦。
NSExtensionPointIdentifier
- 系统默认生成的,直接可以用,不用修改。