React Native中如何让同域名Deep Link在浏览器而非APP打开?
React Native 同域名Deep Link跳转浏览器解决方案
因为APP已注册目标域名的Deep Link,系统会优先唤起APP,直接调用Linking.openURL无法绕过这个规则,以下分两种方案解决:
方案一:使用第三方库跨平台实现(推荐)
借助react-native-inappbrowser-reborn库,直接在APP内唤起浏览器组件打开链接,不会触发Deep Link规则。
步骤:
- 安装依赖
npm install react-native-inappbrowser-reborn --save
- 修改现有代码
import InAppBrowser from 'react-native-inappbrowser-reborn'; import Linking from 'react-native/Libraries/Linking/Linking'; // ... if (lowerUrl.includes(PostType.NO_DEEP_LINK)) { const openInBrowser = async () => { if (await InAppBrowser.isAvailable()) { await InAppBrowser.open(lowerUrl, { showTitle: true, // 显示浏览器标题栏 enableUrlBarHiding: true, // 允许隐藏地址栏 enableDefaultShare: true // 启用分享功能 }); } else { // fallback:浏览器组件不可用时,尝试用系统默认方式打开 Linking.openURL(lowerUrl); } }; openInBrowser(); return null; }
方案二:修改原生代码,通过参数强制跳转浏览器
不需要额外依赖,但需要分别修改iOS和Android的原生代码,通过给链接添加自定义参数,让原生端检测到后直接跳转浏览器。
1. 修改RN代码(添加参数)
if (lowerUrl.includes(PostType.NO_DEEP_LINK)) { // 给链接添加强制浏览器打开的参数 const querySymbol = lowerUrl.includes('?') ? '&' : '?'; const targetUrl = `${lowerUrl}${querySymbol}force_browser=1`; Linking.openURL(targetUrl); return null; }
2. iOS端修改(AppDelegate.m)
在application:continueUserActivity:restorationHandler:方法中添加检测逻辑:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { NSURL *url = userActivity.webpageURL; if (url && [url.query containsString:@"force_browser=1"]) { // 强制用系统浏览器打开,绕过Deep Link [[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnlyKey: @NO} completionHandler:nil]; return NO; } // 原有Deep Link处理逻辑 // ... return YES; }
3. Android端修改(MainActivity.java)
在onCreate或onNewIntent方法中添加检测逻辑:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... Uri uri = getIntent().getData(); handleForceBrowser(uri); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Uri uri = intent.getData(); handleForceBrowser(uri); } private void handleForceBrowser(Uri uri) { if (uri != null && "1".equals(uri.getQueryParameter("force_browser"))) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri); browserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 可选:指定浏览器包名,比如Chrome // browserIntent.setPackage("com.android.chrome"); startActivity(browserIntent); finish(); } }
内容的提问来源于stack exchange,提问作者Mohsin
相关产品推荐
相关产品推荐

