React Native结合InAppBrowser接入Cognito Auth首次登录无回调问题求助
问题解决方案
根因定位
- 代码层面:当前
urlOpener方法中调用InAppBrowser.openAuth时未添加await关键字,异步操作未完成就结束了函数执行,导致Amplify的重定向监听逻辑未正确挂载,首次登录时系统无法触发对应intent。 - 依赖版本bug:
react-native-inappbrowser-reborn@3.6.3版本在Android 11及以上系统存在首次web会话重定向检测延迟的已知问题,会导致首次重定向回调无法正常触发。 - 配置层面:若MainActivity的launchMode未设置为singleTask,也会导致首次intent无法正确传递到应用。
修复步骤
1. 修正异步调用逻辑
给InAppBrowser.openAuth添加await,确保异步逻辑执行完成后再结束函数,修正后的代码如下:
urlOpener: async (url, redirectSignIn) => { try { await InAppBrowser.isAvailable(); console.log(`urlOpener: calling url: ${url}, redirectsignIn: ${redirectSignIn}`) // 新增await关键字 const response = await InAppBrowser.openAuth(url, redirectSignIn, { dismissButtonStyle: 'cancel', showTitle: false, enableUrlBarHiding: true, enableDefaultShare: false, ephemeralWebSession: false, forceCloseOnRedirection: true }); console.log('urlOpener: response: ', JSON.stringify(response)); if (response.type === 'cancel') { console.log('urlOpener: cancel:'); AuthStore.setIsFedratedSignIn(false); } else if (response.type === 'success' && response.url) { console.log('urlOpener: success: url: ', response.url); Linking.openURL(response.url); } } catch (err) { console.log('urlOpener: error: ', JSON.stringify(err)); } },
2. 修正Android配置
检查android/app/src/main/AndroidManifest.xml中MainActivity的launchMode配置,确保设置为singleTask:
<activity android:name=".MainActivity" android:launchMode="singleTask" ...其余配置保持不变 >
3. 依赖版本兼容修复
如果上述修改后仍存在问题,将react-native-inappbrowser-reborn升级到3.7.0及以上版本,该版本已修复Android端首次重定向检测的bug。
替代方案
如果不想继续使用web登录流,可以直接采用原生Google登录方案:
- 使用
@react-native-google-signin/google-signin依赖包直接调用原生Google登录能力,无需跳转web页面,适配性更强,不存在重定向异常问题。 - 裸React Native项目也可使用
expo-web-browser替代react-native-inappbrowser-reborn,该库对重定向的处理更稳定,和Amplify的适配性更好。
验证方法
修改完成后完全卸载测试设备上的应用,清除缓存后重装,首次触发Google登录即可验证修复效果。
内容的提问来源于stack exchange,提问作者Mark Lloyd
相关产品推荐
相关产品推荐

