无法在 Swift 3 / iOS 10 中触发 continueUserActivity

cannot trigger continueUserActivity in Swift 3 / iOS 10

注意:我想出了其中的大部分 - 请参阅最后的更新。还是有些迷糊。

我正在尝试在 Swift 3 下的 Xc8b6 中实现 NSUserActivity 处理,但在处理程序协议方法的方法签名方面遇到了问题。

在当前文档中,该方法被称为:

func application(_ application: UIApplication, 
                 continue userActivity: NSUserActivity, 
       restorationHandler: @escaping ([Any]?) -> Void) -> Bool

这与我在 swift header 界面中看到的略有不同。在那里,restorationHandler 中的 return 类型是 Swift.Void.

当我尝试这个时,我得到的错误是:

Objective-C method 'application:continue:restorationHandler:' provided by method 'application(_:continue:restorationHandler:)' does not match the requirement's selector ('application:continueUserActivity:restorationHandler:')

我意识到编译器警告现在不是很好,但我认为这意味着它找到了 Obj-C 方法签名,但不知何故我的论点不完全匹配。

我不知道还能用这个做什么。它与那里的内容相匹配 - 但 某些东西 是错误的。随机猜测和检查还没有帮助我。

有趣的是,自动完成给了我一个不同的方法签名:

public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool

这个的好处是它可以编译。不太好的事情是,当我 select 来自 Spotlight 的索引项目并点击它启动应用程序时,它不会被触发。

很明显,我的 NSUserAction 正确识别了该应用程序并启动了它。有什么我可能会在这里遗漏的东西,它不会触发 restorationHandler 吗?请注意,这是从 运行 在 iOS 下正常的项目转换而来的 9.

我还在 WWDC 视频中的 What's New With Search 中看到了协议方法签名的另一个版本。我试过了,它编译了但也没有触发。

四舍五入,这是我在 Swift 3 转换工具完成后得到的签名。它已编译,但在从 spotlight 启动时没有被触发:

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool

----更新-----

好的。所以上面提到的第一个方法签名是正确的。问题是我在 AppDelegate 的扩展中定义了它。这在 Swift 2.x 中运行良好。

我已经上移了,一切正常。但是我想更好地理解为什么在从扩展实现协议方法时会出现这些编译错误。它不再符合协议吗?如果我尝试将它添加到扩展中,我会收到一条错误消息,指出它是重复的,所以我认为这还不够。

最初的问题是关于为什么没有调用 continueUserActivity(以及正确的签名是什么),所以我会在这里回答这个问题,并进一步说明出了什么问题。

正确的签名是我放在 post:

顶部的
func application(_ application: UIApplication, 
                 continue userActivity: NSUserActivity, 
       restorationHandler: @escaping ([Any]?) -> Void) -> Bool

请记住,此签名与 Xc8b6 中提供的自动完成功能不同,因此我怀疑其他人可能会遇到此问题并从中受益。

我原来的问题是它没有编译,因为我是在一个扩展中编译的。为清楚起见:

extension AppDelegate {
  func application(_ application: UIApplication,
                   continue userActivity: NSUserActivity,
                   restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    return true
  }
}

这适用于任何较旧的 iOS 9 / Swift 2.x 项目(具有较旧的 continueUserActivity 签名)。我仍然不确定为什么,但它不会在 Xc8 / Swift 3.

的扩展中编译

我将它移到了 class 范围,现在它工作正常。

因此,看起来从 Swift 3 开始,协议方法只能在协议附加到 class 的范围内访问。

这意味着协议 UIApplicationDelegate 内的所有 AppDelegate 方法只能在 class AppDelegate 或符合 UIApplicationDelegate

如果您尝试访问符合 UIApplicationDelegate 的 class/extension 之外的 UIApplicationDelegate 方法,您将无法编译。