我想在我的应用程序中集成Siri / Intent扩展,目前基于Swift 2.3。我正在使用Xcode 8 beta 6版本。
该应用甚至无法编译,发出错误
键入' IntentHandler'不符合协议' INSendMessageIntentHandling'
协议需要函数&handle;(sendMessage:completion :)' with type'(sendMessage:INSendMessageIntent,completion:(INSendMessageIntentResponse) - > Void) - >空隙'
Objective-C方法' handleWithSendMessage:完成:'方法提供'句柄(sendMessage:completion :)'与要求的选择器不匹配(' handleSendMessage:完成:')
即使是来自Apple的示例应用程序,UnicornChat也无法使用相同的错误进行编译。我确实将 SWIFT_VERSION 标志更改为是,以支持Swift 2.3
示例代码:
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
let response = INSendMessageIntentResponse(code: .Success, userActivity: userActivity)
completion(response)
}
这失败并出现上述错误。
任何人都知道如何让Siri在Swift 2.3中工作?
答案 0 :(得分:6)
所以,这有帮助
https://forums.developer.apple.com/message/174455#174455
我们需要使用Swift明确定义@objc方法签名。如以下作品。
@objc (handleSendMessage:completion:)
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
//..
}
答案 1 :(得分:1)
显然Xcode 8 beta 6已更新为Swift 3,回调需要@escaping添加到方法中:
func handle(sendMessage intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Swift.Void) {
//..
}
如果Siri委托方法已更新为Swift 3(似乎是这种情况),那么我担心您将不得不使用Swift 3或旧版本的SDK。
答案 2 :(得分:0)
在使用Swift 2.3编译代码时,您需要为Siri和SiriUI目标设置使用Legacy Swift语言版 YES 。
此外,当创建 IntentHandler 和 IntentViewController 时,可能已在Swift 3中创建了方法(正如我所发生的那样)。因此,将类转换为Swift 2.3,并使用 @objc 方法签名以及代理。
对于 IntentHandler ,
@objc (handleSendMessage:completion:)
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
}
@objc (handleSearchForMessages:completion:)
func handle(searchForMessages intent: INSearchForMessagesIntent, completion: (INSearchForMessagesIntentResponse) -> Void) {
}
@objc (handleSetMessageAttribute:completion:)
func handle(setMessageAttribute intent: INSetMessageAttributeIntent, completion: (INSetMessageAttributeIntentResponse) -> Void) {
}
对于 IntentViewController ,
@objc (configureWithInteraction:context:completion:)
func configureWithInteraction(interaction: INInteraction!, context: INUIHostedViewContext, completion: ((CGSize) -> Void)!) {
}
希望这会有所帮助。