我正在尝试使通信通知与我设置的远程推送通知一起使用,特别是这样我可以让用户头像出现在通知中。我已经成功地为我的应用程序设置了一个通知服务扩展,我已经验证了它的工作原理(在
NotificationService
类中命中了断点,并且我能够修改标题),并且通过遵循 guide,我最终得到了使用此代码:
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent {
contentHandler(bestAttemptContent) // REMOVE this if statement
}
let personHandle = INPersonHandle(value: "senderID", type: .unknown)
let person = INPerson(
personHandle: personHandle,
nameComponents: .init(givenName: "senderName", familyName: "family name"),
displayName: "senderName",
image: nil,
contactIdentifier: nil,
customIdentifier: "some-unique-id"
)
let intent = INSendMessageIntent(
recipients: nil,
outgoingMessageType: .outgoingMessageText,
content: "some content",
speakableGroupName: nil,
conversationIdentifier: "unique-user-id-conv",
serviceName: nil,
sender: person,
attachments: nil
)
let interaction = INInteraction(intent: intent, response: nil)
interaction.direction = .incoming
interaction.donate(completion: nil)
do {
let updatedContent = try request.content.updating(from: intent)
let mutableBestAttemptContent = (updatedContent.mutableCopy() as? UNMutableNotificationContent)!
mutableBestAttemptContent.userInfo = request.content.userInfo
contentHandler(mutableBestAttemptContent)
} catch {
}
}
当我收到通知时,此代码将运行,并且我已使用断点验证了
contentHandler(mutableBestAttemptContent)
被调用并且意图已正确捐赠。
目前,我省略了添加图像,因为我想首先获得一个最小的示例,其中显示
person
的名称(尽管我也使用硬编码 INImage(url: validURL)
对此进行了测试,但没有成功),但是该代码不起作用。
此外,我还有以下内容:
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>IntentsSupported</key>
<array>
<string>INSendMessageIntent</string>
</array>
</dict>
...
</dict>
</dict>
<dict>
<key>NSUserActivityTypes</key>
<array>
<string>INSendMessageIntent</string>
</array>
...
</dict>
我对为什么这不起作用感到有点困惑,而且关于此事的文档少得令人震惊,所以我什至不知道如何进行调试。大家有什么想法吗?
更新: 我犯了一个愚蠢的错误,并将立即调用
contentHandler
的自动生成代码保留在函数中。删除该行(我在下面记录过)可以解决此问题。我保留这篇文章是为了帮助其他人了解需要包含的所有其他内容。
您似乎不小心在源代码中留下了一些自动生成的代码,因此总是立即调用
contentHandler
。如果您删除调用它的第一个代码块,它应该可以工作
if let bestAttemptContent {
contentHandler(bestAttemptContent) // REMOVE this if statement
}