uni.setclipboarddata不能跨端通用,h5端完全不支持且静默失败;app和小程序可用,但必须满足用户点击事件第一层调用、data为字符串、平台权限正确配置三重条件。

uni.setClipboardData 不能跨端通用,H5 端完全不支持,强行调用静默失败;App 和小程序可用,但必须满足触发时机、权限配置、参数类型三重硬性条件。
为什么点按钮没反应?检查这三点
这个 API 表面简单,错一个就彻底失效,且不报错、不弹提示、控制台也无日志:
- 调用不在用户点击事件的第一层:比如写在
setTimeout、Promise.then、this.$nextTick或生命周期钩子(onLoad、onShow)里,iOS 和部分安卓 WebView 会直接拦截 -
data参数不是字符串:传number、null、object会转成空串或[object Object],务必先String(text)或JSON.stringify(obj) - 平台权限没配:App 端 iOS 需在
manifest.json→「App 设置」→「iOS 设置」勾选「剪贴板」;Android 需在「模块权限配置」启用clipboard模块
小程序端必须声明 scope.writeClipboard 权限
微信/支付宝等小程序不会自动获得剪贴板写入权限,不声明就静默拒绝:
- 在
manifest.json的对应平台节点下添加权限配置,例如微信:"mp-weixin": { "permission": { "scope.writeClipboard": { "desc": "用于复制链接或订单号" } } } - 支付宝小程序例外:它不认
uni.setClipboardData,必须用my.setClipboard,且返回结构是{ text }而非{ data } - 首次调用若被用户拒绝,iOS 会记住状态,后续调用仍失败,需引导用户去「设置 → 隐私与安全性 → 剪贴板」手动开启
H5 端必须弃用 uni.setClipboardData,改用原生方案
uni.setClipboardData 在 H5 下调用后既不进 success 也不进 fail,纯静默失败。必须降级:
- 优先用
navigator.clipboard.writeText,但仅在 HTTPS 或localhost下可用;http://192.168.x.x本地调试会抛NotAllowedError - 必须由用户手势(
click、tap)**直接触发**,包一层setTimeout就失效 - 旧版安卓 WebView(如 UC、QQ 浏览器)不支持
navigator.clipboard,得 fallback 到document.execCommand('copy');此时必须创建临时textarea,调用.select()后立即执行.setSelectionRange(0, txt.length),否则 iOS Safari 复制为空串
封装多端兼容的复制函数要注意什么
不要裸调 uni.setClipboardData,按平台分流是最稳妥的做法:
- 先用
uni.getSystemInfoSync().platform判断当前环境:'app'、'mp-weixin'、'h5'等 - H5 分支要双保险检测:
if (navigator.clipboard && window.isSecureContext),再await navigator.clipboard.writeText(text) - execCommand 降级时,
textarea必须 append 到document.body,复制完记得removeChild,避免 DOM 泄漏 - 所有分支最后都建议加
uni.showToast反馈,但别依赖 success 回调——H5 的navigator.clipboard是 Promise,而uni.setClipboardData是回调风格,混用容易漏 catch
最易被忽略的是:iOS 真机上,即使代码和权限都对,若没做云打包,manifest.json 的「剪贴板」勾选项也不会生效;H5 开发时用 http 协议本地调试,navigator.clipboard 必然失败,必须切到 https://localhost 或真机预览。











