Expo构建React Native APK后出现TypeError: Network Request failed的原因
Expo打包APK后Network Request failed问题排查
结合你的代码和场景,可能的原因及解决方式如下:
1. Android明文HTTP请求限制
Android 9及以上系统默认禁止明文HTTP(非HTTPS)请求,你的后端地址http://example.com属于明文协议。开发模式下Expo会自动豁免这类限制,但打包成APK后需要手动配置:
在项目根目录的app.json中修改android配置:
{ "expo": { "android": { "usesCleartextTraffic": true, // 其他已有配置... } } }
2. CodeIgniter CSRF拦截
CodeIgniter默认开启CSRF保护,所有POST请求必须携带CSRF令牌才能通过。开发阶段浏览器可能自动处理了令牌的携带,但APK作为独立客户端,你的请求中没有包含该令牌,导致后端直接拒绝请求。
解决方式:
- 先通过GET请求从后端获取CSRF令牌(比如访问后端的某个接口返回令牌),然后在POST请求的headers中添加
X-CSRF-Token: 你的令牌值; - 或者在CodeIgniter的
config.php中,将api/login这类接口路径添加到CSRF白名单(仅测试用,生产环境不推荐)。
3. Credentials参数兼容性问题
你的请求设置了credentials: "include",该参数会携带Cookie发起请求,但需要后端配合配置CORS:
- 后端需返回
Access-Control-Allow-Credentials: true; - 同时
Access-Control-Allow-Origin不能设为*,必须指定具体的客户端源。
如果后端没有正确配置,打包后的APK请求会失败。可以先尝试移除credentials: "include",测试请求是否恢复正常。
4. 打包环境地址验证
确认打包APK时使用的baseUrl是正确的生产环境地址,没有误使用开发阶段的临时地址。
附你的请求代码:
const baseUrl = 'http://example.com/admin/'; const postData = async(url, data) => { console.log(data); return fetch(`${baseUrl}${url}`, { method: "POST", headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, credentials: "include", body: JSON.stringify(data) }); }
postData('api/login', { ...userInfo }) .then((response) => response.json()) .then(result => { console.log(result); let data = result; if(data.state == 200){ setUserInfo({ email: '', password: '' }); setProfile(result); }else { updateError(data.msg, setError); } }) .catch(error => { console.log(error); alert(error) });
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

