苹果推出了新的扩展名“UNNotificationServiceExtension”,但如何从推送通知中启动它?
我看到服务扩展程序为有效载荷提供端到端加密。
需要哪个密钥设置推送通知的有效载荷?
如何识别有效载荷并从推送通知中启动服务扩展程序?
苹果推出了新的扩展名“UNNotificationServiceExtension”,但如何从推送通知中启动它?
我看到服务扩展程序为有效载荷提供端到端加密。
需要哪个密钥设置推送通知的有效载荷?
如何识别有效载荷并从推送通知中启动服务扩展程序?
让我一步一步来。
UNNotificationServiceExtension - 它是什么?
UNNotificationServiceExtension是一个App扩展目标,您可以将其与应用程序捆绑在一起,旨在在将推送通知发送到设备之前修改它们,并将其呈现给用户时进行修改。您可以更改推送通知的标题、副标题、正文,并通过下载或使用应用程序中打包的内容添加附件。
如何创建
转到“文件”->“新建”->“目标”->“通知服务扩展”,然后填写详细信息。
必须设置哪个密钥以设置推送通知的负载?
您需要将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);
}
上述代码将“[modified]”添加到 PN 载荷中原始标题的末尾。
示例载荷
{
"aps": {
"alert": {
"title": "Hello",
"body": "body.."
},
"mutable-content":1,
"sound": "default",
"badge": 1,
},
"attachment-url": ""
}
请注意,attachment-url
键是您自己关注的自定义键,并不被 iOS 所认可。
content-available
键是正确的。它也可以使用。我已经相应地更新了答案。 - mickeymoon