如何在iOS中使用UNNotification的通知服务扩展

16

苹果推出了新的扩展名“UNNotificationServiceExtension”,但如何从推送通知中启动它?

我看到服务扩展程序为有效载荷提供端到端加密。

需要哪个密钥设置推送通知的有效载荷?

如何识别有效载荷并从推送通知中启动服务扩展程序?


1
观看这些视频。https://developer.apple.com/videos/play/wwdc2016/707/ https://developer.apple.com/videos/play/wwdc2016/708/ - matt
2个回答

47

让我一步一步来。

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实例,并具有属性:titlesubtitlebodyattachments等。

远程通知的原始有效负载通过函数参数requestrequest.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 所认可。


1
简明扼要的回答。良好的解释。特别是对于“您需要将'mutable-content'标志设置为1以触发服务扩展。此外,如果将'content-available'设置为1,则服务扩展将无法工作。因此,请不要设置它或将其设置为0。” - technerd
1
从服务扩展中调用AppDelegate方法是否可行? - Dmitry
1
@Foriger,你说的 content-available 键是正确的。它也可以使用。我已经相应地更新了答案。 - mickeymoon
2
@Dmitry,你无法从扩展中调用UIApplication,因此也无法访问你的应用程序委托。 - Jonny
2
请注意,如果您正在使用Firebase云消息传递,则密钥的名称为“mutable_content”,而不是“mutable-content”(下划线与破折号)。 - N S
显示剩余11条评论

2
通知服务扩展在从通知数据中下载内容并在通知中显示图像和其他内容方面非常有用。您还可以使用通知服务扩展在应用程序处于后台模式或非活动(已杀死)状态时执行一些代码。 这里提供了如何使用通知服务扩展的逐步指南。您还可以从github获取演示。
注:Original Answer翻译成“最初的回答”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接