Swift 2 application:openURL:options: 的方法签名是什么样的?

What does the Swift 2 method signature for application:openURL:options: look like?

我正在开发处理自定义 URL 方案的应用程序的 Swift 版本。

您需要实现的方法在 iOS 9.

中发生了变化

Objective-C 版本的方法在 Objective-C 应用程序中运行良好:

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<NSString *,
                     id> *)options
{
  //my code here
}

然而,在我的 Swift 应用程序中,等效函数:

func application(application: UIApplication,
  openURL: NSURL,
  options: [String : AnyObject]) -> Bool
{
  //My code here
}

当我在 iOS 9 设备上 运行 应用程序时,从未调用过。当我在 Safari 中调用我的自定义 URL 方案时,我得到提示 'Open in "appname"?',当我点击打开时,它会将我的应用程序带回前台,但不会调用上述方法。

我的方法签名中一定有一些细微的不匹配,但我看不到。我究竟做错了什么?我尝试了各种变体,none 其中有效。

我的问题似乎是由损坏的项目引起的。我创建了一个新项目文件并在新项目中复制了相同的代码, application:openURL:options: 被正确调用。

这是一个很奇怪的问题。如果我删除故障项目中的 "AppDelegate.swift" 并将其替换为 AppDelegate.m/AppDelegate.h,则 Objective-C 版本中会正确调用 application:openURL:options:

我怀疑 Xcode 中存在间歇性错误,导致某些项目在 Swift 中的应用程序委托时无法调用您的应用程序委托的 application:openURL:options:

如果您遇到同样的问题,您可能需要创建一个新项目,设置您的 info.plist,然后复制 application:openURL:options: 方法以查看新项目是否调用您的方法。

函数签名(iOS9)是:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool

如果您想测试它是否正常工作,只需将其复制到您的应用委托中即可:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool 
{
        print("Scheme: \(url.scheme)")
        print("Host: \(url.host)")
        print("Path: \(url.path)")
        print("Query String: \(url.query)")

        // DEBUG: get all key-value pairs in options also
        for (key, value) in options {
            print("Key: \(key), Value: \(value)")
        }
        return true
}

另外记得将 "scheme"(应用程序名称)添加到您的 info.plist 文件中。从 Safari 在 phone 上像这样调用

scheme://host/path?query