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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:17:27