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访问限制。
- Android端:在
- 配置网络权限:确认
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
相关产品推荐
相关产品推荐

