我尝试实施新的通知服务扩展,但我遇到了问题。
在我的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)方法从未调用过。
也许我误解了这个扩展是如何运作的?
答案 0 :(得分:25)
检查服务扩展上的部署目标。
在使用10.1的设备上进行测试时,我将部署目标设置为10.2,并且在我更改之前未调用扩展名。
另一个问题可能是调试..为了使其工作您需要附加服务扩展流程。在Xcode菜单中Debug>附加到流程>您的分机名称
答案 1 :(得分:11)
而不是运行应用程序。您必须将服务扩展名作为目标运行。然后它将询问您运行服务扩展程序的应用程序,然后选择您的应用程序并发送通知。
确保部署目标小于服务扩展中的设备操作系统。
请确保有效负载应包含“可变内容”: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" }
不要在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")
另请注意:
您无法修改无声通知或仅播放声音或标记应用程序图标的通知。
答案 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)
这是一个示例,如果您使用 Swift 和 Firebase 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" 这部分很重要,我花了很多时间来找到大多数文档现在无效的确切命名。
接下来的主要事情是我们必须运行应用程序的方式
运行后,您将弹出一个选择您的主项目的弹出窗口
这样它会在您收到通知时调用 NotificationService didReceive 函数(在通知服务扩展中)。