通过deep linking从浏览器打开iOS/Android应用时如何传递数据
第一步:构造带参数的Deep Link URI
你需要先和移动端开发约定好Deep Link的路径、参数规则,把需要传递的数据放在URI的路径或者查询参数中,示例格式如下:
# 自定义Scheme格式 myapp://tab/3?product_id=12345 # Universal Link/安卓App Link格式 https://yourdomain.com/tab/3?product_id=12345
上述示例中/tab/3表示跳转到第4个标签页(下标从0开始),product_id=12345是额外传递的业务参数。
安卓端数据解析与页面跳转逻辑
在你配置了Deep Link入口的Activity(通常是首页Activity)中,添加URI解析逻辑,在onCreate和onNewIntent生命周期中读取传入的Intent数据:
private fun handleDeepLink() { intent.data?.let { uri -> // 提取路径判断要跳转的页面 val pathSegments = uri.pathSegments if (pathSegments.firstOrNull() == "tab") { val tabIndex = pathSegments.getOrNull(1)?.toIntOrNull() ?: 0 // 选中对应标签 viewPager.currentItem = tabIndex // 提取额外参数 val productId = uri.getQueryParameter("product_id") // 如果需要在对应标签页内跳转子页面,继续传递参数即可 } } } // 应用冷启动从Deep Link打开时在onCreate调用 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... 其他初始化逻辑 handleDeepLink() } // 应用在后台存活时从Deep Link打开时调用 override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) setIntent(intent) handleDeepLink() }
iOS端数据解析与页面跳转逻辑
根据你使用的是自定义Scheme还是Universal Link,在对应的回调方法中获取传入的URL,统一解析后执行跳转:
// 统一处理Deep Link逻辑 func handleDeepLink(url: URL) { guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return } let pathSegments = components.pathComponents // 匹配标签跳转规则 if pathSegments.contains("tab") { guard let index = pathSegments.firstIndex(of: "tab"), index + 1 < pathSegments.count else { return } guard let tabIndex = Int(pathSegments[index + 1]) else { return } // 选中对应标签页 tabBarController.selectedIndex = tabIndex // 提取查询参数 let productId = components.queryItems?.first { $0.name == "product_id" }?.value // 传递参数到对应标签页,执行子页面跳转逻辑 } } // 自定义Scheme回调 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { handleDeepLink(url: url) return true } // Universal Link回调 func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return false } handleDeepLink(url: url) return true }
用户上传的示例代码参考:
注意事项
- 所有路径规则、参数命名需要调用方和移动端提前约定一致,避免解析失败
- 要做好异常兼容:如果路径匹配失败、参数格式错误,默认留在首页即可,不要出现崩溃
- 如果应用已经在后台运行,不要重新初始化首页,直接在现有页面栈的基础上执行跳转,安卓端可以给入口Activity配置
singleTask启动模式避免重复创建实例 - 如果需要跳转到标签页下的二级子页面,拿到参数后直接在对应标签页的导航栈中push对应的页面即可
内容的提问来源于stack exchange,提问作者Arunraj A V
相关产品推荐
相关产品推荐

