Expo托管工作流:本地Supabase连接正常,TestFlight中连接失败
问题描述
本地通过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

