应使用条件编译而非uni.getSystemInfoSync().platform判断目标平台,因其返回底层运行环境(如“android”“ios”“devtools”)而非编译目标(如“mp-weixin”“h5”);process.env.UNI_PLATFORM才是编译期注入的稳定平台标识,值严格对应目标平台,推荐优先用于平台差异化逻辑。

uni.getSystemInfoSync().platform 判断平台类型
直接用 uni.getSystemInfoSync().platform 获取当前运行环境,这是最可靠、不依赖构建变量的运行时判断方式。它返回字符串 "app"、"mp-weixin"、"h5" 等,而非 process.env.UNI_PLATFORM(后者是编译时静态值,H5 打包进小程序会出错)。
-
platform === 'app'或platform === 'mp-weixin':可安全调用uni.setClipboardData -
platform === 'h5':必须弃用uni.setClipboardData,改走navigator.clipboard.writeText或document.execCommand('copy') - 不要只靠
typeof uni.setClipboardData === 'function'判断——H5 下该函数存在但内部是空实现,调用后既不 success 也不 fail
检查 navigator.clipboard 是否可用(H5 专用)
H5 环境下,uni.setClipboardData 是无效的,真正要测的是原生剪贴板能力。但不能只看 navigator.clipboard 是否存在,还要确认是否在安全上下文里。
- 先判断
!!navigator.clipboard?.writeText,排除老浏览器(如 IE、旧版 Safari) - 再检查协议:
window.location.protocol === 'https:' || window.location.hostname === 'localhost',否则navigator.clipboard.writeText会直接抛NotAllowedError - 即使满足以上,也必须在用户点击事件同步执行栈中调用——
setTimeout(() => { navigator.clipboard.writeText(...) }, 0)会失败
小程序端必须配合 manifest.json 权限声明
光平台判断对了还不够。微信小程序即使 platform === 'mp-weixin',若没配权限,uni.setClipboardData 仍报 setClipboardData:fail,且不提示具体原因。
- 检查
manifest.json → mp-weixin → permission → scope.writeClipboard是否存在且desc非空 - 配置后必须提交审核才能生效;开发阶段也要清除微信缓存(长按图标 →「清除缓存」),否则旧权限配置仍被加载
- 支付宝、百度等小程序平台也有类似机制,但配置路径不同,需查对应平台文档
App 端需确认模块已启用
App 平台下,platform === 'app' 只代表运行在 App 容器里,不代表剪贴板模块就一定可用。
- 打开
manifest.json → App 模块配置,确认「剪贴板」已勾选(iOS 尤其敏感,未勾选则静默失败,无任何错误提示) - HBuilderX 版本低于 3.2.13 时,部分 iOS 设备可能 fallback 到 Native.js 实现,行为不稳定
- 真机测试时,避免用「云打包」跳过模块检测——本地打包能更早暴露模块缺失问题
navigator.clipboard.writeText 报错,你得立刻切到 execCommand;而小程序里哪怕判断对了平台,漏掉 manifest.json 里一行 desc,照样白忙活。这些链路断点,全在配置和触发时机上,不在代码行数里。


















