React Native Android如何程序化添加默认支持的Deep Link
解决React Native Android Deep Link需手动设置默认打开方式的问题
1. 先排查自动验证(autoVerify)的核心问题
你在intent-filter里加了android:autoVerify="true",这个配置要求你的服务器必须部署assetlinks.json文件,否则Android系统不会自动将你的应用设为该链接的默认处理者,只能手动去设置。
配置assetlinks.json的具体要求:
- 文件必须放在这个路径:
https://api.uat.watermelon.market/.well-known/assetlinks.json - 文件内容格式如下(替换成你的应用包名和签名指纹):
[ { "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "你的应用包名(比如com.watermelon.market)", "sha256_cert_fingerprints": ["你的应用签名SHA256指纹"] } } ]
- 获取SHA256指纹的命令:
- 调试包:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android - 正式包:用你打包的keystore文件执行类似命令,替换对应的路径和密码
- 调试包:
2. 在React Native端正确处理Deep Link Intent
就算Manifest配置正确,也需要在RN代码里监听Intent,确保应用能正确响应链接跳转:
如果你用React Navigation(6+版本)
在导航容器中配置linking属性,直接关联路径和页面:
import { NavigationContainer } from '@react-navigation/native'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; const Stack = createNativeStackNavigator(); const linking = { prefixes: ['https://api.uat.watermelon.market'], config: { screens: { // 配置页面和路径的对应关系,示例: Home: '', ProductDetail: 'product/:id', }, }, }; export default function App() { return ( <NavigationContainer linking={linking} fallback={<Text>加载中...</Text>}> <Stack.Navigator> {/* 你的页面栈配置 */} </Stack.Navigator> </NavigationContainer> ); }
不依赖导航库的原生监听方式
在MainActivity.java里重写方法,把Intent传递给RN端处理:
// MainActivity.java import com.facebook.react.ReactActivity; import android.content.Intent; import com.facebook.react.bridge.ReactContext; import com.facebook.react.modules.core.DeviceEventManagerModule; public class MainActivity extends ReactActivity { @Override protected String getMainComponentName() { return "MainApplication"; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handleDeepLinkIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleDeepLinkIntent(intent); } private void handleDeepLinkIntent(Intent intent) { String action = intent.getAction(); String linkUrl = intent.getDataString(); if (Intent.ACTION_VIEW.equals(action) && linkUrl != null) { // 把链接发送给RN端 ReactContext reactContext = getReactInstanceManager().getCurrentReactContext(); if (reactContext != null) { reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("DeepLinkReceived", linkUrl); } } } }
然后在RN端监听事件并处理跳转:
import { NativeEventEmitter, NativeModules } from 'react-native'; const deepLinkEmitter = new NativeEventEmitter(NativeModules.RCTDeviceEventEmitter); deepLinkEmitter.addListener('DeepLinkReceived', (url) => { console.log('收到Deep Link:', url); // 这里写你的路由跳转逻辑,比如解析路径跳转到对应页面 });
3. 程序化引导设置默认应用(可选场景)
如果autoVerify配置有困难,或者想主动引导用户设置默认应用,可以在Android端写代码打开默认应用设置界面:
// 可以放在MainActivity或者自定义工具类中 private void openDefaultAppSettings() { Intent settingsIntent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS); settingsIntent.setData(Uri.parse("package:" + getPackageName())); startActivity(settingsIntent); }
之后可以通过RN原生模块调用这个方法,比如在应用首次打开时提示用户完成设置。
4. 测试验证方法
- 用adb命令直接测试:
adb shell am start -W -a android.intent.action.VIEW -d "https://api.uat.watermelon.market/product/123" 你的应用包名 - 检查assetlinks.json是否可访问:直接在浏览器打开
https://api.uat.watermelon.market/.well-known/assetlinks.json,确保能正常返回正确的JSON内容
内容的提问来源于stack exchange,提问作者Phanindra
相关产品推荐
相关产品推荐

