页面上放了个复制订单号的按钮,小程序里点了正常,到了手机浏览器上按下去毫无反应。控制台没报错,代码也没改。这类问题基本都出在端的能力差异上。
写法本身很简单
调 uni.setClipboardData,把要复制的字符串放进 data,成功回调里再弹一个提示。就两三行,接口是跨端的,名字在各端一致。
有个细节:微信小程序复制成功后会自己弹一个内容已复制的浮层,你再调一次 uni.showToast,屏幕上会叠两个提示,看着像出错。做小程序的页面,把自定义提示去掉就行。
H5 端受浏览器限制
浏览器只允许在用户操作的当下执行复制,也就是点击事件的同步流程里。你把复制写在 await 之后、setTimeout 里、或者接口回调里,浏览器就会认为这不是用户主动触发,直接拒绝,还不一定报错。
所以顺序要反过来:点击时先同步复制一个占位内容或者当前已有的文本,需要的话再异步去取。页面不是 https 的,部分浏览器同样会拒绝复制,这个跟代码无关,换协议才能解决。
App 端要注意权限
复制一般没问题,读取剪贴板 uni.getClipboardData 在部分安卓机型上会要权限,还可能在隐私合规检查里被拦。上架前的隐私清单里要把剪贴板用途写清楚,不然审核会打回。
iOS 上从别的应用读剪贴板时,系统会弹一条粘贴提示,这是系统行为,去不掉,别当成 bug 反复改代码。
内容本身的坑
复制的文本前后带空格,粘贴到别的系统里对不上,拼字符串时先 trim。带换行的多行内容,有的输入框只认第一行,这种要在提示里说清楚。超长文本部分平台会截断,别把一整段日志塞进去。
调试别在浏览器里看一遍就交差,真机上过一遍,安卓和 iOS 各试一次。同样的代码,端不同表现能差很远,这一点在剪贴板这种系统能力上尤其明显。