React Native使用Deep Linking实现SSO后如何清除已使用的Linking URL记录?
React Native Deep Link SSO登录后清除旧Linking记录解决方案
问题原因
Android平台下,触发Deep Link打开应用的Intent会被系统保留在Activity的启动记录中,只要对应Activity没有被完全销毁重建,每次调用Linking.getInitialURL()都会读取到该初始Intent携带的URL,因此会重复拿到登录用的历史链接。
解决方案
方案1:Android原生端修改(彻底解决)
修改MainActivity代码,在Deep Link逻辑处理完成后清空Intent携带的URL数据:
- 找到项目中
android/app/src/main/java/[你的包名路径]/MainActivity.java(Kotlin版本为MainActivity.kt),添加以下代码:// Java版本示例 import android.content.Intent; @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 更新Activity持有的Intent为最新触发的跳转Intent setIntent(intent); } // 对外暴露清空Deep Link数据的方法 public void clearDeepLinkIntent() { Intent currentIntent = getIntent(); if (currentIntent.getData() != null) { currentIntent.setData(null); setIntent(currentIntent); } }// Kotlin版本示例 import android.content.Intent override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) intent?.let { setIntent(it) } } fun clearDeepLinkIntent() { intent.data?.let { intent.data = null setIntent(intent) } } - 在JS侧完成SSO登录逻辑后,调用该原生方法清空记录即可,后续调用
Linking.getInitialURL()就会返回null。
方案2:JS侧兼容方案(无需修改原生代码)
如果不想修改原生代码,可以通过全局缓存已处理链接的方式避免重复执行逻辑:
// 全局存储已处理的Deep Link链接集合 const processedDeepLinkUrls = new Set(); // 处理Deep Link逻辑的统一方法 async function handleDeepLink() { // 处理初始启动URL const initialUrl = await Linking.getInitialURL(); if (initialUrl && !processedDeepLinkUrls.has(initialUrl)) { // 执行你的SSO登录逻辑 handleSSOLogin(initialUrl); // 处理完成后加入缓存,避免重复执行 processedDeepLinkUrls.add(initialUrl); } // 监听应用运行过程中新触发的Deep Link跳转 const urlListener = Linking.addEventListener('url', (event) => { const newUrl = event.url; if (newUrl && !processedDeepLinkUrls.has(newUrl)) { handleSSOLogin(newUrl); processedDeepLinkUrls.add(newUrl); } }); // 页面卸载时移除监听 return () => { urlListener.remove(); } }
注意事项
- 你当前AndroidManifest.xml里的
android:excludeFromRecents属性写在了<intent-filter>标签中不会生效,该属性是作用于Activity的,需要移动到对应的<activity>标签上才能实现“不显示在最近任务列表”的效果。
内容的提问来源于stack exchange,提问作者Rohit Aggarwal
相关产品推荐
相关产品推荐

