iOS 通用链接打开应用程序,不触发应用程序委托方法

Posted

技术标签:

【中文标题】iOS 通用链接打开应用程序,不触发应用程序委托方法【英文标题】:iOS Universal Link opens app, does not trigger app delegate methods 【发布时间】:2020-01-01 12:44:12 【问题描述】:

我正在尝试在 ios 上启用通用链接(作为 Firebase 无密码注册的一部分)。在 iOS 13.2 上进行本地测试。

apple-app-site-associated (AASA) JSON 看起来像这样 (https://lokitools.page.link/apple-app-site-association):

"applinks":"apps":[],"details":["appID":"43S54AHEMG.com.jkalash.Loki","paths":["NOT /_/*","/*"]]

通用链接打开应用程序,但是我无法处理从它们打开的应用程序。委托方法:

    application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool

从通用链接打开时不要被调用。尝试在后台运行两个应用程序并强制关闭。 AASA 验证器 (https://branch.io/resources/aasa-validator/) 说文件看起来不错,我已经尝试通过重新安装应用程序并观察 swcd (https://ios13.dev/universal-links-debugging-on-ios-13-cjwsux93w001p6ws1swtstmzc) 的控制台日志来进行故障排除,但没有出现任何异常,它看起来确实像 AASA文件已下载。

我也尝试过遵循 Apple 的故障排除指南 (https://developer.apple.com/library/archive/qa/qa1916/_index.html),但失败的最后一步(步骤 8)并未涵盖我的情况,即应用程序确实打开了(iOS 检测到通用链接),但委托方法只是不不要被叫。

【问题讨论】:

AppDelegate 中的 didFinishLaunchingWithOptions 方法返回什么? 它总是返回 true 在 Facebook 集成的情况下,存在一个问题。如果您返回 true,则可能是另一个问题。让我分享一下我的工作委托方法。 我遇到了完全相同的问题,除了 iOS 12... 【参考方案1】:

原来这不是通用链接特定的问题,而是 iOS 13 触发应用生命周期事件的方式发生了变化。他们不是通过UIApplicationDelegate,而是通过UISceneDelegate

一个令人困惑的事情是应用程序委托方法并未被弃用,因此如果您同时拥有应用程序委托和场景委托方法但只会调用一个,您将不会收到警告。

请参阅App delegate methods aren't being called in iOS 13以获得全面的答案

【讨论】:

【参考方案2】:

我使用的是iOS 13 和Swift 5,替换AppDelegate.swift 文件的application (: continue: restoreHandler :) 方法并添加scene (: continue :) 方法到 SceneDelgate.swift 文件

就我而言,在 SceneDelegate.swift 文件中添加以下内容:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) 

    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let urlToOpen = userActivity.webpageURL else 
            return
    

    handleURL(urlToOpen)

【讨论】:

【参考方案3】:

由于您可以打开应用程序,我认为您的 AASA 文件一切正常。在我的情况下,以下委托方法可以正常调用:

func application(_: UIApplication, continue userActivity: NSUserActivity, restorationHandler _: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool 
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let url = userActivity.webpageURL else 
        return false
    
    let urlString = url.absoluteString

    var queryParams: [String: String?] = [:]
    if let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
        let params = components.queryItems 
        for param in params 
            queryParams[param.name] = param.value
        
    
    return true


希望对你有帮助!

【讨论】:

问题中已经提到过,通过通用链接打开应用时,不会调用以下委托方法。 我希望这不会成为一个漫长的调试新年我的朋友!希望你快点解决。我只是请求你用这个替换你的实现,然后再检查一次,拜托。 您的 AppDelegate 的最小版本可能值得一看。 想通了并发布了答案,不过感谢您的帮助! 太棒了!很高兴能帮到你:)【参考方案4】:

如果您使用谷歌分析,请参考我的here。该问题可能是由方法调配引起的。

【讨论】:

以上是关于iOS 通用链接打开应用程序,不触发应用程序委托方法的主要内容,如果未能解决你的问题,请参考以下文章

了解通用链接委托方法及其在 iOS 中的用途

iOS 应用程序上的通用链接打开应用程序但不调用处理程序

Firebase 通知在 iOS 10 上触发错误的委托

iOS 11.2 中的通用链接中断

当另一个应用程序打开 Safari 视图控制器时,如何让 branch.io 通用链接工作?

如何弱链接 iOS 应用程序委托方法?