如何在 iOS10 中使用带有 UNNotification 的通知服务扩展
How to use Notification service extension with UNNotification in iOS10
Apple 引入了新的扩展名称 "UNNotificationServiceExtension",但如何从推送通知启动它?
我读到服务扩展为负载提供端到端加密。
设置推送通知的负载需要哪个键?
如何识别负载以及如何从推送通知启动服务扩展?
让我一步一步来。
UNNotificationServiceExtension - 它是什么?
UNNotificationServiceExtension 是一个 App Extension 目标,您将其与您的应用程序捆绑在一起,目的是在将推送通知传递给设备之前修改推送通知,然后再将其呈现给用户。您可以更改标题、副标题、body,还可以通过下载或使用应用程序中捆绑的附件向推送通知添加附件。
如何创建
转到文件 -> 新建 -> 目标 -> 通知服务扩展并填写详细信息
设置推送通知的负载需要哪个键?
您需要将 mutable-content
标志设置为 1
以触发服务扩展。
此外,如果 content-available
设置为 1
,则服务扩展将不起作用。所以要么不设置,要么设置为0。
(编辑:这不适用。您可以设置或取消设置 content-available
标志)
如何识别有效负载以及如何从推送通知启动服务扩展?
构建扩展,然后构建并 运行 您的应用。发送 mutable-content
设置为 1
的推送通知。
代码
UNNotificationService 公开了两个函数:
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler;
- (void)serviceExtensionTimeWillExpire;
第一个函数在设备收到推送通知并呈现给用户之前触发。您在函数内的代码有机会修改此函数内推送通知的内容。
您可以通过修改扩展的 bestAttemptContent
属性 来实现,它是 UNNotificationContent
的一个实例并且具有以下属性:title
、subtitle
、 body
、attachments
等
远程通知的原始负载通过函数参数request
request.content
属性传送。
最后,您使用 contentHandler 发送了您的 bestAttemptContent:
self.contentHandler(self.bestAttemptContent);
您在第一种方法中完成任务的时间有限。如果时间到期,您的第二个方法将以您的代码迄今为止所做的最佳尝试被调用。
示例代码
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
// Modify the notification content here...
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
self.contentHandler(self.bestAttemptContent);
}
以上代码将[修改]附加到PN负载中的原始标题。
示例负载
{
"aps": {
"alert": {
"title": "Hello",
"body": "body.."
},
"mutable-content":1,
"sound": "default",
"badge": 1,
},
"attachment-url": ""
}
请注意,attachment-url
键是您自定义的键,iOS 无法识别。
通知服务扩展在从通知数据下载内容并在通知中显示图像和其他内容时非常有用。当应用程序处于后台模式或处于活动状态(被杀死)时,您还可以使用通知服务扩展来执行一些代码。
Here is step by step guidelines of how to use notification service extension. And also you got the demo from from github.
Apple 引入了新的扩展名称 "UNNotificationServiceExtension",但如何从推送通知启动它?
我读到服务扩展为负载提供端到端加密。
设置推送通知的负载需要哪个键?
如何识别负载以及如何从推送通知启动服务扩展?
让我一步一步来。
UNNotificationServiceExtension - 它是什么?
UNNotificationServiceExtension 是一个 App Extension 目标,您将其与您的应用程序捆绑在一起,目的是在将推送通知传递给设备之前修改推送通知,然后再将其呈现给用户。您可以更改标题、副标题、body,还可以通过下载或使用应用程序中捆绑的附件向推送通知添加附件。
如何创建
转到文件 -> 新建 -> 目标 -> 通知服务扩展并填写详细信息
设置推送通知的负载需要哪个键?
您需要将 mutable-content
标志设置为 1
以触发服务扩展。
此外,如果
(编辑:这不适用。您可以设置或取消设置 content-available
设置为 1
,则服务扩展将不起作用。所以要么不设置,要么设置为0。content-available
标志)
如何识别有效负载以及如何从推送通知启动服务扩展?
构建扩展,然后构建并 运行 您的应用。发送 mutable-content
设置为 1
的推送通知。
代码
UNNotificationService 公开了两个函数:
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler;
- (void)serviceExtensionTimeWillExpire;
第一个函数在设备收到推送通知并呈现给用户之前触发。您在函数内的代码有机会修改此函数内推送通知的内容。
您可以通过修改扩展的 bestAttemptContent
属性 来实现,它是 UNNotificationContent
的一个实例并且具有以下属性:title
、subtitle
、 body
、attachments
等
远程通知的原始负载通过函数参数request
request.content
属性传送。
最后,您使用 contentHandler 发送了您的 bestAttemptContent:
self.contentHandler(self.bestAttemptContent);
您在第一种方法中完成任务的时间有限。如果时间到期,您的第二个方法将以您的代码迄今为止所做的最佳尝试被调用。
示例代码
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
// Modify the notification content here...
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
self.contentHandler(self.bestAttemptContent);
}
以上代码将[修改]附加到PN负载中的原始标题。
示例负载
{
"aps": {
"alert": {
"title": "Hello",
"body": "body.."
},
"mutable-content":1,
"sound": "default",
"badge": 1,
},
"attachment-url": ""
}
请注意,attachment-url
键是您自定义的键,iOS 无法识别。
通知服务扩展在从通知数据下载内容并在通知中显示图像和其他内容时非常有用。当应用程序处于后台模式或处于活动状态(被杀死)时,您还可以使用通知服务扩展来执行一些代码。
Here is step by step guidelines of how to use notification service extension. And also you got the demo from from github.