expo-auth-session授权跳转时Android APK弹出两个应用打开选项如何解决
问题根因
生产打包后AndroidManifest.xml中生成了两个匹配授权跳转规则的intent filter,系统识别到两个可处理跳转的入口,就会弹出打开方式选择窗,其中一个入口无法正确传递授权回调参数,就会出现跳转后无响应的情况。开发环境使用expo go容器运行,只会存在一个intent filter,所以不会触发该问题。
解决方案
1. 调整authSession配置
你当前的配置同时开启了代理跳转和指定了expo公共代理地址作为原生重定向地址,二者冲突,按如下规则修改代码:
- 生产环境关闭
useProxy,托管工作流生产包不需要走expo公共代理跳转 - 区分开发/生产环境的重定向地址,生产环境用你app.json中配置的自定义scheme作为重定向地址,同时需要提前在Instagram开发者后台将该地址加入授权重定向白名单
- 重定向地址拼接时需要做url编码,避免特殊字符导致规则匹配失败
修改后参考代码:
webBrowser.maybeCompleteAuthSession(); // 仅开发环境开启代理,生产环境关闭 const useProxy = Platform.select({ web: false, default: __DEV__ }); const client_id = ---; // 区分环境的重定向地址,生产环境用自定义scheme const redirect_uri = __DEV__ ? "https://auth.expo.io/@davidtmiranda/secreet" : "com.davidtmiranda.secreet://auth-callback"; const scope = "user_profile"; const site = "https://api.instagram.com/oauth/authorize?client_id=" + client_id + "&redirect_uri=" + encodeURIComponent(redirect_uri) + "&scope=" + scope + "&response_type=code&state=1"; const discovery = { authorizationEndpoint: site }; const [request, response, promptAsync] = useAuthRequest( { redirectUri: makeRedirectUri({ useProxy, native: redirect_uri, }), scopes: [scope], clientId: String(client_id), }, discovery ); useEffect(() => { if (response?.type === "success") { // 原有逻辑保持不变 } }, [response]); function GetInstagramID() { return promptAsync({ useProxy, }); }
2. 显式配置Android intent filter
如果修改代码后问题仍然存在,可在app.json中显式声明intent filter规则,避免打包时自动生成重复的规则配置,在expo.android节点下添加如下配置:
"intentFilters": [ { "action": "VIEW", "autoVerify": true, "data": [ { "scheme": "com.davidtmiranda.secreet", "host": "*" } ], "category": ["BROWSABLE", "DEFAULT"] } ]
配置完成后执行expo prebuild --clean清除原有构建缓存,再重新打包APK即可。
3. 验证方法
可将生成的APK解压后查看根目录的AndroidManifest.xml文件,搜索com.davidtmiranda.secreet scheme对应的intent filter条目,确认仅存在1条匹配规则即可。
该方案同样适用于你之前遇到的谷歌登录同类跳转冲突问题,无需单独做原生适配。
内容的提问来源于stack exchange,提问作者Davi Miranda
相关产品推荐
相关产品推荐

