微信小程序读取剪贴板需在公众号后台用户隐私指引中显式勾选并说明用途,否则调用uni.getClipboardData会因权限未声明而失败;iOS真机首次调用还会触发系统原生弹窗,且必须在用户手势同步上下文中执行。

微信小程序必须在用户隐私指引里显式勾选“读取剪贴板”
直接调用 uni.getClipboardData 报 setClipboardData:fail 或 getClipboardData:fail auth deny,八成不是代码问题,而是微信平台强制要求的隐私声明没配。这个弹窗不是 uni-app 自动触发的,而是微信在检测到你调用了剪贴板 API 后,结合后台配置决定是否弹出系统级提示——但前提是:你得先在公众号后台「用户隐私指引」里勾选并说明用途。
操作路径:微信公众平台 → 设置 → 基本设置 → 服务内容声明 → 用户隐私指引 → 更新 → 增加信息类型 → 勾选「读取剪贴板」,填写使用场景(例如:“用于读取用户复制的邀请口令”)→ 生成新版本 → 提交审核。
常见踩坑点:
- 只改了代码、没走这一步,真机必失败,且错误信息模糊(如
scope is not declared in the privacy agreement) - 改完不清理微信缓存:长按小程序图标 →「清除缓存」→ 重新进入,否则旧配置仍生效
- 误以为 manifest.json 里的
mp-weixin.permission配置能替代此步骤——它只影响“写入”,不覆盖“读取”的隐私声明要求
iOS 原生端首次读取会触发系统级授权弹窗
uni.getClipboardData 在 iOS 真机上首次调用时,一定会弹出系统原生弹窗:“是否允许 [你的App] 访问剪贴板?”,这个弹窗无法跳过、不能自定义、也不受 uni-app 控制。它和 manifest.json 的权限开关是两件事:前者是系统行为,后者是能力开关。
关键事实:
- manifest.json 必须开启「剪贴板」权限(App 设置 → iOS 设置 → 勾选「剪贴板」),否则连系统弹窗都不会出现,静默失败
- 用户点“不允许”后,后续所有
uni.getClipboardData调用都返回空字符串,errMsg为"getClipboardData:fail auth deny" - 拒绝后无法通过代码再次触发该弹窗,必须引导用户手动去「设置 → 隐私与安全性 → 剪贴板」开启
-
uni.setClipboardData写入不触发弹窗,只有读取(getClipboardData)才触发
H5 和 App 端没有统一的隐私弹窗机制
H5 平台根本不支持读取剪贴板,navigator.clipboard.readText() 会因浏览器策略被拒,uni-app 底层 fallback 也只会返回 permission-denied;App 端(iOS/Android)则依赖原生能力,但 DCloud 没提供跨端统一的隐私弹窗组件——所谓“设置弹窗”,其实是你得自己判断平台 + 权限状态 + 用户历史选择,再决定是否手绘一个引导页。
实操建议:
- 调用
uni.getClipboardData前,先用uni.getSystemInfoSync().platform判断平台,H5 直接禁用读取入口或提示“浏览器暂不支持” - App 端可结合
plus.runtime.getProperty('privacyAgreed')判断隐私协议是否已同意,但注意:这和剪贴板授权无关,只是避免在未同意隐私协议前就尝试读取 - 不要试图用
uni.showToast模拟授权弹窗——它不是隐私弹窗,审核不认,用户也看不懂
别在非用户手势上下文中调用 getClipboardData
这是最隐蔽也最常被忽略的失败原因:iOS 和微信小程序都要求 uni.getClipboardData 必须在用户点击(tap/click)的同步执行流中调用。任何异步延迟都会丢失这个“手势上下文”,导致静默失败或返回空。
典型错误写法:
- 放在
onLoad、onShow里自动读取 - 写在
Promise.then、await api()后面 - 用
setTimeout(() => { uni.getClipboardData() }, 0)包裹
正确做法:
- 绑定到按钮的
@click事件处理器里,直接调用 - 如果必须先请求数据(比如获取短链),可用
setTimeout(() => { uni.getClipboardData() }, 100)强制回归用户手势上下文(实测有效,但非官方推荐) - 输入框要自动聚焦并选中内容,记得用
this.$nextTick(() => this.$refs.input.focus()),且 input 不能是disabled或readonly


















