准备 UniApp 基础项目,确保项目中包含 uni.onNetworkStatusChange 网络状态监听代码(参考 “补充代码示例”);
通过脚本修改项目核心标识,打包生成两个独立应用:
应用 A:替换 manifest.json 中 appid(如:UNIA123456)、app-plus -> ios -> bundleId(如:com.test.appa)、app-plus -> android -> package(如:com.test.appa);
应用 B:替换 manifest.json 中 appid(如:UNIB789012)、app-plus -> ios -> bundleId(如:com.test.appb)、app-plus -> android -> package(如:com.test.appb);
确认两个应用的 AppID、BundleID、Android 包名完全不同,且使用独立签名文件打包;
将 App A 和 App B 同时安装到同一 iOS 测试设备;
打开 App B,确认 uni.onNetworkStatusChange 监听显示 isConnected: true(设备网络正常,App B 网络权限开启);
进入 iOS 系统设置 → 蜂窝网络(或无线局域网)→ 找到 App A,关闭其网络权限(切换为 “关闭” 状态);
回到 App B,观察 uni.onNetworkStatusChange 监听输出的 isConnected 字段,发现已变为 false,但 App B 实际可正常访问网络(如打开网页、接口请求正常);
重复步骤 4-6,关闭 App B 网络权限,App A 会出现相同误判问题。
- 发布:2025-12-03 14:25
- 更新:2025-12-03 16:24
- 阅读:19
产品分类: uniapp/App
PC开发环境操作系统: Mac
PC开发环境操作系统版本号: Apple M3 Max
手机系统: iOS
手机系统版本号: iOS 16
手机厂商: 苹果
手机机型: iPhone 14 pro
页面类型: vue
vue版本: vue3
打包方式: 云端
项目创建方式: CLI
CLI版本号: 4.85
操作步骤:
预期结果:
两个独立应用(不同 AppID/BundleID)的网络状态相互独立:关闭其中一个应用的网络权限,另一个应用的 uni.onNetworkStatusChange 应正确返回自身网络状态(isConnected: true,因自身网络权限未关闭且设备网络正常)。
两个独立应用(不同 AppID/BundleID)的网络状态相互独立:关闭其中一个应用的网络权限,另一个应用的 uni.onNetworkStatusChange 应正确返回自身网络状态(isConnected: true,因自身网络权限未关闭且设备网络正常)。
实际结果:
关闭其中一个应用的网络权限后,另一个应用的 uni.onNetworkStatusChange 误判为 isConnected: false,与实际网络状态不符。
关闭其中一个应用的网络权限后,另一个应用的 uni.onNetworkStatusChange 误判为 isConnected: false,与实际网络状态不符。
bug描述:
Bug 描述
通过脚本替换 AppID、BundleID(iOS)、Android 包名等核心标识后,打包生成两个独立的 UniApp 应用(记为 App A 和 App B)。将两个应用安装在同一 iOS 设备上,当在 iOS 系统设置中关闭 App A 的网络权限(蜂窝网络 / 无线局域网)后,App B 的网络权限仍为开启状态,但通过 uni.onNetworkStatusChange 监听获取到的 isConnected 字段却变为 false(实际 App B 可正常联网),导致 App B 网络相关功能误判。
反之,关闭 App B 的网络权限,App A 也会出现相同的 uni.onNetworkStatusChange 误判问题。Android 端相同打包方式下,两个应用网络状态相互独立,无此问题。
此问题源于iOS系统网络状态检测机制的特性,非uni-app Bug。iOS的Reachability API(uni-app底层依赖)仅检测系统级网络状态,而非应用级权限。当关闭任一App的网络权限时,系统仍报告"有网络连接",但iOS会阻止该App的实际网络请求。uni.onNetworkStatusChange的isConnected字段反映的是系统级状态,而非当前App的权限状态,导致误判。
解决方案:
- 主动验证网络连通性:在
uni.onNetworkStatusChange回调中,通过发起简单HTTP请求(如访问https://www.dcloud.io)验证实际连通性,而非仅依赖isConnected。 - 使用原生插件:推荐插件市场网络状态增强插件,可检测应用级网络权限(需iOS 12+)。
- 权限预检查:在关键网络操作前,调用
plus.ios.invoke('UIApplication', 'sharedApplication', 'openURL:', ['prefs:root=WIFI'])引导用户检查权限(需配置URL Schemes白名单)。
注意:
- iOS首次安装会弹出联网授权框,用户拒绝后需手动在设置中开启(参考文档注意事项)。
- 此行为是iOS设计特性,Android因权限管理机制不同而无此问题。建议通过实际请求验证网络状态,而非完全依赖系统API。