Expo自定义开发客户端(iOS)集成Supabase时出现TypeError: Network request failed错误
嘿,我太懂这种刚切换到自定义开发构建就踩坑的糟心了!先对齐下你的问题场景,再给你几个大概率能解决问题的排查方向:
你的情况大概是这样的:
- 用的是 Expo + Supabase 技术栈
- 因为项目里用了Expo Go不支持的自定义原生模块,所以不得不切换到自定义开发构建,用了这两个命令生成并运行iOS端:
npx expo prebuild npx expo run:ios - 结果切换之后,iOS端所有Supabase的网络请求直接挂了,全报
TypeError: Network request failed
接下来给你几个一步步排查的办法,你挨个试试:
检查ATS配置是否允许Supabase域名请求
自定义开发构建的iOS端,App Transport Security(ATS)的默认限制比Expo Go要严格。你需要在app.json的iOS配置里,明确允许你的Supabase域名的网络请求。如果你的Supabase用的是HTTPS(正常都是),可以在app.json的ios.infoPlist中添加这段配置:"NSAppTransportSecurity": { "NSAllowsArbitraryLoads": false, "NSExceptionDomains": { "your-supabase-project.supabase.co": { "NSIncludesSubdomains": true, "NSExceptionAllowsInsecureHTTPLoads": false, "NSExceptionRequiresForwardSecrecy": false } } }记得把
your-supabase-project换成你自己的Supabase项目域名哦。验证Supabase客户端的初始化配置
切换到自定义构建后,环境变量有时候会出现没有正确注入原生端的情况。你要检查下Supabase初始化代码里的SUPABASE_URL和SUPABASE_ANON_KEY是不是真的读取到了正确的值。比如你用process.env来获取的话,要确保这些变量在.env或者eas.json里配置正确,而且执行prebuild的时候已经把它们注入到了原生项目文件中。排查网络环境问题
有时候自定义构建的客户端在模拟器里的网络代理会出问题,你可以先关掉模拟器的代理设置试试,或者直接用真机来测试,看是不是网络环境导致请求发不出去。另外也可以写个简单的fetch请求单独测试Supabase域名的连通性:fetch('https://your-supabase-project.supabase.co/rest/v1/') .then(res => console.log('请求成功:', res)) .catch(err => console.error('请求失败:', err))用这个基础请求来排除是不是Supabase SDK本身的问题。
重新生成干净的原生项目文件
有时候prebuild生成的iOS文件夹会有缓存或者异常文件,你可以先删掉项目根目录下的ios文件夹,然后执行干净的预构建命令:npx expo prebuild --clean npx expo run:ios这样能确保生成的原生项目文件是完全干净的,没有之前的残留问题。
检查Supabase SDK和Expo的版本兼容性
有些旧版本的Supabase JS SDK在Expo 49及以上的自定义构建中会有网络请求的兼容性问题,你可以试试升级到最新的稳定版Supabase SDK:npm install @supabase/supabase-js@latest
这些方法我之前帮朋友排查类似问题的时候都用过,大概率能解决你的网络请求失败问题。
备注:内容来源于stack exchange,提问作者user30345391

