uni.getClipboardData 返回空字符串的主因是触发时机不当、剪贴板内容含零宽字符未清洗、平台权限配置缺失;须在用户点击事件中调用,清洗控制字符,并按平台规范配置权限。

uni.getClipboardData 返回空字符串,基本不是 API 坏了,而是触发时机、平台权限或内容污染没处理好。直接看这三点,90% 的问题当场解决。
调用必须在用户点击(@click 或 @tap)上下文中
iOS 14+ 和主流 Android 厂商(华为、小米、OPPO)强制要求:剪贴板读取必须由用户真实手势同步触发。放在 onLoad、onShow、setTimeout、Promise 回调里,一律静默返回空字符串。
- 错误写法:
onShow() { uni.getClipboardData({ success: res => console.log(res.data) }) }→ iOS 真机必空,Android 可能无回调 - 正确写法:绑定按钮,例如
,在handlePaste方法里调用uni.getClipboardData -
@touchstart不算有效手势,必须是@click或@tap
剪贴板内容含零宽字符(如 \u200b),看着像空
微信、钉钉转发口令时,常在前后插入 Unicode 控制字符,res.data 长度不为 0,但 res.data.trim() 无效,JSON.stringify(res.data) 能看到 "\u200babc\u200b" 这类输出。
- 清洗正则必须覆盖常见控制符:
res.data.replace(/[\u200b-\u200f\u202a-\u202f\u2060-\u2064\uFEFF]/g, '') - 建议封装成工具函数:
cleanClipboardText(data),每次成功回调后都过一遍 - 清洗后若为空,应主动提示“未检测到有效口令”,别静默吞掉
平台权限配置缺失或误用
不同平台权限机制完全不同,漏配一项就返回空,且多数情况不报错、不进 fail 回调。
- App 端(iOS):
manifest.json→「iOS 设置」→ 勾选「剪贴板」→ 必须重新云打包(本地调试不生效) - 微信小程序:
manifest.json的mp-weixin节点下加权限声明,desc字段不能少:"permission": { "scope.writeClipboard": { "desc": "用于自动填入口令" } } - H5 平台:
uni.getClipboardData完全不可用,必须降级为navigator.clipboard.readText(),且仅支持 HTTPS + 用户手势同步调用 - 首次拒绝授权后,iOS 系统级限制无法代码重试,只能提示用户手动去「设置 > 隐私与安全性 > 剪贴板」开启
真正难的不是写对那行 uni.getClipboardData,而是让整个链路始终卡在平台认可的“安全上下文”里——尤其 iOS 和微信最较真,稍一松懈就空,而且不告诉你为什么。











