Swift 中的应用程序 openURL

Posted

技术标签:

【中文标题】Swift 中的应用程序 openURL【英文标题】:application openURL in Swift 【发布时间】:2014-10-03 11:41:49 【问题描述】:

我在使用 Appdelegate 方法 OpenURL 时遇到问题。

我已经设置了我的导入 UTI 和文档类型。但是从邮件附件打开我的应用程序时,当我实现该方法时,应用程序会立即崩溃。

折旧的handleOpenURL 有效,但OpenURL 无效?

目前我在实现中没有代码,只是返回 true。

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool 
    return true

崩溃说Thread 1: EXC_BAD_ACCESS (code-1, address-0x0)

我真的不想使用已弃用的方法。

【问题讨论】:

您可以尝试将 sourceApplication 参数设置为隐式展开的可选参数,因为这是方法签名之间的签名不匹配和尝试将 nil 传递给非可选参数的典型情况。当然,这也表明了数千个其他可能的错误,因为它只是表明 abort() 被调用...也可能是 annotation 参数需要被隐式解包而不是显式解包。想多了,其实可能性更大。 谢谢大卫,你是对的,它实际上是 sourceApplication 参数。如果您想将此添加为答案,我会接受。再次感谢 【参考方案1】:

这个问题让我头疼了一个星期。 使用微信 / LinkedIn 等社交媒体登录后,我的应用程序不断崩溃。但 Facebook 和 Google 登录工作正常。

我注意到我的应用在微信应用确认登录后会一直崩溃并进入前台。并出现BAD EXCESS错误。我已尝试在 AppDelegate 上删除我的 应用程序打开 url 方法,应用程序不会崩溃,但社交媒体登录操作不起作用。所以我发现我的问题出在特定的方法上。在网上搜索后,我发现我使用了 ApplicationOpenUrl 的弃用方法 作为来自 https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application

的参考
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool 
    return true
 // this method is deprecated in ios 9 https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application

请注意,已弃用的版本正在使用注释:如果您已桥接到诸如微信之类的 Obj-c 框架,则会导致问题。 所以我所做的是,我将我的代码换成新的格式

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 
    let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String
    let annotation = options[UIApplicationOpenURLOptionsKey.annotation]
    let application = app

    return true

希望对您有所帮助。它也将成为我在功能中的参考。感谢 ***

【讨论】:

【参考方案2】:

这是相当典型的 Swift 编译器自动生成的方法签名与实际签名之间的签名不匹配。当您尝试将 nil 从 Objective-C 传递到 Swift 显式解包的可选项时,就会发生这种情况。将 annotation 参数更改为隐式展开,您应该是 gtg。

【讨论】:

【参考方案3】:

Swift 5 版本的 Muhammad Asyraf 的回答:

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool 
        let sourceApplication = options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String
        let annotation = options[UIApplication.OpenURLOptionsKey.annotation]

        return true
    

【讨论】:

以上是关于Swift 中的应用程序 openURL的主要内容,如果未能解决你的问题,请参考以下文章

NSWidgetExtensionContext openURL Swift

'openURL'在iOS 10.0中已被弃用:请使用openURL:options:completionHandler:而不是在Swift 3中[重复]

如何使用 openURL 在 Swift 中拨打电话?

Apple 是不是需要从您的应用程序中对 Safari 中的 openURL 进行网络检测?

来自应用扩展的 openURL

NSWorkspace openURL 未使用文件类型的默认应用程序打开存储在 iCloud Drive 中的文件