iOS App完全关闭时Deeplink无法正常跳转的问题排查
App配置了Deeplink后,后台运行状态下点击链接能正常打开首页并跳转至指定页面,但完全关闭App(冷启动)后,仅能打开首页,无法完成后续跳转。
当前处理代码(AppDelegate)
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL else { return false } // 调用方法处理Deeplink并打开对应页面 return true }
当前Applinks配置JSON
{ "applinks": { "apps": [], "details": [ { "appID": "appIdOne", "paths": [ "*" ] }, { "appID": "appIdTwo", "paths": [ "*" ] }, { "appID": "appIdThree", "paths": [ "*" ] } ] } }
问题疑问
是否存在配置遗漏?参考相关问题,怀疑缺少"content_available":true字段,该字段应添加在何处?
问题分析与解决方案
1. 核心问题:冷启动场景未处理Deeplink
你当前的代码只处理了App后台唤醒的情况(对应application(_:continue:restorationHandler:)方法),但冷启动时,系统不会调用这个方法,而是会触发application(_:didFinishLaunchingWithOptions:)(iOS 12及以下,或未启用SceneDelegate)或scene(_:willConnectTo:options:)(iOS 13+,使用SceneDelegate)。这才是冷启动时无法跳转的根本原因。
2. content_available与Deeplink无关
你提到的content_available是APNs推送中的字段,用于唤醒后台的App处理推送内容,和Deeplink的冷启动跳转没有关系,不需要添加到Applinks的JSON配置里。
3. 修复方案:补充冷启动场景的Deeplink处理
情况一:使用AppDelegate(未启用Scene)
在application(_:didFinishLaunchingWithOptions:)中读取冷启动时的Deeplink参数,调用统一的处理逻辑:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 处理通过URL直接启动的情况 if let url = launchOptions?[.url] as? URL { handleDeeplink(url: url) } // 处理通过NSUserActivity启动的情况(比如Universal Links) if let userActivityDict = launchOptions?[.userActivityDictionary] as? [String: Any], let userActivity = NSUserActivity(activityDictionary: userActivityDict), userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL { handleDeeplink(url: incomingURL) } return true } // 抽离公共Deeplink处理方法 private func handleDeeplink(url: URL) { // 这里写你的跳转逻辑:解析URL路径、参数,跳转到指定页面 }
情况二:使用SceneDelegate(iOS 13+)
在scene(_:willConnectTo:options:)中读取冷启动时的Deeplink信息:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // 处理URL Contexts if let urlContext = connectionOptions.urlContexts.first { let incomingURL = urlContext.url handleDeeplink(url: incomingURL) urlContext.urlHandler?(true) } // 处理UserActivity if let userActivity = connectionOptions.userActivities.first, userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL { handleDeeplink(url: incomingURL) } } // 公共处理方法 private func handleDeeplink(url: URL) { // 跳转逻辑实现 }
4. 现有Applinks配置无问题
你当前的Applinks JSON配置是正常的,paths设为["*"]表示匹配所有路径,多个AppID的配置也符合要求,不需要额外修改。
内容的提问来源于stack exchange,提问作者I Don't Tell

