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

React Native Android实现浏览器URL唤起APP并跳转对应页面求助

React Native Android 浏览器URL唤起APP并定向跳转实现

一、修正Intent Filter配置

你当前的Intent Filter存在匹配优先级问题:pathPrefix="/"会拦截所有该域名的请求,导致/detail开头的URL无法触发对应规则。调整为更精准的匹配逻辑,将具体规则放在前面确保优先级正确:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <!-- 匹配/detail开头的URL(优先级更高) -->
    <data
        android:host="www.domain.com"
        android:pathPrefix="/detail"
        android:scheme="https" />

    <!-- 精确匹配/page.html路径 -->
    <data
        android:host="www.domain.com"
        android:path="/page.html"
        android:scheme="https" />
</intent-filter>

二、Android原生层传递URL到React Native

在MainActivity中处理浏览器唤起的Intent,提取URL并发送给RN层:

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.core.DeviceEventManagerModule;

public class MainActivity extends ReactActivity {
    @Override
    protected String getMainComponentName() {
        return "YourAppName"; // 替换为你的RN项目名称
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handleIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {
        Uri data = intent.getData();
        if (data != null) {
            sendUrlToRN(data.toString());
        }
    }

    private void sendUrlToRN(String url) {
        ReactInstanceManager manager = getReactInstanceManager();
        ReactContext context = manager.getCurrentReactContext();
        if (context != null) {
            context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                    .emit("urlReceived", url);
        }
    }
}

三、React Native层处理URL跳转

在RN根组件中监听原生传递的URL事件,解析后跳转至对应页面(示例基于React Navigation):

import React, { useEffect } from 'react';
import { DeviceEventEmitter, View, Text } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();
let navigation;

// 目标页面组件
const PageScreen = () => (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
        <Text>Page.html 对应页面</Text>
    </View>
);

const DetailScreen = ({ route }) => (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
        <Text>详情页面:{route.params?.name || '无参数'}</Text>
    </View>
);

const App = () => {
    useEffect(() => {
        const subscription = DeviceEventEmitter.addListener('urlReceived', handleUrl);
        return () => subscription.remove();
    }, []);

    const handleUrl = (url) => {
        const urlObj = new URL(url);
        if (urlObj.pathname === '/page.html') {
            navigation.navigate('Page');
        } else if (urlObj.pathname.startsWith('/detail/')) {
            const name = urlObj.pathname.split('/')[2];
            navigation.navigate('Detail', { name });
        }
    };

    return (
        <NavigationContainer ref={ref => navigation = ref}>
            <Stack.Navigator initialRouteName="Home">
                <Stack.Screen name="Home" component={() => <Text>首页</Text>} />
                <Stack.Screen name="Page" component={PageScreen} />
                <Stack.Screen name="Detail" component={DetailScreen} />
            </Stack.Navigator>
        </NavigationContainer>
    );
};

export default App;

四、测试方法

使用adb命令模拟浏览器唤起请求,验证跳转逻辑:

# 测试/page.html唤起
adb shell am start -a android.intent.action.VIEW -d "https://www.domain.com/page.html" com.your.app.package

# 测试/detail/xxx唤起
adb shell am start -a android.intent.action.VIEW -d "https://www.domain.com/detail/testName" com.your.app.package

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:55:28