INIntent`setImage`使Swift 5中的运行时崩溃

时间:2019-04-17 21:58:24

标签: ios swift sirishortcuts swift5 swift-keypath

自从添加Siri快捷方式以来,我就一直使用INIntent对象。为此,我做了一个意图定义,它自动生成了一个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

似乎我需要使用iOS 12中添加的func keyImage() -> INImage?

但是我不知道为什么它可以在Swift 4.X中运行,并且找不到有关弃用的任何文档。有人知道这个问题吗?

1 个答案:

答案 0 :(得分:2)

据我检查...

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为止 (可能是几年...)