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

iOS Universal Link opens app, does not trigger app delegate methods

我正在尝试在 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 /_/*","/*"]}]}}

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

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

从通用链接打开时不会被调用。在后台尝试了两个应用 运行 并强制关闭。 AASA 验证程序 (https://branch.io/resources/aasa-validator/) says file looks good, and I have tried troubleshooting by re-installing app and observing console logs for 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 检测到通用链接),但委托方法不会被调用。

既然你能打开应用程序,我认为你的 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
}

希望对您有所帮助!

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

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

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

我用的是iOS13和Swift 5、替换application(:continue:restorationHandler:)的方法AppDelegate.swift 文件并添加 场景 (: 继续 :) 方法到 SceneDelgate.swift 文件

以我为例,在 SceneDelegate.swift 文件中添加以下内容:

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

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

    handleURL(urlToOpen)
}

如果你使用Google分析,请参考我的here。问题可能是method swizzling引起的。