You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:50:41