【问题标题】:iOS Universal Link opens app, does not trigger app delegate methodsiOS 通用链接打开应用程序,不触发应用程序委托方法
【发布时间】: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 /_/*","/*"]}]}}

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

  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/) 说文件看起来不错,我已经尝试通过重新安装应用程序并观察 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...

标签: ios swift deep-linking ios13 ios-universal-links


【解决方案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。该问题可能是由方法调配引起的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-23
        相关资源
        最近更新 更多