【问题标题】:What does the Swift 2 method signature for application:openURL:options: look like?application:openURL:options: 的 Swift 2 方法签名是什么样的?
【发布时间】:2016-01-08 16:35:23
【问题描述】:

我正在开发一个处理自定义 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 方案时,我收到提示“在“应用程序名称”中打开?”,当我点击打开时,它会将我的应用程序带回前台,但没有调用上述方法。

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

【问题讨论】:

  • 您的自定义 URL 方案是否具有 http 或 https 协议?
  • 来自 Apple Developer:如果您的实现从 application:willFinishLaunchingWithOptions: 和 application:didFinishLaunchingWithOptions: 方法返回 false,则不会调用此方法。也许你错过了这个? developer.apple.com/library/ios/documentation/UIKit/Reference/…:
  • @ZellB,感谢您的建议,但事实并非如此。我的 didFinishLaunchingWithOptions: 正在返回 true
  • @bat,我正在实现一个自定义 URL 协议,例如myurl://parameters。它不是使用 HTTP 或 HTTPS 协议,而是我自己的自定义协议。
  • @DuncanC 让 Xcode 自动完成,看起来对我来说是错误的。正确的是func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -&gt; Bool {

标签: ios swift url-scheme openurl


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    函数签名(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
    }
    

    还记得将“方案”(应用名称)添加到您的 info.plist 文件中。像这样从手机上的 Safari 调用

    scheme://host/path?query

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多