INIntent `setImage` вызывает сбой во время выполнения в Swift 5 - PullRequest
1 голос
/ 18 апреля 2019

Я использовал INIntent объект с момента добавления ярлыка Siri. Для этого я сделал определение намерения, и он автоматически сгенерировал объект INIntent.

@available(iOS 12.0, watchOS 5.0, *)
@objc(SpotConditionIntent)
public class SpotConditionIntent: INIntent {

    @NSManaged public var spotId: String?
    @NSManaged public var spotName: String?

}

Чтобы настроить экран записи голоса с помощью ярлыка Siri, я добавил удобный инициализатор. Это было в основном добавить suggestedInvocationPhrase и верхнее изображение значка.

@available(iOS 12, *)
extension SpotConditionIntent {
    convenience init(spotId: String, spotName: String) {
        self.init()
        self.spotId = spotId
        self.spotName = spotName
        self.suggestedInvocationPhrase = "\(NSLocalizedString("how_are_waves_text", comment: "How are the waves at")) \(spotName)?"
        if let uiimage = UIImage(named: "check-surf-icon"), let data = uiimage.pngData() {
            let inImage = INImage(imageData: data)
            setImage(inImage, forParameterNamed: \.spotName)
        }
    }
}

Сегодня я попытался преобразовать весь проект в Swift 5, и проблем со сборкой не было. (Фактического изменения в коде не было.) Однако он вылетает во время выполнения с очень странным сообщением.

Поток 1: фатальная ошибка: не удалось распутать тип пути ключа от XXXX9SpotConditionIntentCXD

и он указал setImage(inImage, forParameterNamed: \.spotName).

Я только что обнаружил, что setImage(,forParameterNamed) не существует в документации.

enter image description here

https://developer.apple.com/documentation/sirikit/inintent

Похоже, мне нужно использовать func keyImage() -> INImage?, который добавлен в iOS 12.

Но я понятия не имею, почему он работает в Swift 4.X и не может найти какую-либо документацию для устаревания. Кто-нибудь знает об этой проблеме?

1 Ответ

2 голосов
/ 18 апреля 2019

Насколько я проверил ...

Два метода доступны в Objective-C.

- imageForParameterNamed:

- setImage: forParameterNamed:

И сгенерированный интерфейс для этих методов показан как ...

// Set an image associated with a parameter on the receiver. This image will be used in display of the receiver throughout the system.
@available(iOS 12.0, *)
open func __setImage(_ image: INImage?, forParameterNamed parameterName: String)

@available(iOS 12.0, *)
open func __image(forParameterNamed parameterName: String) -> INImage?

Документы или подсказки кода Xcode не покажут вам их, но вы можете использовать их в коде Swift 5:

    intent.__setImage(image, forParameterNamed: "spotName")

Однако при отправке приложения в App Store использование методов с подчеркиванием может рассматриваться как использование частных API.

Подобные вещи иногда случаются, когда Apple упрощает некоторые методы и еще не завершена.

На данный момент, что вы можете сделать ...

  • Отправить отчет об ошибке в Apple, немедленно

  • Напишите оболочку Objective-C для этих методов и импортируйте ее в Swift

или

  • Задержка отправки до тех пор, пока не будет предоставлен новый SDK с исправленной проблемой (Могут быть годы ...)
...