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

Ionic应用发起PUT请求在真机/模拟器报Uncaught (in promise)错误

问题根因

该错误是移动端网络请求被拦截导致的无明确返回的异常,Web端运行正常是因为开发环境的代理配置绕过了限制,移动端运行时缺少对应兼容配置,常见触发原因如下:

  • 跨域规则缺失:Web开发时本地代理会转发请求、绕过跨域限制,移动端WebView无该代理,请求后端接口时会触发CORS拦截,返回无明确信息的ProgressEvent。
  • 明文HTTP请求被系统拦截:Android 9+、iOS 9+默认禁止非HTTPS的明文请求,若接口使用HTTP协议,移动端会直接拒绝请求。
  • SSL证书不被信任:后端使用自签名、过期或者不在系统信任链内的SSL证书时,移动端系统会终止连接。
  • 网络访问权限未配置:Android打包时未申请INTERNET权限,导致请求无法发出。
解决方案

你可以按照以下优先级排查修复:

  • 配置后端CORS规则:在后端服务添加跨域资源共享配置,放行App来源的PUT请求,同时允许接口用到的自定义请求头。
  • 切换合法HTTPS接口:生产环境必须使用CA机构颁发的HTTPS接口,避免明文请求被拦截。测试环境临时使用HTTP的话可添加白名单配置:
    • Android端:在AndroidManifest.xml的application节点添加属性 android:usesCleartextTraffic="true"
    • iOS端:在项目Info.plist中添加NSAppTransportSecurity配置,放开对应测试域名的HTTP访问限制。
  • 配置网络权限:确认AndroidManifest.xml中已添加网络权限声明:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 优化错误捕获逻辑:你当前的代码未添加异常捕获逻辑,可补充catch块打印详细错误信息,方便后续定位问题:
    updateDeviceToken(params):Promise<any>{
      return this.http
        .put(this.endpoint + '/devicetoken',params)
        .toPromise()
        .then((response: any) => response)
        .catch(err => {
          console.error('请求详细错误信息:', err);
          throw err;
        });
    }
    
  • 可选:改用原生网络请求插件:如果WebView层面的跨域问题无法通过后端配置解决,可以接入@awesome-cordova-plugins/http插件,通过原生层发起网络请求,绕过WebView的跨域限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 16:51:04