23

我试图实现新的通知服务扩展,但我遇到了问题。

在我的 NotificationService.swift 文件中,我有以下代码:

class NotificationService: UNNotificationServiceExtension {

var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    self.contentHandler = contentHandler
    bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

    if let bestAttemptContent = bestAttemptContent {
        // Modify the notification content here...
        bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"

        print(bestAttemptContent.body)

        contentHandler(bestAttemptContent)
    }
}

override func serviceExtensionTimeWillExpire() {
    // Called just before the extension will be terminated by the system.
    // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
    if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
        contentHandler(bestAttemptContent)
    }
}
}

当我收到推送通知时, didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)方法从未被调用。

也许我误解了这个扩展是如何工作的?

4

9 回答 9

48

检查服务扩展上的部署目标。

在使用 10.1 的设备上进行测试时,我将部署目标设置为 10.2,并且在我更改它之前没有调用扩展。

另一个问题可能是调试。为了使其工作,您需要附加服务扩展流程。在 Xcode 菜单 Debug > Attach To Process > Name of your extension

于 2017-04-07T13:08:31.513 回答
39
  1. 将服务扩展作为目标而不是应用程序运行。然后它会询问您运行服务扩展的应用程序,然后选择您的应用程序并发送通知。

  2. 确保服务扩展的部署目标小于你的物理设备的操作系统版本

  3. 确保有效负载包含“可变内容:1”

{"aps" : {
    "alert" : {
        "title" : "Introduction To Notification",
        "subtitle" : "Session 707",
        "body" : "New Notification Look Amazing"
    },
    "sound" : "default",
    "category" : "message",
    "badge" : 1,
    "mutable-content": 1
    },
    "attachment-url": "https://api.buienradar.nl/Image/1.0/RadarMapNL"
}
  1. 不要在其中添加content-available标志,aps或者如果您已添加,请确保将其设置为0.

---------------------------------------- 如果没有任何效果,请重新启动您的设备 --- ----------------------------------

于 2017-02-13T10:34:47.560 回答
10

我快疯了。最后我意识到我拥有的deployment targetNotification Service Extension10.3我的手机也是)。我改成了10.2,它工作得很好

于 2017-04-12T09:33:18.187 回答
6

如果一切都失败了,请重新启动您的设备。我只花了 2 个小时,然后简单地重新启动我的手机就修复了它。

于 2020-12-07T19:54:12.693 回答
4

您的推送通知负载应包含 "mutable-content" : 1 key value pair

远程通知的 aps 字典包含值设置为 1 的 mutable-content 键。

推送通知有效负载 JSON 的示例:

{
  "aps":{
          "alert": {
                    "body": "My Push Notification", 
                    "title" : "Notification title"},
          "mutable-content" : 1,
          "badge":0},
}

这工作得很好,我收到推送通知如下: 推送通知

另请注意:

您无法修改静音通知或仅播放声音或标记应用程序图标的通知。

您可以尝试PusherHouston来测试推送通知。

于 2016-09-29T10:12:10.443 回答
3

我有同样的问题,但我的问题是通知扩展是“应用程序”。应该是appex

于 2018-07-27T18:12:46.203 回答
2

From docs on UNNotificationServiceExtension class:

  • The remote notification is configured to display an alert.

  • The remote notification’s aps dictionary includes the mutable-content key with the value set to 1.

You cannot modify silent notifications or those that only play a sound or badge the app’s icon.

Basically

Must include:

  • mutable-content: 1
  • an alert dictionary.

Must NOT include:

  • content-available: 1

To summarize Apple is doing its best to not allow apps to mutate silent notifications. It wants to allow that only on user notifications (user facing notifications)

于 2020-06-05T23:37:49.420 回答
0

你需要添加"mutable-content": 1到你的有效载荷

于 2019-03-03T20:56:07.653 回答
0

如果您使用SwiftFirebase 函数(Node.js) 实现发送通知,则这是一个示例,其中包含带有通知服务扩展的附件。下面我只提到了一些要点。

有效载荷样本

const payload = {
    notification: {
        title: name,
        body: messageText,
        badge: "1",
        mutable_content: "true"
    },
    data: {
        type: "MESSAGE",
        fromUserId: name,
        attachmentUrl: imageUrl
    }};

mutable_content: "true"这部分很重要,我花了很多时间来找到确切的命名,现在大多数文档都是无效的。

下一个主要的事情是我们必须运行应用程序的方式

使用您的设备选择通知服务扩展 在此处输入图像描述

运行后,您将弹出一个选择您的主项目的弹出窗口

这样,当您收到通知时,它将调用 NotificationService didReceive 函数(位于 Notification Service Extension 内)。

于 2021-04-14T04:25:18.550 回答