You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:06:03