无法在 Swift 2.3 中编译 Siri 扩展

Posted

技术标签:

【中文标题】无法在 Swift 2.3 中编译 Siri 扩展【英文标题】:Unable to compile Siri extension in Swift 2.3 【发布时间】:2016-08-31 23:52:29 【问题描述】:

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

【问题讨论】:

你实现了“func handle(sendMessage intent: ...”吗?如果有,请告诉我们。 @JeshuaLacock 请检查编辑。 【参考方案1】:

所以,这有帮助

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

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

@objc (handleSendMessage:completion:)
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) 
 //..

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

OP 正在使用 swift 2.3。 我意识到这一点 - 但看起来委托方法已被修改为 Swift 3。【参考方案3】:

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

另外,当创建 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)!) 

希望这会有所帮助。

【讨论】:

以上是关于无法在 Swift 2.3 中编译 Siri 扩展的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 4.1 编译的模块无法在 Swift 3.2.3 中导入

自定义键盘应用程序扩展 iOS 8 上的 Siri

Siri - Lang Swift 3,INPayBillIntent 不工作,Siri 说“你必须在 DemoApp 中继续,你想打开它吗?”

如何使用 Swift 2.3 和 3.0 编译模块?

我编译 Swift 2.3 项目并在 Xcode 8.1 上有这个问题

我无法在 swift 2.3 中播放保存在目录路径和 AVPlayer 中的视频