ios端uni-app剪贴板功能静默失败主因是manifest.json未勾选「剪贴板」权限且未云打包,首次读取必触发系统授权弹窗,且必须由用户点击事件同步调用,不可在onload/onshow或异步链中执行。

iOS端manifest.json必须勾选「剪贴板」权限
uni-app在iOS真机上调用uni.setClipboardData或uni.getClipboardData静默失败,90%是因为没开这个开关。它不报错、不弹提示、控制台也无日志——纯黑盒式失败。
打开manifest.json → 左侧菜单点「App 设置」→ 展开「iOS 设置」→ 找到「剪贴板」选项并勾选。保存后需**重新云打包**(仅本地运行或调试器不会生效)。
注意:这个配置项只影响iOS原生层能力,和微信小程序无关;小程序的权限在mp-weixin节点下单独配置。
首次读取剪贴板会触发系统授权弹窗
iOS 14+ 对剪贴板访问有强制用户确认机制。哪怕你已在manifest.json里开了权限,第一次调用uni.getClipboardData仍会弹出系统级提示:“是否允许[你的App]访问剪贴板?”
- 用户点“不允许”后,后续调用直接返回空字符串,且
errMsg为"getClipboardData:fail auth deny" - 拒绝后无法通过代码再次触发弹窗,必须引导用户去「设置 → 隐私与安全性 → 剪贴板」手动开启
-
uni.setClipboardData写入操作不触发弹窗,但读取(getClipboardData)一定触发
别在onLoad/onShow里自动读取剪贴板
iOS不允许非用户手势上下文访问剪贴板。把uni.getClipboardData写在onLoad、onShow甚至setTimeout里,都会被系统拦截,返回空或直接reject。
正确做法只能是绑定用户点击事件:
- 按钮
@click="handlePaste",里面再调uni.getClipboardData - 不能放在Promise.then、async/await链的非直接响应分支中
- 不能由
uni.onMemoryWarning等系统回调触发
复制中文乱码或带不可见字符?先清理再写入
iOS对剪贴板内容敏感,若传入含HTML实体、零宽空格(\u200b)、换行符的字符串,粘贴时可能显示异常或被截断。
写入前建议清洗:
const cleanText = text .replace(/[\u200b-\u200f\u202a-\u202f]/g, '') // 清零宽字符 .replace(/ /g, ' ') .replace(/]*>/g, '') // 去HTML标签(如果来源是富文本) .trim()
再传给uni.setClipboardData({ data: cleanText })。否则用户在备忘录或微信里粘贴出来可能是乱码或空格丢失。











