uni-app 无法获取剪贴板历史记录,因系统剪贴板仅保存最后一次写入的单个字符串,所有平台均无历史功能;需自行缓存+轮询实现最近复制内容捕获。

uni-app 无法获取剪贴板历史记录——系统剪贴板本身就不存“历史”,只保留最后一次写入的单个字符串,所有平台(iOS/Android/HarmonyOS/小程序/H5)均如此。
为什么 uni.getClipboardData 返回的永远是“最新一条”
调用 uni.getClipboardData 拿到的只是当前系统剪贴板里那一项内容,不是数组、不带时间戳、没有索引参数。你复制 “abc” 后再复制 “xyz”,第二次调用一定返回 “xyz”,“abc” 已被覆盖且不可恢复。
- 鸿蒙平台需声明
ohos.permission.READ_PASTEBOARD,但该权限也只允许读当前值 - 微信/支付宝小程序要求 manifest.json 中配置
scope.writeClipboard,否则 iOS 真机静默失败 - H5 完全不支持
uni.getClipboardData,调用即静默无响应,更别说历史 - 所谓“历史记录”是用户对系统行为的误读,不是 uni-app 封装缺陷,而是原生平台统一限制
想实现“最近几次复制过什么”,只能自己缓存 + 轮询
可行方案是:在页面前台时定时读取 + 对比内容变化 + 去重缓存。这不是读系统历史,而是你程序运行期间捕获的片段。
- 轮询间隔设为
1000ms:太密耗电,太松会漏掉快速连续复制 - 必须在
onShow启动定时器,在onHide清除,否则切后台后 iOS 可能 suspend,Android 可能被 kill - 每次读取成功后,用
Array.unshift()插入新值,并用Set或正则去重(避免连续复制同一内容重复入列) - 缓存数组长度建议限制在
5~10条,防止长期驻留页面导致内存泄漏 - 注意清洗零宽字符:
res.data.replace(/[\u200b-\u200f\u202a-\u202f]/g, ''),否则看着像空字符串但res.data.length > 0
常见踩坑:为什么“读不到”或“读出来是空”
问题几乎都不出在“历史读取逻辑”,而在于平台规则和调用时机。
- 在
onLoad、onShow或定时器里直接调uni.getClipboardData→ iOS/Android 14+ 强制拒绝,返回空或fail auth deny - 没由用户手势(click/tap)触发 → 所有平台都会拦截,H5 尤其严格,连
Promise.then包一层都失效 - 首次拒绝授权后,iOS 会记住状态,后续调用不再弹窗,必须引导用户去「设置 > 隐私 > 剪贴板」手动开启
- 小程序未在 manifest.json 的对应平台节点(如
mp-weixin)下声明权限 → 真机无提示、无日志、纯静默失败 - 复制内容含不可见字符(如微信转发口令里的
\u200b),data.trim().length === 0为 false,但肉眼看不见
真正落地的关键点就两个:一是接受“系统无历史”的事实,二是把缓存逻辑做轻、做稳、做及时清理——轮询不是监听,缓存不是备份,它只在当前页面生命周期内有效,且极易因切后台、权限拒绝、字符污染而中断。别指望它 100% 捕获,更别把它当系统能力来设计交互流程。


















