剪贴板内容无过期机制,需业务层手动打时间戳并校验:每次调用 uni.getclipboarddata 后存 date.now() 到本地存储,粘贴时比对差值判断是否超时,并在用户手势触发的 click 中处理,不可依赖 onshow 或后台监听。

剪贴板内容本身没有“过期”机制,uni-app 也**不提供自动监听剪贴板变更或时效性判断的 API**。所谓“过期提醒”,本质是业务层对剪贴板内容做时间戳标记 + 主动校验,不是系统能力。
怎么给剪贴板内容加时间戳并校验
你无法让系统告诉你“这个文本是 5 分钟前复制的”,但可以在用户点击「粘贴」时,顺手记录当前时间,并和上次读取时间比对。
- 每次成功调用
uni.getClipboardData后,立刻用Date.now()记录时间戳,存到uni.setStorageSync('clipboard_ts', Date.now()) - 下次点击粘贴按钮时,先读
uni.getStorageSync('clipboard_ts'),再算差值:if (Date.now() - ts > 5 * 60 * 1000) { /* 超过 5 分钟 */ } - 注意:这个时间戳只反映「你上次读到它的时间」,不是系统剪贴板内容的真实创建时间——用户可能早就复制了,你只是刚读到
为什么不能依赖 onShow 自动检测剪贴板是否“过期”
onShow 里直接调 uni.getClipboardData 在 iOS/Android 上大概率失败,且 H5 完全不支持读取。更关键的是:即使读到了,你也无法知道它是几秒前还是几小时前复制的。
- iOS 14+ 和多数 Android 厂商要求必须由用户手势(如
@click)触发,onShow属于生命周期钩子,无用户上下文 → 直接被原生层拒绝 - H5 平台调用
uni.getClipboardData会静默返回空或permission-denied错误,控制台也不报错 - 即使侥幸读到内容,剪贴板本身不携带元信息(如时间、来源),你只能靠自己打标
真正可行的“过期提醒”交互流程
不要试图后台自动轮询或监听,聚焦在用户主动操作那一刻的判断与反馈。
- 按钮绑定
@click="handlePaste",而不是在onShow或定时器里跑逻辑 -
handlePaste中先调uni.getClipboardData,成功后立即检查本地存储的时间戳 - 若距上次读取超时(比如 10 分钟),弹
uni.showModal提示:“检测到较早复制的内容,是否仍要使用?”而非直接填入 - 清理逻辑要同步:一旦用户确认使用,就更新时间戳;若用户取消,不更新,下次进来还能再提醒
- 别忘了清洗内容:微信转发链接里的
\u200b零宽字符会让data.trim().length === 0判定失效,建议先data.replace(/[\u200b-\u200f\u202a-\u202f]/g, '')
真正难的不是时间计算,而是说服产品接受:剪贴板没有“活期账户”,只有“快照”。所有“过期”都是你按自己规则拍的快门,不是系统告诉你的事实。











