uni-app使用uni.request请求接口后,打包安卓应用无法发送网络请求

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app使用uni.request请求接口后,打包安卓应用无法发送网络请求

开发环境 版本号 项目创建方式
Windows mac pro m1 ventura 13.5.1 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.8.12

手机系统:Android

手机系统版本号:Android 14

手机厂商:华为

手机机型:华为P10

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX

示例代码:
<!-- 登录页面 -->  
<template>  
    <view class="__logo">  
        <image class="__logo_img" src="../../static/logo.png" mode=""></image>  
    </view>  
    <view class="__form">  
        <uni-easyinput focus prefixIcon="person" v-model="formData.account" placeholder="账号" />  
        <view class="__fg"></view>  
        <uni-easyinput type="password" prefixIcon="locked-filled" v-model="formData.password" placeholder="密码" />  
        <view class="__fg"></view>  
        <view class="__login_btn" @click="handleLogin">登录</view>  
    </view>  
</template>  
<script setup>  
import logic from "./logic.js";  

const { formData, handleLogin } = logic();  
</script>  

<style lang="less" scoped>  
.__logo {  
    position: relative;  
    display: flex;  
    align-items: center;  
    justify-content: center;  
    margin: 3rem auto;  

    .__logo_img {  
        width: 4rem;  
        height: 4rem;  
        text-align: center;  
    }  
}  

.__form {  
    padding: 2rem;  

    .__fg {  
        margin: 1rem 0;  
    }  

    .__login_btn {  
        margin: 1rem 0;  
        background-color: #5cadff;  
        border-radius: 0.3rem;  
        color: #fff;  
        font-size: 1rem;  
        padding: 0.5rem 1rem;  
        text-align: center;  
    }  
}  
</style>  
## 操作步骤:
直接云端打包

## 预期结果:
能正常请求网络

## 实际结果:
不能请求网络

## bug描述:
网络请求在网页网和小程序端都没问题,打包成apk后,无法发送网络请求

3 回复

我自己找到原因了,因为我自己又把uni.request封装了一遍,封装中使用了promise,而安卓环境下 是没有这个的,重新封装一下就行了


大佬,具体怎么封装能分享一下吗?

在uni-app中使用uni.request进行网络请求时,如果在打包成安卓应用后遇到无法发送网络请求的问题,这通常与网络权限配置、HTTPS证书验证或服务器CORS(跨源资源共享)策略有关。以下是一些可能的解决方案和代码示例,帮助你定位和解决问题。

1. 检查AndroidManifest.xml权限配置

确保在AndroidManifest.xml中添加了必要的网络权限。这通常包括INTERNETACCESS_NETWORK_STATE权限。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- 其他配置 -->

</manifest>

2. 配置HTTPS证书(如果需要)

如果你的请求是通过HTTPS进行的,确保服务器使用的证书是可信的。如果使用的是自签名证书,你可能需要在应用中配置信任该证书。

在uni-app中,你可以通过自定义网络请求库(如axiosfetch结合https模块)来处理证书验证,但这通常涉及到原生代码开发。对于简单的开发,建议确保使用受信任的证书。

3. 服务器CORS配置

如果你的请求是跨域的,服务器需要正确配置CORS策略,允许来自你的应用的请求。这通常在服务器的响应头中设置Access-Control-Allow-Origin等字段。

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization

4. 检查uni.request调用

确保uni.request的调用是正确的。以下是一个基本的请求示例:

uni.request({
    url: 'https://api.example.com/data', // 确保URL是正确的
    method: 'GET',
    header: {
        'Content-Type': 'application/json'
        // 其他必要的头部信息
    },
    success: (res) => {
        console.log('请求成功', res.data);
    },
    fail: (err) => {
        console.error('请求失败', err);
    }
});

5. 调试和日志

fail回调中添加详细的错误日志,这有助于诊断问题。

fail: (err) => {
    console.error('请求失败', err.errMsg, err.statusCode, err.data);
}

确保在真机或模拟器上测试应用,因为某些网络问题在开发环境中可能无法复现。如果问题依旧存在,考虑使用抓包工具(如Fiddler或Charles)来检查网络请求的详细情况。

回到顶部