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 通用链接打开应用程序,不触发应用程序委托方法的主要内容,如果未能解决你的问题,请参考以下文章