uni-app 无法获取剪贴板历史记录,因系统剪贴板仅存储单值,所有平台均只支持读取当前最新内容;所谓“历史”需自行通过定时轮询+去重缓存实现,且仅限当前页面生命周期内有效。

uni-app 没有 API 能获取剪贴板历史记录。所谓“历史记录”是用户误读——系统剪贴板(iOS/Android/HarmonyOS/小程序)本质是单值存储,只保留最后一次写入的内容,不存在“多条历史”或“时间线”。所有声称“读取历史”的方案,实际都是前端自己缓存 + 轮询模拟。
uni.getClipboardData 只能读当前最新值
调用 uni.getClipboardData 拿到的永远是系统剪贴板里当前那一项内容,不是列表、不是栈、不带时间戳。它没有 history、no entries、no index 参数。你反复调用,得到的只是同一份数据的多次快照。
- 如果用户刚复制了 “abc”,再复制 “xyz”,
uni.getClipboardData第二次调用一定返回 “xyz”,第一次的 “abc” 已被覆盖,不可恢复 - 鸿蒙平台同样如此,
ohos.permission.READ_PASTEBOARD权限只允许读当前值,不开放历史访问接口 - 微信小程序、支付宝小程序、H5 浏览器全都不提供历史访问能力,这是平台级限制,不是 uni-app 封装问题
所谓“历史”只能靠自己缓存 + 轮询
想实现类似“看到最近 3 次复制过什么”的效果,必须自己动手做两件事:定时读取 + 去重缓存。但要注意这不是真正的历史,而是你程序运行期间捕获的片段。
- 轮询间隔建议设为
1000ms,太密会耗电,太松会漏掉短时操作 - 每次成功读取后,用
Array.unshift()插入新值,并用Set或JSON.stringify去重,避免连续复制同一内容重复入列 - 必须在
onShow启动定时器,在onHide清除,否则切后台后 iOS 可能直接 suspend 定时器,Android 也可能被系统 kill - 缓存数组长度建议限制在
5~10条,避免内存泄漏,尤其长期驻留页面时
别踩这些坑
很多开发者试图用 uni.getClipboardData 在 onLoad 或 mounted 里自动读,结果拿到空字符串或失败回调——这不是历史读不到,而是平台根本不允许静默读取。
- iOS 14+ 和 Android 12+ 都要求必须由用户手势(
tap、click)触发,否则直接拒绝或返回空 - H5 平台连
uni.getClipboardData都不支持,调用即静默失败,更别说历史 - 鸿蒙上若没在
harmony-configs/entry/src/main/module.json5中声明ohos.permission.READ_PASTEBOARD,第一次读会弹窗,拒绝后后续所有调用都失败,且不会提示原因 - 剪贴板内容常含零宽字符(如
\u200b),看着像空字符串,但res.data.length > 0,清洗要用res.data.replace(/[\u200b-\u200f\u202a-\u202f]/g, '')
真正能落地的“历史”就是你自己记的那几条,而且只在当前页面生命周期内有效。跨页面、跨启动、跨 App 的剪贴板历史,原生平台不提供,uni-app 也无从封装。











