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

React Native实现referral link功能:唤起APP预填referral code或引导下载

React Native 推荐链接唤起应用并预填邀请码方案

完全可行,以下是一套落地的实现方案,核心依赖深层链接(Deeplink) + 参数持久化完成需求:

一、核心逻辑梳理

用户点击推荐链接时,先尝试唤起已安装的App并传递referral code;若唤起失败,跳转至应用商店下载,同时将referral code持久化在用户设备中;用户安装打开App后,读取该参数并自动预填到注册表单。

二、深层链接(Deeplink)配置与网页唤起逻辑

1. 配置App的深层链接协议

Android端

在AndroidManifest.xml的主Activity节点下添加intent-filter,指定自定义scheme和host:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
        android:scheme="yourapp"
        android:host="referral"
        android:pathPattern="/.*" />
</intent-filter>

配置后,yourapp://referral?code=ABC123这类链接即可唤起App。

iOS端

  • 在Info.plist中添加URL Types,设置URL Schemes为yourapp;
  • 若需要更稳定的HTTPS链接唤起,可配置Associated Domains,添加applinks:yourdomain.com(需在域名后台配置对应的apple-app-site-association文件)。

2. 网页端处理唤起与跳转

在推荐链接对应的网页中,实现“先唤起App,超时跳应用商店”的逻辑,同时持久化referral code:

function handleReferral() {
    const referralCode = new URLSearchParams(window.location.search).get('code');
    if (!referralCode) return;

    // 存储referral code到本地,供App后续读取
    localStorage.setItem('referral_code', referralCode);
    document.cookie = `referral_code=${referralCode}; path=/; domain=yourdomain.com`;

    // 尝试唤起App
    const appLink = `yourapp://referral?code=${referralCode}`;
    const timeout = setTimeout(() => {
        // 唤起失败,跳转应用商店
        const storeUrl = /iPhone|iPad|iPod/.test(navigator.userAgent) 
            ? 'https://apps.apple.com/cn/app/your-app-id' 
            : 'https://play.google.com/store/apps/details?id=your.package.name';
        window.location.href = storeUrl;
    }, 1000);

    // 监听页面状态,判断是否唤起成功
    document.addEventListener('visibilitychange', () => {
        if (document.hidden) clearTimeout(timeout);
    });

    window.location.href = appLink;
}

// 页面加载时执行
handleReferral();

三、React Native端参数处理与预填逻辑

1. 读取唤起时的深层链接参数

使用React Native官方Linking API监听App启动/前台唤起时的链接,提取并存储referral code:

import { Linking, AsyncStorage } from 'react-native';
import { useNavigation } from '@react-navigation/native';

function App() {
    const navigation = useNavigation();

    useEffect(() => {
        // 读取App启动时的初始链接
        const getInitialLink = async () => {
            const url = await Linking.getInitialURL();
            if (url) processReferralCode(url);
        };

        // 监听App前台时的链接唤起
        const linkSubscription = Linking.addEventListener('url', (event) => {
            processReferralCode(event.url);
        });

        getInitialLink();
        return () => linkSubscription.remove();
    }, [navigation]);

    // 解析并存储referral code,跳转注册页
    const processReferralCode = async (url) => {
        const code = new URLSearchParams(new URL(url).search).get('code');
        if (code) {
            await AsyncStorage.setItem('referral_code', code);
            navigation.navigate('Register');
        }
    };

    return /* App组件内容 */;
}

2. 读取网页持久化的参数(安装后首次打开)

如果用户是从应用商店下载打开App,通过WebView加载域名下的空白页面,读取网页存储的referral code:

import { WebView, AsyncStorage } from 'react-native';
import { useRef, useEffect, useState } from 'react';

function ReferralChecker() {
    const webViewRef = useRef(null);
    const [hasChecked, setHasChecked] = useState(false);

    useEffect(() => {
        const checkStoredCode = async () => {
            const existingCode = await AsyncStorage.getItem('referral_code');
            if (!existingCode && !hasChecked) {
                // 注入JS读取网页存储的参数
                webViewRef.current?.injectJavaScript(`
                    const code = localStorage.getItem('referral_code') || 
                        (document.cookie.split('; ').find(row => row.startsWith('referral_code='))?.split('=')[1] || '');
                    window.ReactNativeWebView.postMessage(code);
                `);
            }
        };
        checkStoredCode();
    }, [hasChecked]);

    // 接收WebView传递的参数
    const handleMessage = async (event) => {
        const code = event.nativeEvent.data;
        if (code) {
            await AsyncStorage.setItem('referral_code', code);
            setHasChecked(true);
        }
    };

    return hasChecked ? null : (
        <WebView
            ref={webViewRef}
            source={{ uri: 'https://yourdomain.com/referral-check' }}
            onMessage={handleMessage}
            style={{ height: 0, width: 0 }}
        />
    );
}

3. 注册页预填逻辑

在注册表单组件中,读取存储的referral code并设置为输入框默认值:

import { useState, useEffect } from 'react';
import { TextInput, AsyncStorage } from 'react-native';

function RegisterScreen() {
    const [form, setForm] = useState({
        email: '',
        password: '',
        referralCode: ''
    });

    useEffect(() => {
        const loadReferralCode = async () => {
            const code = await AsyncStorage.getItem('referral_code');
            if (code) {
                setForm(prev => ({ ...prev, referralCode: code }));
            }
        };
        loadReferralCode();
    }, []);

    return (
        <TextInput
            value={form.referralCode}
            onChangeText={(text) => setForm(prev => ({ ...prev, referralCode: text }))}
            placeholder="请输入推荐码"
            editable={false} // 可选:设置为不可编辑,仅展示
        />
    );
}

四、备选简化方案

若不想手动处理唤起和持久化逻辑,可使用Firebase Dynamic Links、Branch.io这类第三方归因工具,它们会封装好唤起、跳转、参数传递的全流程,只需集成对应React Native SDK即可快速获取referral code。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:44:58