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

React Native Android如何程序化添加默认支持的Deep Link

解决React Native Android Deep Link需手动设置默认打开方式的问题

1. 先排查自动验证(autoVerify)的核心问题

你在intent-filter里加了android:autoVerify="true",这个配置要求你的服务器必须部署assetlinks.json文件,否则Android系统不会自动将你的应用设为该链接的默认处理者,只能手动去设置。

  • 文件必须放在这个路径: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文件执行类似命令,替换对应的路径和密码

就算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:15:07