Я использовал 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)
не существует в документации.
https://developer.apple.com/documentation/sirikit/inintent
Похоже, мне нужно использовать func keyImage() -> INImage?
, который добавлен в iOS 12.
Но я понятия не имею, почему он работает в Swift 4.X и не может найти какую-либо документацию для устаревания. Кто-нибудь знает об этой проблеме?