7

我一直在尝试将我的(本地和推送)通知更新为通信通知。

当用户从他们的一位朋友那里收到通信事件时,我希望显示的通知包括朋友的个人资料图片。就像新的 iMessage 应用程序一样。

在观看了专门的 WWDC2021 会议后,我在我的 SwiftUI 应用程序中添加了一个 Siri Intent:

// I correctly added the StartCallIntent to both my app's Info.plist and the Siri Intent extension.
<array>
    <string>INStartCallIntent</string>
</array>

并尝试使用以下内容更新我的通知流程:

let image = INImage(imageData: friend.profilePicture.cellImage.pngData()!)
let intentFriend = INPerson(
  personHandle: INPersonHandle(value: friend.phoneNumber, type: .phoneNumber),
  nameComponents: friend.nameComponents,
  displayName: friend.localName,
  image: image,
  contactIdentifier: nil,
  customIdentifier: nil,
  isMe: false,
  suggestionType: .instantMessageAddress
)

let incomingCommunicationIntent = INStartCallIntent(
  callRecordFilter: nil,
  callRecordToCallBack: nil,
  audioRoute: .unknown,
  destinationType: .normal,
  contacts: [intentFriend],
  callCapability: .audioCall
)

let interaction = INInteraction(intent: incomingCommunicationIntent, response: nil)
interaction.direction = .incoming
interaction.donate(completion: nil)

do {
  let result = try notification.updating(from: incomingCommunicationIntent)
  return result
} catch let error {
  print("-- \(error)")
  // TODO: Handle error here
}

return notification

然后处理返回UNNotificationContent的内容以显示为推送通知或本地通知。

虽然上面的代码没有崩溃并且似乎 /work/,但通知看起来并没有什么不同。使用调试器查看,_UNNotificationCommunicationContext已初始化,但是:

  • _displayName是零
  • _recipients为空(如预期的那样)
  • _contentURL是零
  • _attachments是空的
  • sender设置UNNotificationContact
    • handle&displayName设置正确
    • _handleType似乎也正确设置

在应用程序的日志中,我可以看到:

[Intents] -[INCache cacheableObjectForIdentifier:] Unable to find cacheable object with identifier EDB29166-E46A-CF23-AB27-8B61F763A039 in cache.
[Intents] -[INCache cacheableObjectForIdentifier:] Unable to find cacheable object with identifier intents-remote-image-proxy:?proxyIdentifier=EDB29166-E46A-CF23-AB27-8B61F763A039.png&storageServiceIdentifier=com.apple.Intents.INImageServiceConnection in cache.

我缺少什么来正确显示朋友的个人资料图片?

谢谢

4

2 回答 2

8

不幸的是,Apple 在记录通信通知方面做得并不好,他们的 WWDC 视频留下了大量非常重要的细节,但有几件事:

  1. 在您的通知服务扩展中Info.plist,您需要添加以下内容: NSExtension-> NSExtensionAttributes(dict) -> IntentsSupported(array) -> INSendMessageIntentor INStartCallIntent.

  2. 确保您在主应用程序目标上启用了“通信通知”功能。

  3. 最后,您的代码看起来正确,但您需要添加这个(注意:我只测试过这个INSendMessageIntent

// Swift
incomingCommunicationIntent.setImage(image, forParameterNamed: \.sender)

// Objective-C
[incomingCommunicationIntent setImage:image forParameterNamed:"sender"];
于 2021-08-08T22:25:49.030 回答
1

对于那些像我一样困惑的人,必须在主目标的 plist 文件中INSendMessageIntent添加密钥,如下所示:NSUserActivityTypes

<key>NSUserActivityTypes</key>
<array>
  <string>INSendMessageIntent</string>
</array>
于 2022-01-18T13:57:02.270 回答