无法在Swift 2.3中编译Siri扩展

时间:2016-08-31 23:52:30

标签: swift xcode8 siri sirikit swift2.3

我想在我的应用程序中集成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中工作?

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)!) {
}

希望这会有所帮助。