iOS 10不会调用通知服务扩展

时间:2016-09-23 14:29:56

标签: ios swift ios10 ios-extensions

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

在我的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)方法从未调用过。

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

9 个答案:

答案 0 :(得分:25)

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

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

另一个问题可能是调试..为了使其工作您需要附加服务扩展流程。在Xcode菜单中Debug>附加到流程>您的分机名称

答案 1 :(得分:11)

  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"
    }
    
  4. 不要在aps中添加“Content-available”标志,如果需要添加make it 0.“Content-available”:0,

答案 2 :(得分:4)

您的推送通知有效负载should contain the "mutable-content" : 1 key value pair

  

远程通知的aps字典包含可变内容键,其值设置为1。

推送通知有效负载JSON:

DataRow[] selected = table.Select("Product_id = 2")

这完全正常,我得到推送通知如下: Push Notification

另请注意:

  

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

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

答案 3 :(得分:2)

我疯了。最后,我意识到我deployment target的{​​{1}}是Notification Service Extension(我的手机也是)。我改为10.3,效果很好

答案 4 :(得分:2)

我有同样的问题,但是我的问题是通知扩展名是“ app”。它应该是 appex

答案 5 :(得分:2)

来自docs on UNNotificationServiceExtension class

  • 远程通知配置为显示alert

  • 远程通知的aps词典包含mutable-content键,其值设置为1

您不能修改无声通知,也不能修改仅播放声音或标记应用程序图标的通知。

基本上

必须包括:

  • mutable-content: 1
  • alert字典。

不得包含:

  • content-available: 1

总而言之,Apple正在尽最大努力不允许应用程序更改无声通知。它希望只允许用户通知(面向用户的通知)

答案 6 :(得分:0)

您需要将"mutable-content": 1添加到有效载荷中

答案 7 :(得分:0)

如果其他所有方法均失败,请重新启动设备。我只花了2个小时就可以了,只需重新启动手机即可解决。

答案 8 :(得分:0)

这是一个示例,如果您使用 SwiftFirebase cloud functions (Node.js) 来实现发送通知具有带有通知服务扩展的附件。 下面我只提到了一些重要的点。

有效载荷示例

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

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

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

使用您的设备选择通知服务扩展 enter image description here

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

这样它会在您收到通知时调用 NotificationService didReceive 函数(在通知服务扩展中)。