iOS15 通讯通知图片未显示
iOS 15 Communication Notification picture not shown
我一直在尝试将我的(本地和推送)通知更新为通信通知。
当用户收到来自他们朋友之一的通信事件时,我希望显示的通知包括朋友的个人资料图片。就像新的 iMessage 应用程序一样。
在观看了专门的 WWDC2021 session 之后,我在我的 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
以显示为推送通知或本地通知。
虽然上面的代码没有崩溃并且似乎/有效/,但通知看起来没有任何不同。
使用调试器查看, _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.
我缺少什么才能正确显示朋友的个人资料图片?
谢谢
不幸的是,Apple 在记录通信通知方面做得不好,他们的 WWDC 视频遗漏了大量非常重要的细节,但有几件事:
在您的 Notification Service Extension 的 Info.plist
中,您需要添加以下内容:
NSExtension
-> NSExtensionAttributes
(字典) -> IntentsSupported
(数组) -> INSendMessageIntent
或 INStartCallIntent
.
确保您在主应用程序目标上启用了“通信通知”功能。
最后,你的代码看起来正确,但你需要添加这个(注意:我只针对 INSendMessageIntent
测试过这个)
// Swift
incomingCommunicationIntent.setImage(image, forParameterNamed: \.sender)
// Objective-C
[incomingCommunicationIntent setImage:image forParameterNamed:"sender"];
对于像我一样困惑的人,必须在主目标的 plist 文件中的 NSUserActivityTypes
下添加 INSendMessageIntent
键,如下所示:
<key>NSUserActivityTypes</key>
<array>
<string>INSendMessageIntent</string>
</array>
我一直在尝试将我的(本地和推送)通知更新为通信通知。
当用户收到来自他们朋友之一的通信事件时,我希望显示的通知包括朋友的个人资料图片。就像新的 iMessage 应用程序一样。
在观看了专门的 WWDC2021 session 之后,我在我的 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
以显示为推送通知或本地通知。
虽然上面的代码没有崩溃并且似乎/有效/,但通知看起来没有任何不同。
使用调试器查看, _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.
我缺少什么才能正确显示朋友的个人资料图片?
谢谢
不幸的是,Apple 在记录通信通知方面做得不好,他们的 WWDC 视频遗漏了大量非常重要的细节,但有几件事:
在您的 Notification Service Extension 的
Info.plist
中,您需要添加以下内容:NSExtension
->NSExtensionAttributes
(字典) ->IntentsSupported
(数组) ->INSendMessageIntent
或INStartCallIntent
.确保您在主应用程序目标上启用了“通信通知”功能。
最后,你的代码看起来正确,但你需要添加这个(注意:我只针对
INSendMessageIntent
测试过这个)
// Swift
incomingCommunicationIntent.setImage(image, forParameterNamed: \.sender)
// Objective-C
[incomingCommunicationIntent setImage:image forParameterNamed:"sender"];
对于像我一样困惑的人,必须在主目标的 plist 文件中的 NSUserActivityTypes
下添加 INSendMessageIntent
键,如下所示:
<key>NSUserActivityTypes</key>
<array>
<string>INSendMessageIntent</string>
</array>