uni.setclipboarddata在app和小程序端可用,h5端完全不支持,需按平台条件编译并fallback:h5优先用navigator.clipboard.writetext()(需https/localhost+用户手势触发),降级用execcommand并注意ios的setselectionrange;鸿蒙需声明ohos.permission.read_pasteboard权限。

uni.setClipboardData 在 App 和小程序端能用,H5 端完全不支持——调了没反应、没报错、也不走 success 回调,这是上线前最常被卡住的地方。
uni.setClipboardData 为什么点一下没反应?
不是 API 写错了,而是环境或调用姿势不对:
- 没在用户手势触发的回调里调用,比如写在
mounted、setTimeout或Promise.then里,浏览器/小程序直接拦截 -
data参数不是字符串:传null、{}、123都会静默失败(剪贴板内容不变,也不报错) - App 端 Android/iOS 没配权限:manifest.json 里缺
"permissions": ["scope.clipboardWrite"](3.2.14+ 才支持该字段) - 微信小程序真机上被拒绝:
fail回调里出现errMsg: "setClipboardData:fail auth deny",说明用户没授权“获取剪贴板”
H5 端必须自己 fallback
uni.setClipboardData 在 H5 下直接无效,得切到原生方案:
- 优先用
navigator.clipboard.writeText(),但它只在 HTTPS 或localhost下可用,且必须由 click/tap 直接触发 - 降级用
document.execCommand('copy'):创建临时textarea、select()、再执行命令;注意 iOS Safari 要加setSelectionRange(0, text.length),否则可能复制空串 - 别忘了检测
window.isSecureContext,否则navigator.clipboard会抛NotAllowedError
鸿蒙平台要额外加权限声明
鸿蒙(HarmonyOS)读取剪贴板需显式申请 ohos.permission.READ_PASTEBOARD,否则 uni.getClipboardData 会失败:
- 在
harmony-configs/entry/src/main/module.json5里补配置项 - 写法必须是 JSON5 格式,
"name": "ohos.permission.READ_PASTEBOARD"不可拼错 - 复制(
setClipboardData)不需要此权限,但验证是否写入成功时若用getClipboardData就会触发权限检查
跨端封装建议:按平台条件编译 + 统一 Promise 接口
别写一堆 if-else 拼逻辑,用 uni-app 的条件编译更干净:
#ifdef APP-PLUS || MP
await uni.setClipboardData({ data: String(text) });
#endif
#ifdef H5
if (navigator.clipboard && window.isSecureContext) {
await navigator.clipboard.writeText(String(text));
} else {
const input = document.createElement('textarea');
input.value = String(text);
input.style.position = 'fixed';
document.body.appendChild(input);
input.select();
if (input.setSelectionRange) input.setSelectionRange(0, text.length);
document.execCommand('copy');
document.body.removeChild(input);
}
#endif
真正容易被忽略的是:H5 降级方案里 input.select() 后不加 setSelectionRange,iOS Safari 90% 概率复制失败;还有鸿蒙上漏配 READ_PASTEBOARD 权限,getClipboardData 就永远返回空。











