Изображение уведомления о связи 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 не учитывает массу очень важных деталей, но есть несколько вещей:

  1. В вашем расширении службы уведомлений Info.plist вам нужно добавить это: NSExtension -> NSExtensionAttributes (дикт) -> IntentsSupported (массив) -> или INStartCallIntent.

  2. Убедитесь, что вы включили функцию «Уведомления о связи» в основном целевом приложении.

  3. Наконец, ваш код выглядит правильно, но вам нужно добавить это (примечание: я тестировал это только для 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)

Другие вопросы по тегам