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

Expo托管工作流:本地Supabase连接正常,TestFlight中连接失败

Expo + Supabase + TestFlight 连接失败(AuthRetryableFetchError)解决方案

问题描述

本地通过Expo Go或expo start可正常连接Supabase,但TestFlight测试版完全无法建立连接,Supabase后台无任何请求记录,Sentry捕获到AuthRetryableFetchError错误。

环境配置

  • 框架:Expo(托管工作流)
  • 构建工具:EAS Build
  • 后端:Supabase(使用公开匿名密钥+URL)
  • 运行环境:iOS TestFlight
  • Supabase客户端:@supabase/supabase-js

我的Supabase客户端代码

import { createClient } from '@supabase/supabase-js';
import AsyncStorage from '@react-native-async-storage/async-storage';
import 'react-native-url-polyfill/auto';

const supabaseUrl = process.env.EXPO_PUBLIC_SUPABASE_URL as string;
const supabaseAnonKey = process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY as string;

// Add error checking for missing environment variables
if (!supabaseUrl || !supabaseAnonKey) {
  console.warn(
    "Missing Supabase environment variables. Some features may not work."
  );
}

export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
  auth: {
    storage: AsyncStorage,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: false,
  },
});

已尝试操作

  • 验证Supabase URL和匿名密钥已正确配置到EAS构建(通过eas.json/app.config.js)
  • 在app.json中添加ATS全放开配置:
"infoPlist": {
        "NSAppTransportSecurity": {
          "NSAllowsArbitraryLoads": true
        }
      }
  • 集成Sentry获取错误详情

解决方案

1. 修正ATS配置(合规且有效)

Apple在TestFlight/生产环境对ATS审核更严格,全放开NSAllowsArbitraryLoads不仅可能被拒,还可能因Expo默认规则导致不生效。建议针对Supabase域名配置精准例外:

"infoPlist": {
  "NSAppTransportSecurity": {
    "NSExceptionDomains": {
      "supabase.co": {
        "NSIncludesSubdomains": true,
        "NSAllowsSecureHTTPLoads": true
      }
    }
  }
}

如果用自定义Supabase域名,替换成你的域名即可。

2. 确认EAS环境变量真正生效

有时候配置了变量但打包时未正确注入,在supabase.ts中加日志验证:

console.log('Supabase URL:', supabaseUrl);
console.log('Supabase Anon Key:', supabaseAnonKey ? '已配置' : '缺失');

用eas build --profile preview打包预览版,通过Xcode设备日志查看输出,确认变量是否加载正确。

3. 确保URL Polyfill生效

生产构建的tree shaking可能导致react-native-url-polyfill被剔除,在App入口文件(如App.tsx)顶部重复引入:

import 'react-native-url-polyfill/auto';

4. 强制Supabase使用原生Fetch

给客户端添加自定义Fetch配置,避免polyfill兼容性问题:

export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
  auth: {
    storage: AsyncStorage,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: false,
  },
  global: {
    fetch: (url, options) => fetch(url, {
      ...options,
      credentials: 'include',
    })
  }
});

5. 检查应用网络权限

让TestFlight测试用户确认:iOS设置→对应应用→蜂窝数据/Wi-Fi权限已开启,部分用户安装后可能默认禁用网络权限。

6. 排查Supabase IP白名单

如果你的Supabase项目开启了IP白名单,需确保TestFlight用户的动态IP被允许(通常不建议开启,除非是企业内部应用)。


排查核心逻辑

TestFlight环境下Supabase无请求记录,说明请求根本没发出去,问题集中在本地网络配置或环境变量注入,而非Supabase端权限问题。ATS配置和环境变量是最高频的踩坑点。

内容的提问来源于stack exchange,提问作者edjav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:59:49