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

React Native Deep Linking场景下如何读取链接并提取参数

移动端Deep Linking跳转后提取链接参数实现方案

核心逻辑

所有端的处理流程统一为两步:

  • 捕获触发App启动/页面跳转的完整Deep Link URI
  • 按参数携带的位置(路径段/Query参数段)拆分URI,提取对应参数值
    针对你给出的示例链接myapp://somepage/code=123,参数直接写在路径段中,也可以按业务需求调整为标准Query格式myapp://somepage?code=123,两种形式的解析方案如下。

各端具体实现代码

Android 端

在配置了Deep Link跳转规则的Activity中,分别处理冷启动和后台唤起场景:

import android.net.Uri
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class TargetActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 处理冷启动场景下的Deep Link
        intent?.data?.let { parseDeepLink(it) }
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // 处理后台驻留场景下的Deep Link
        intent?.data?.let { parseDeepLink(it) }
    }

    private fun parseDeepLink(uri: Uri) {
        // 1. 适配标准Query格式:myapp://somepage?code=123
        val codeFromQuery = uri.getQueryParameter("code")

        // 2. 适配路径段格式:myapp://somepage/code=123
        var codeFromPath: String? = null
        uri.pathSegments.forEach { segment ->
            if (segment.startsWith("code=")) {
                codeFromPath = segment.split("=").lastOrNull()
            }
        }
        
        // 此处使用拿到的code值做后续业务处理
        val finalCode = codeFromQuery ?: codeFromPath
    }
}

iOS 端

在SceneDelegate(iOS 13+)或AppDelegate的Deep Link回调中处理:

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        guard let deepLinkUrl = URLContexts.first?.url else { return }
        parseDeepLink(url: deepLinkUrl)
    }

    private func parseDeepLink(url: URL) {
        // 1. 适配标准Query格式:myapp://somepage?code=123
        var codeFromQuery: String?
        if let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false),
           let codeItem = urlComponents.queryItems?.first(where: { $0.name == "code" }) {
            codeFromQuery = codeItem.value
        }

        // 2. 适配路径段格式:myapp://somepage/code=123
        var codeFromPath: String?
        url.pathComponents.forEach { segment in
            if segment.starts(with: "code=") {
                codeFromPath = String(segment.split(separator: "=").last ?? "")
            }
        }
        
        // 此处使用拿到的code值做后续业务处理
        let finalCode = codeFromQuery ?? codeFromPath
    }
}

// iOS 13以下版本在AppDelegate中实现对应回调即可

React Native 跨端框架

使用官方Linking模块处理:

import { useEffect } from 'react';
import { Linking } from 'react-native';

const TargetPage = () => {
    useEffect(() => {
        // 处理冷启动场景
        Linking.getInitialURL().then(url => {
            url && parseDeepLink(url)
        })

        // 处理后台唤起场景
        const linkListener = Linking.addListener('url', event => {
            parseDeepLink(event.url)
        })

        return () => linkListener.remove()
    }, [])

    const parseDeepLink = (url) => {
        const urlObj = new URL(url)
        // 1. 适配标准Query格式:myapp://somepage?code=123
        const codeFromQuery = urlObj.searchParams.get('code')

        // 2. 适配路径段格式:myapp://somepage/code=123
        let codeFromPath = null
        urlObj.pathname.split('/').forEach(segment => {
            if (segment.startsWith('code=')) {
                codeFromPath = segment.split('=')[1]
            }
        })

        // 此处使用拿到的code值做后续业务处理
        const finalCode = codeFromQuery || codeFromPath
    }

    // 页面渲染逻辑
    return <></>
}

注意事项

  • 必须同时覆盖App冷启动和后台驻留唤起两种场景,避免漏捕获Deep Link
  • 参数取值需要做非空校验,避免异常链接格式导致业务逻辑崩溃
  • 如果参数包含中文或特殊字符,需要先做URL解码再使用

内容的提问来源于stack exchange,提问作者nodabasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:06:04