uni-app条件编译必须用// #ifdef PLATFORM与// #endif成对包裹,支持APP-PLUS、MP-WEIXIN、H5等平台标识,不可拼错或混用运行时判断,否则非目标平台会报错。

直接用条件编译,不是封装适配层,也不是运行时判断平台类型。
uni-app 条件编译怎么写才不翻车
条件编译是 uni-app 在编译阶段就剔除非目标平台代码的机制,不是 if (uni.getSystemInfoSync().platform === 'ios') 这类运行时判断 —— 那种写法在 H5 上会报错,因为 plus.networkinfo 根本不存在。
- 必须用
// #ifdef APP-PLUS、// #ifdef MP-WEIXIN、// #ifdef H5等官方支持的平台标识,不能拼错(比如APP-PLUS不能写成APP-PLUS-NATIVE) - 每个条件块必须成对出现:
// #ifdef和// #endif缺一不可,否则 HBuilderX 编译会静默跳过后续代码 - 多个平台共用逻辑,用
// #ifdef APP-PLUS || MP-WEIXIN,但注意 H5 不支持||多条件,得拆成两个块 - 在
script中写条件编译,要确保语法合法:比如// #ifdef APP-PLUS后面不能紧跟const foo =,得包在函数或逻辑块里,否则 TypeScript 类型检查会报错
调用原生 WiFi API 时 Android 和 iOS 的关键差异
比如想获取当前连接的 WiFi 名称,在 App 端必须走 plus.networkinfo,但 iOS 和 Android 的字段名和返回结构不同:
- Android 返回
ssid字段是带引号的字符串(如"MyWiFi"),而 iOS 返回的是无引号纯文本,直接.trim()不够,得正则清理 - iOS 要求开启
Access WiFi information权限并重签 profile,否则plus.networkinfo.getCurrentSSID()永远返回空字符串,且无任何错误提示 - H5 完全不支持该 API,条件编译里必须兜底,比如返回
'unknown'或直接跳过逻辑 - 小程序端没有
plus对象,得用wx.getConnectedWifi,但微信基础库 2.27.0+ 才支持,旧版本会进fail回调
为什么不能用运行时 platform 判断来调 API
因为很多端特有 API 在非目标环境根本无法 import 或访问,比如 plus 是 5+ SDK 注入的全局对象,只存在于 App 端;wx 在 H5 或 App 里是 undefined。一旦你写了 if (platform === 'app') { plus.xxx() },H5 编译后会直接报 ReferenceError: plus is not defined。
-
uni.getSystemInfoSync().platform返回值只有app、h5、mp-weixin等字符串,它不决定 API 是否可用,只反映当前运行环境 - 条件编译是在源码层面删代码,运行时判断是在字节码层面执行分支 —— 前者安全,后者危险
- 真机调试时,App 端可能因插件未安装导致
plus为空,这时即使条件编译写了// #ifdef APP-PLUS,也得加一层if (typeof plus !== 'undefined' && plus.networkinfo)防错
跨端请求头兼容性容易被忽略的点
比如你用 uni.request 发送 PATCH 请求,在 H5 和 App 端没问题,但在某些微信小程序基础库(如 2.25.2)里,method: 'PATCH' 会被自动转成 POST,且不报错 —— 导致后端收不到预期方法。
- 解决办法不是换 HTTP 方法,而是用条件编译:H5 / App 用
PATCH,小程序改用POST并在 header 加X-HTTP-Method-Override: PATCH - 小程序的
header不支持大写键名,Content-Type得写成content-type,否则被忽略 - App 端若启用了 HTTPS 证书校验(
sslVerify: true),自签名证书会失败,而 H5 和小程序默认绕过 —— 这个配置项只在// #ifdef APP-PLUS下生效
最麻烦的不是写不对条件编译,而是忘了删掉没覆盖到的平台残留逻辑 —— 比如在 // #ifdef MP-WEIXIN 块里调了 uni.showToast,但没写 // #ifdef H5 对应的 alert,结果 H5 用户啥反馈都没有。


















