我在应用内浏览器中重定向时在 Chrome 中收到
ERR_UNKNOWN_URL_SCHEME
错误,以便在 React Native 中使用回调 URL 的深度链接进行联合身份验证。仅当在 Google 帐户中启用两步验证时才会出现此问题。以下是问题的详细信息以及重现该问题的步骤。
平台: Android 10, 11, 12
设备类型:物理设备
以下 Chrome 浏览器版本中出现问题:
此问题不会出现在 Chrome 浏览器版本中: 87.0.4280.141
套装版本:
react-native-inappbrowser-reborn version: ^3.6.3
也试过expo-web-browser version: 9.2.0
inAppbrowser.openAuth(...)
/openAuthSessionAsync(...)
使用 Google 作为身份提供商进行登录<your_scheme>: links are blocked
,错误代码 = ERR_UNKNOWN_URL_SCHEME
。看这个截图:在 AndroidManifest.xml 中,这就是我的深度链接 URL(假设为“my_scheme”)的配置方式:
<intent-filter android:label="filter_react_native">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="my_scheme"/>
</intent-filter>
这就是我从
openAuth
调用
react-native-inappbrowser-reborn
函数的方式
const { type, url: newUrl } = await InAppBrowser.openAuth(
url,
redirectUrl,
{
showInRecents: true, // browser dismisses when set to false
forceCloseOnRedirection: false, // same issue when set to true
showTitle: false,
enableUrlBarHiding: true,
enableDefaultShare: false,
ephemeralWebSession: false,
}
);
对于
expo-web-browser
模块,这是我如何调用 openAuthSessionAsync
:
const { type, url: newUrl } = await WebBrowser.openAuthSessionAsync(
url,
redirectUrl,
{
showInRecents: true,
toolbarColor: Colors.primaryVariant,
createTask: false,
},
);
我尝试使用其他两步验证方式,例如短信/身份验证器应用程序代码。在这两种情况下,即使我将应用程序放在后台打开短信应用程序或身份验证器应用程序(Google Authenticator),然后再次切换回 React Native 应用程序,应用程序内浏览器也会重定向到 React-Native 应用程序,并且我不明白这个
ERR_UNKNOWN_URL_SCEME
问题。
应用内浏览器模块(
expo-web-browser
以及 react-native-inappbrowser-reborn
)中都存在此问题。
不知何故,用于确认身份的 Google 身份验证覆盖会破坏使用深度链接 URL 重定向到 React-Native 应用程序。当使用设备的两步验证已使用“是”进行响应或根本未配置且应用程序无缝登录时,不会出现此问题。
任何帮助或解决方案的指示将不胜感激。如果需要更多详细信息,请在评论中告诉我。
我注意到这个问题已在较新版本的 Android System Webview 和相应版本的基于 Chrome 的浏览器中得到修复。
为了确保用户使用的是最新版本的webview:我检查了Android中安装的默认webview应用程序的包名称,然后检查了版本。如果版本早于 105.x(一个相当新的版本,问题似乎已得到解决),则显示一个对话框,通知用户更新 webview 应用程序以及一个重定向到该应用程序的 Google Play 商店页面的按钮webview 包。
但我相信到 2023 年可能不需要这样做,因为现在几乎所有用户都会升级到最新版本,但是,上述检查仍然很好,以防万一出现源自 webview 弹出窗口的类似问题未来。