自从添加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)
。
https://developer.apple.com/documentation/sirikit/inintent
似乎我需要使用iOS 12中添加的func keyImage() -> INImage?
。
但是我不知道为什么它可以在Swift 4.X中运行,并且找不到有关弃用的任何文档。有人知道这个问题吗?
答案 0 :(得分:2)
据我检查...
Objective-C中提供了这两种方法。
这些方法的生成接口显示为...
// 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
或