在Swift中使用openURL应用程序

7

我遇到了关于Appdelegate方法OpenURL的问题。

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

废弃的handleOpenURL方法可以工作,但OpenURL不能?

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

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

崩溃信息显示线程1: EXC_BAD_ACCESS (code-1, address-0x0)

我不想使用被废弃的方法。


您可以尝试将sourceApplication参数设置为隐式解包可选型,因为这是方法签名不匹配并尝试将nil传递到非可选参数的典型情况。当然,这也表明可能存在其他几千个可能的错误,因为它只表示调用了abort()... 另外,可能需要将annotation参数隐式解包而不是显式地解包。进一步考虑后,这更有可能。 - David Berry
谢谢David,你是正确的,实际上是sourceApplication参数的问题。如果你想将此作为答案添加,我会接受它。再次感谢。 - BassetMan
3个回答

6
我已经为这个问题绞尽了脑汁一个星期。
我的应用在使用诸如Wechat / LinkedIn等社交媒体登录后,会一直崩溃。但是Facebook和Google的登录功能正常运作。
我注意到,当确认在Wechat应用上登录并进入前台时,我的应用程序将会崩溃,同时会出现BAD EXCESS错误。我试图在AppDelegate中删除我的application open url method,这样应用程序就不会崩溃,但社交媒体登录的操作也无法正常运行。因此,我发现我的问题出在特定的方法上。在搜索网络后,我发现我正在使用一个弃用的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

请注意,被弃用的版本使用了注释:Any,如果您与 Objective-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
}

希望这能帮到你。它将成为我未来的参考,感谢 StackOverflow。

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

1

穆罕默德·阿西拉夫的答案的Swift 5版本:

    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
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接