uni.setclipboarddata的data参数必须为字符串,非字符串会静默转为"[object object]"或空串;需手动序列化(如json.stringify、base64编码),读取时再反序列化,并注意各平台权限、触发时机及零宽字符处理。

uni.setClipboardData 的 data 参数只能是字符串
uni-app 没有提供修改剪贴板“存储类型”的能力——系统剪贴板本身只支持纯文本(String),所有平台(iOS/Android/H5/小程序)均如此。你不能让 uni.setClipboardData 存 Uint8Array、Object 或 JSON 对象,传进去会静默转成 [object Object] 或空串。
所谓“改数据类型”,实际是你在写入前的序列化方式:必须手动转成字符串,且要保证后续能无损还原。
- 加密数据:用
CryptoJS.AES.encrypt(text, key).toString()得到 Base64 字符串;RSA 用jsencrypt时也要确认返回值是字符串(不是JSEncrypt实例) - 对象数据:必须
JSON.stringify(obj),别漏掉这步;解密或解析前再JSON.parse() - 二进制内容(如图片 base64):本身就是字符串,可直传,但注意长度——H5 下超 4000 字符可能被旧版 UC 截断
- 含换行的多行文本:确保 \n 保留,别被
innerText或富文本组件意外过滤掉
为什么传非字符串会静默失败
这是 uni.setClipboardData 的底层约束,不是 bug。它内部调用原生 API 时,Android ClipData.newPlainText()、iOS UIPasteboard.general.string、H5 navigator.clipboard.writeText() 全部只接受字符串。
常见踩坑点:
- 直接传
{ id: 123 }→ 写入的是[object Object] - 传
new ArrayBuffer(8)→ 变成[object ArrayBuffer] - 异步取值后没判空:
data: res?.data || ''忘了兜底,结果传undefined,剪贴板不变 - H5 环境下误用
uni.setClipboardData:它在 H5 不生效,得走navigator.clipboard.writeText,且必须用户点击第一层触发
剪贴板里存 JSON 字符串要注意什么
你存的是字符串,不是 JSON 对象——所以 uni.getClipboardData 返回的 res.data 一定是字符串类型,必须自己 JSON.parse()。
但不能无脑 parse,因为:
- 用户可能复制了别的内容(比如“hello”或网页标题),导致
JSON.parse()报SyntaxError - iOS 备忘录、微信转发常混入零宽字符(
\u200b、\u200c),看着像空串,实则res.data.length > 0,需先清理:res.data.replace(/[\u200b-\u200f\u202a-\u202f]/g, '') - 正则粗筛建议加一层:
/^\s*{[\s\S]*}\s*$/.test(str) || /^\s*\[[\s\S]*]\s*$/,避免无效解析 - 小程序和 App 端不会自动 trim 首尾空格或换行,但某些粘贴目标(如短信)会吞掉,建议开头结尾加
\u200B防裁剪
真正容易被忽略的点
不是“怎么转字符串”,而是“谁在什么时候读、用什么方式读”。uni.getClipboardData 在 H5 完全不可用;小程序需后台配置隐私协议;App 端必须在 manifest.json 开启剪贴板权限;iOS 14+ 和 Android 12+ 还要求用户手势触发才能读——这意味着你在 onLoad 或定时器里主动调用,大概率拿不到值,或者拿到的是旧数据。











