iOS10之后的通知具有通知扩展功能,可以在系统受到通知、展示通知时做一些事情。
UNNotificationServiceExtension:通知服务扩展,是在收到通知后,展示通知前,做一些事情的。
1. 创建一个UNNotificationServiceExtension
![](https://img.haomeiwen.com/i12673226/42ddf140254c9485.png)
如图创建完可以看到工程中多出一个文件
![](https://img.haomeiwen.com/i12673226/7ca143bc9b4588a2.png)
在NotificationService.m文件中,有两个自动生成的方法:
// 系统接到通知后,有最多30秒在这里重写通知内容(在此方法可进行一些网络请求,如上报是否收到通知等操作)
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler;
// 处理过程超时,则收到的通知直接展示出来
- (void)serviceExtensionTimeWillExpire;
示例代码:
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
NSLog(@"收到推送消息,可进行处理");
// 这里重写一些东西
self.bestAttemptContent.title = @"这里是标题";
self.bestAttemptContent.subtitle = @"这里是子标题";
self.bestAttemptContent.body = @"这里是body";
self.contentHandler(self.bestAttemptContent);
}
效果图:
![](https://img.haomeiwen.com/i12673226/5c7df59516cbbd4a.png)
- 如果,你按照教程给自己的app设置好 Notification Service Extension,但是你的扩展程序没有执行。有可能是远程通知的格式问题。
远程推送消息的格式,如下。
{
"aps":{
"category":"SECRET",
"mutable-content": 1,
"alert":{
"title":"Secret Message!",
"body":"(Encrypted)"
},
}
}
其中 mutable-content字段不能没有,没有的话,就不会走扩展程序的代码;
其中alert字段的值不能没有,没有的话,就不会走扩展程序的代码。
-
最重要最容易忽略的一点,必须要设置target的 Deployment Target
image.png
UNNotificationContentExtension:通知内容扩展,是在展示通知时展示一个自定义的用户界面
1. 创建一个UNNotificationContentExtension
![](https://img.haomeiwen.com/i12673226/078e4ced7a08ef4d.png)
如图创建完可以看到工程中多出一个文件
![](https://img.haomeiwen.com/i12673226/f2703402a9b58e5d.png)
设置Info.plist
![](https://img.haomeiwen.com/i12673226/57f7550d2897f1f8.png)
使用的时候,我们参照如下代码:
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
NSLog(@"收到推送消息,可进行处理");
// 这里重写一些东西
self.bestAttemptContent.title = @"这里是标题";
self.bestAttemptContent.subtitle = @"这里是子标题";
self.bestAttemptContent.body = @"这里是body";
// !!!!! 这里是重点!!!!!!!!!!!!
// 我在这里写死了myNotificationCategory,其实在收到系统推送时,每一个推送内容最好带上一个catagory,跟服务器约定好了,这样方便我们根据categoryIdentifier来自定义不同类型的视图,以及action
//myNotificationCategory这个值要跟info.plist里面的值一样
self.bestAttemptContent.categoryIdentifier = @"myNotificationCategory";
self.contentHandler(self.bestAttemptContent);
}
这里为了方便,我在ContentExtension文件夹下直接更改MainInterface.storyboard文件实现自定义界面
![](https://img.haomeiwen.com/i12673226/a243c481205d1bde.png)
运行效果图
![](https://img.haomeiwen.com/i12673226/c9aaea78437a5604.png)
附:以上两个项目运行要记得选择项目,否则是无效的。
如图:
![](https://img.haomeiwen.com/i12673226/b5bfcf2fcb8859c9.png)
![](https://img.haomeiwen.com/i12673226/38c9904953657bee.png)
网友评论