3

我想在我的应用程序中集成 Siri/Intent 扩展,目前基于 Swift 2.3。我正在使用 Xcode 8 beta 6 构建。

该应用程序甚至无法编译,给出错误为


类型“IntentHandler”不符合协议“INSendMessageIntentHandling”

协议需要函数 'handle(sendMessage:completion:)' 类型为 '(sendMessage: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) -> Void'

由方法“handle(sendMessage:completion:)”提供的 Objective-C 方法“handleWithSendMessage:completion:”与需求的选择器 (“handleSendMessage:completion:”) 不匹配


即使是来自 Apple 的示例应用程序,UnicornChat 也无法编译并出现相同的错误。我确实将SWIFT_VERSION标志更改为Yes,以支持 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 中工作?

4

3 回答 3

6

所以,这有帮助

https://forums.developer.apple.com/message/174455#174455

我们需要用 Swift 显式定义 @objc 方法签名。如以下作品。

@objc (handleSendMessage:completion:)
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
 //..
}
于 2016-09-02T17:29:20.943 回答
1

显然 Xcode 8 beta 6 已经更新到 Swift 3 并且回调需要 @escaping 添加到方法中:

func handle(sendMessage intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Swift.Void) {  
  //..  
}

如果 Siri 委托方法已更新为 Swift 3(似乎是这种情况),那么恐怕您也必须使用 Swift 3 或旧版本的 SDK。

于 2016-09-01T21:26:09.823 回答
0

使用 Swift 2.3 编译代码时,您需要将Siri 和 SiriUI 目标的Use Legacy Swift Language Version设置为YES

此外,当创建IntentHandlerIntentViewController时,可能已经在 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)!) {
}

希望这有帮助。

于 2016-11-30T19:08:56.490 回答