微信小程序需在隐私指引中勾选“读取剪贴板”并提交审核,iOS要求用户点击同步执行,App端需配置manifest.json,H5端须降级为navigator.clipboard或execCommand,data参数必须为非空字符串。

直接报 setClipboardData:fail,八成不是代码写错了,而是平台权限、触发时机或环境限制没到位。
微信小程序真机报 “scope is not declared in the privacy agreement”
这是最常见也最容易被忽略的卡点:微信要求你不仅在代码里调用 API,还得在公众号后台「用户隐私保护指引」里显式勾选“读取剪贴板”并说明用途。
- 去微信公众平台 → 左侧【设置】→【基本设置】→【服务内容声明】→【用户隐私指引】→【更新】→【增加信息类型】→ 勾选「读取剪贴板」,填写使用场景(如“用于复制邀请链接”)→ 生成并提交审核
- 即使 manifest.json 里配了
"scope.writeClipboard",没走这一步照样失败 - 改完后必须清除微信缓存:长按小程序图标 →「清除缓存」,再重新进入;否则旧配置仍生效
iOS 真机或微信内置浏览器复制静默失败
iOS 对剪贴板操作的安全限制最严——必须在用户点击(tap)的同步上下文中执行,任何异步延迟(比如 await getShortLink() 后再调用)都会丢掉这个上下文。
- 不要在 Promise.then、setTimeout、onLoad 里调用
uni.setClipboardData - 如果必须先请求数据,用
setTimeout(() => { uni.setClipboardData(...) }, 100)强制回归用户手势上下文(实测有效) - App 端还要确认 manifest.json →「App 模块配置」里勾选了「剪贴板」,否则 iOS 上连错误都不报,直接静默失败
H5 端调用 uni.setClipboardData 无反应或报错
uni.setClipboardData 在 H5 端根本不可用,它只是个空壳。不降级就会白跑一次,还可能抛出未捕获异常。
- 必须手动判断平台:
if (uni.getSystemInfoSync().platform === 'h5') - 优先用
navigator.clipboard.writeText(text),但注意:只支持 HTTPS 或localhost环境 - 降级 fallback:创建临时
+select()+document.execCommand('copy')(仅兼容老浏览器)
复制内容为空或非字符串导致失败
uni.setClipboardData 的 data 参数严格要求是字符串,传 number、object、null 都会直接 fail,且不报具体类型错误。
- 调用前务必做类型校验:
if (typeof text !== 'string' || !text.trim()) { ... } - JSON 数据要先
JSON.stringify(),数字要String(num) - 调试时加一行
console.log('copy data:', typeof text, text),比猜快得多
真正难的不是写对那行 uni.setClipboardData,而是让整个调用链始终处于平台认可的“安全上下文”里——这点 iOS 和微信最较真,稍一松懈就 fail,而且不告诉你为什么。











