uni-app 使用promise封装uni.request并打包成安卓或IOS应用时,uni.request会直接走error回调

uni-app 使用promise封装uni.request并打包成安卓或IOS应用时,uni.request会直接走error回调

开发环境 版本号 项目创建方式
Mac 11.6 HBuilderX

操作步骤:

  • 使用promise包装uni.request请求,并且打包成APP

预期结果:

  • uni.request能够发出请求,走success回调

实际结果:

  • uni.request不能发出请求,直接走error回调
1 回复

更多关于uni-app 使用promise封装uni.request并打包成安卓或IOS应用时,uni.request会直接走error回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在uni-app中,使用Promise封装uni.request并在打包为原生应用(Android/iOS)时出现直接进入error回调的问题,通常与网络请求配置或平台差异有关。以下是可能的原因及解决方案:

1. 网络权限配置

  • 问题:Android/iOS应用需要显式声明网络权限,否则请求会被阻塞。
  • 解决
    • Android:在 manifest.jsonapp-plus -> distribute -> android 中,添加网络权限:
      "permissions": [
          "<uses-permission android:name=\"android.permission.INTERNET\"/>"
      ]
      
    • iOS:确保在 manifest.json 中已勾选 ATS(App Transport Security)配置,或根据需求允许HTTP请求。

2. 请求URL协议限制

  • 问题:iOS默认禁用非HTTPS请求,若测试时使用HTTP,可能触发错误。
  • 解决
    • 开发阶段:在 manifest.jsonapp-plus -> distribute -> ios 中,关闭ATS限制:
      "ATS": {
          "NSAllowsArbitraryLoads": true
      }
      
    • 生产环境:务必使用HTTPS,或通过服务器配置合法证书。

3. Promise封装逻辑问题

  • 问题:封装代码可能未正确处理uni.request的返回结果,导致错误提前触发。
  • 示例封装代码
    function request(options) {
        return new Promise((resolve, reject) => {
            uni.request({
                url: options.url,
                method: options.method || 'GET',
                data: options.data || {},
                success: (res) => {
                    // 可在此处统一处理状态码
                    if (res.statusCode === 200) {
                        resolve(res.data);
                    } else {
                        reject(res);
                    }
                },
                fail: (err) => {
                    reject(err);
                }
            });
        });
    }
回到顶部