Изображение уведомления о связи iOS 15 не отображается
Я пытался обновить свои (локальные и push) уведомления до уведомлений о связи.
Когда пользователь получает событие связи от одного из своих друзей, я хочу, чтобы отображаемое уведомление включало изображение профиля друга. Как и в новом приложении iMessage.
После просмотра специального сеанса WWDC2021 я добавил намерение Siri в свое приложение SwiftUI:
// 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 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
затем обрабатывается для отображения либо как push-уведомление, либо как локальное.
Хотя приведенный выше код не дает сбоев и работает / работает /, уведомление не выглядит иначе. При просмотре отладчика
_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 ответа
К сожалению, Apple не проделала большой работы по документированию коммуникационных уведомлений, их видео на WWDC не учитывает массу очень важных деталей, но есть несколько вещей:
В вашем расширении службы уведомлений
Info.plist
вам нужно добавить это:NSExtension
->NSExtensionAttributes
(дикт) ->IntentsSupported
(массив) -> илиINStartCallIntent
.Убедитесь, что вы включили функцию «Уведомления о связи» в основном целевом приложении.
Наконец, ваш код выглядит правильно, но вам нужно добавить это (примечание: я тестировал это только для
INSendMessageIntent
)
// Swift
incomingCommunicationIntent.setImage(image, forParameterNamed: \INStartCallIntent.sender)
// Objective-C
[incomingCommunicationIntent setImage:image forParameterNamed:"sender"];
Для тех, кто запутался, как я,
INSendMessageIntent
ключ должен быть добавлен в
NSUserActivityTypes
в файле plist в основной цели, например:
<key>NSUserActivityTypes</key>
<array>
<string>INSendMessageIntent</string>
</array>
Для тех, у кого проблемы с инициализацией URL, используйте это:
extension INImage {
convenience init?(contentsOf url: URL) {
if let data = try? Data(contentsOf: url) {
self.init(imageData: data)
} else {
return nil
}
}
}
Это похоже на обходной путь, но работает.
Нашел где-то в инете, но потерял исходник, извините
Для тех, кому нужно более подробное решение, Dexwell опубликовал отличную суть с кодом Swift .
В любом случае, предоставленное решение, похоже, работает, начиная с iOS 15 Beta 4 (оно не работает в Beta 2, и я не мог попробовать в Beta 3)