iOS 14+ 弹窗是系统强制隐私提示,无法绕过;应通过正则预筛+用户手势触发+避免轮询来减少干扰,且需清洗零宽字符。
这不是 bug,是 iOS 系统级隐私策略:只要调用 uni.getClipboardData() 读取 string、URL 等具体内容,就会触发系统提示。哪怕你只读一次,用户首次使用时也必然弹窗——这是苹果强制设计,无法绕过。
核心思路是「不盲目读,先探再取」:用 iOS 14+ 新增的 hasStrings / hasURLs 等无感检测 API 判断剪贴板是否有目标内容,仅当命中规则时才真正读取。
UIPasteboard.hasStrings、UIPasteboard.hasURLs 等方法,调用它们不会触发弹窗
uni.getSubNVue 或原生插件桥接调用;更现实的做法是:在 manifest.json 的「App 设置」→「iOS 设置」里勾选「剪贴板」权限,并在业务逻辑中加一层守门判断data.replace(/[u200b-u200fu202a-u202f]/g, '').trim() 后长度 > 0 且含「¥」符号,再调用 uni.getClipboardData() —— 这样可过滤掉纯空格、零宽字符等无效内容,避免无意义触发常见错误是把 uni.getClipboardData() 放在 onShow、onLoad 或定时器里自动执行。iOS 要求必须由明确用户手势(tap/click)触发,否则要么失败,要么每次进页面都弹窗。
@click="handlePaste",不能靠 mounted 自动拉取onShow 里调,等于每次「假装是首次」想实现「粘贴口令后自动填入」?别用 500ms 定时器轮询 uni.getClipboardData()。iOS 后台任务极易被挂起,且频繁读取会叠加弹窗、耗电、被系统限频。
onShow 启动、onHide 清除定时器;间隔设为 ≥1200ms;每次读取前先 data.trim().length > 0 判断,避免空内容触发无谓弹窗uni.getClipboardData() 直接返回 permission-denied 或空对象,别在这儿浪费调试时间u200b)的口令,看着像空,实际 data.length > 0,但 data.trim().length === 0 为 false——这种情况下,你没做清洗就直接比对或提交,会导致匹配失败,用户以为功能坏了,其实只是你没处理不可见字符。