uni-app 离线打包安卓APK(Release)安装到手机上无法联网

uni-app 离线打包安卓APK(Release)安装到手机上无法联网

产品分类:

uniapp/App

项目信息
PC开发环境 Mac
PC操作系统版本 12.3.1
HBuilderX类型 正式
HBuilderX版本 3.3.13
手机系统 Android
手机系统版本 Android 9.0
手机厂商 华为
手机机型 华为 P10 plus
页面类型 vue
vue版本 vue2
打包方式 离线
项目创建方式 HBuilderX

示例代码:

import API from './api.js'  
import STORE from '../store.js'  

let version = ''  
const TIMEOUT = 30000  
const PARAMS = data => {  
  let _params = []  
  for (const k in data) {  
    _params.push(`${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`)  
  }  
  return _params.join('&')
}  

/**  
 * APP网络请求  
 * @param {Object} options  
 */  
function _AppNet(options) {  
  let _header = {  
    Accept: 'application/json',  
    'Content-Type': 'application/json;charset=UTF-8'  
  }  
  const _method = options.method.toUpperCase()  
  const URL = (options.params && Object.keys(options.params).length !== 0 && _method === 'POST') ? `${options.url}?${PARAMS(options.params)}` : options.url  
  const _token = uni.getStorageSync('token')  
  if (_token && _token.length !== 0) {  
    _header['Authorization'] = `Bearer ${_token}`  
  }  
  // #ifdef APP-PLUS  
  _header['client-type'] = 'android'  
  if (version === '') {  
    plus.runtime.getProperty(plus.runtime.appid, wgtinfo => {  
      version = wgtinfo.version  
    })  
  }  
  _header['client-version'] = version  
  // #endif  
  // #ifdef MP-WEIXIN  
  _header['client-type'] = 'wechat_mini_program'  
  // #endif  
  // 是否显示加载loading  
  options.loading && uni.showLoading({ title: '加载中...', mask: true })  

  return uni.request({  
    url: API.root + URL,  
    data: options.data,  
    header: _header,  
    method: _method,  
    dataType: 'json',  
    timeout: TIMEOUT  
  }).then(data => {  
    options.loading && uni.hideLoading()  
    const [err, res] = data  
    if (err) {  
      options.error && _errorToast(-1)  
      return err  
    }  
    const _data = res.data  
    options.error && _errorToast(_data.code, _data.msg)  
    if (_data.code === 3) _forceLogout()  
    return _data  
  })  

  /**  
   * 网络请求错误提示  
   * @param {Object} code 错误代码  
   * @param {Object} msg  错误信息  
   */  
  function _errorToast(code, msg) {  
    code !== 0 && code !== 3 && code !== 80103 && uni.showToast({ icon: 'none', title: msg || '网络异常,请稍候再试' })  
  }  

  // 强制用户退出  
  function _forceLogout() {  
    uni.showToast({  
      icon: 'none',  
      title: '登录状态失效,请重新登录',  
      success() {  
        uni.clearStorageSync()  
        setTimeout(() => {  
          // #ifdef APP-PLUS  
          uni.reLaunch({ url: '/pages/start/app/index'})  
          // #endif  
          // #ifdef MP-WEIXIN  
          uni.reLaunch({ url: '/pages/start/index'})  
          // #endif  
        }, 800)  
      }  
    })  
  }  
}  

export default {  
  $api: API.$api,  
  // #ifdef MP-WEIXIN  
  loginCode() {  
    return new Promise(resolve => {  
      uni.login({  
        success(res) { resolve(res.code || null) },  
        fail() { resolve(null) }  
      })  
    })  
  },  
  checkSession() {  
    return new Promise(resolve => {  
      uni.checkSession({  
        success() { resolve(true) },  
        fail() { resolve(false) }  
      })  
    })  
  },  
  wxMiniLogin(code) {  
    return new Promise(resolve => {  
      uni.showModal({  
        title: '温馨提示',  
        content: `微信授权登录后才能正常使用“${getApp().globalData.appName}"`,  
        cancelColor: '#de6352',  
        confirmColor: '#206ddb',  
        success(modal) {  
          if (modal.confirm) {  
            uni.getUserProfile({  
              lang: 'zh_CN',  
              desc: '展示并完善用户资料信息',  
              success(res) {  
                if (res.iv && res.encryptedData) {  
                  STORE.commit('setUserInfo', {  
                    avatar: res.userInfo.avatarUrl,  
                    nickname: res.userInfo.nickName  
                  })  
                  resolve(_AppNet({  
                    loading: true,  
                    url: API.$api.login.wx_mini,  
                    method: 'POST',  
                    data: { code, iv: res.iv, encrypted_data: res.encryptedData }  
                  }))  
                } else {  
                  resolve(null)  
                }  
              },  
              fail() {  
                resolve(null)  
              }  
            })  
          } else {  
            resolve(null)  
          }  
        }  
      })  
    })  
  },  
  // #endif  
  get(url, options) {  
    return _AppNet({  
      url, method: 'GET',  
      data: (options && options.data) ? options.data : {},  
      error: options ? (options.error === false ? false : true) : true,  
      loading: options ? (options.loading === false ? false : true) : true  
    })  
  },  
  post(url, options) {  
    return _AppNet({  
      url, method: 'POST',  
      data: (options && options.data) ? options.data : {},  
      params: (options && options.params) ? options.params : {},  
      error: options ? (options.error === false ? false : true) : true,  
      loading: options ? (options.loading === false ? false : true) : true  
    })  
  }  
}

操作步骤:

  • 同一份代码,离线打包apk

预期结果:

  • 安装到手机上正常访问网络

实际结果:

  • 安装到手机上无法联网

bug描述:

  • 同一份代码,在小程序、iOS模拟器、Android模拟器均可以正常访问网络,但根据相关文档在Android Studio(2021.1.1 Patch 3)配置好离线SDK工程打包Release包安装到手机上就无法联网

示例图片 示例图片


更多关于uni-app 离线打包安卓APK(Release)安装到手机上无法联网的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 离线打包安卓APK(Release)安装到手机上无法联网的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在 uni-app 离线打包安卓 APK 后,如果安装到手机上无法联网,可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决:


1. 检查网络权限

确保在 AndroidManifest.xml 文件中已经添加了网络权限。如果没有添加,应用程序将无法访问网络。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 打开 AndroidManifest.xml 文件(通常位于 app/src/main/AndroidManifest.xml)。
  • 确保上述权限已经添加。

2. 检查 HTTPS 配置

如果应用访问的是 HTTPS 接口,确保服务器证书是有效的,并且客户端支持 HTTPS 请求。如果证书有问题,可能会导致请求失败。

  • 如果是自签名证书,需要在客户端进行特殊处理。
  • 确保服务器配置正确,支持 HTTPS 请求。

3. 检查网络请求代码

确保在 uni-app 中的网络请求代码没有问题。例如,使用 uni.request 时,检查 URL 是否正确,请求方法是否匹配。

uni.request({
    url: 'https://example.com/api',
    method: 'GET',
    success: (res) => {
        console.log(res.data);
    },
    fail: (err) => {
        console.error('请求失败', err);
    }
});

4. 检查 Release 模式配置

在 Release 模式下,某些配置可能与 Debug 模式不同,导致网络请求失败。

  • 确保 build.gradle 文件中没有禁用网络请求的配置。
  • 检查是否启用了混淆(ProGuard),如果启用了,确保网络请求相关的类没有被混淆。

proguard-rules.pro 文件中添加以下规则:

-keep class com.tencent.** { *; }
-keep class com.alibaba.** { *; }
-keep class com.taobao.** { *; }
回到顶部