必须捕获uni.setClipboardData的fail回调或catch异常,否则静默失败;Android需提示开启后台权限,H5需判断安全上下文并用try/catch处理,统一用icon:'none'避免警告。

复制失败时直接弹 uni.showToast 就行,但必须捕获 fail 回调或 catch 异常——否则静默失败,用户根本不知道发生了什么。
uni.setClipboardData 的 fail 回调必须显式处理
这个 API 在 App 或小程序里不是“调用即成功”,尤其在 Android 厂商定制系统(如华为、小米)上,后台权限被限制时会直接进 fail。不写 fail 就等于放弃反馈。
- 错误现象:点击复制按钮没反应,控制台也无报错,用户以为功能坏了
- 正确写法必须带
fail,且里面要调uni.showToast,不能只console.error - 示例:
uni.setClipboardData({<br> data: '123',<br> success: () => uni.showToast({ title: '已复制', icon: 'none' }),<br> fail: (err) => uni.showToast({ title: '复制失败', icon: 'none' })<br>}); - 注意:
err是对象,不同平台内容不同(App 可能是字符串,小程序可能是 { errMsg: 'xxx' }),别依赖err.message做判断
H5 端复制失败的 fallback 提示逻辑更关键
H5 不走 uni.setClipboardData,而是用 navigator.clipboard.writeText 或 document.execCommand('copy'),这两者失败原因更隐蔽,比如页面非 HTTPS、非用户手势触发、浏览器不支持等。
- 常见卡点:HTTP 页面下
navigator.clipboard直接抛NotAllowedError,不进catch?其实是会进的,但得确保是async/await+try/catch结构 - 推荐写法统一用
try/catch包裹整个 H5 分支,避免漏掉execCommand失败(它返回false,不是 Promise reject) - 示例中
document.execCommand('copy')后应检查返回值:if (!copied) { uni.showToast({ title: '复制失败,请重试' }); } - H5 下不要省略
window.isSecureContext判断,非安全上下文直接跳过navigator.clipboard,避免白屏级静默失败
提示文案和交互状态要区分失败类型
用户看到“复制失败”会焦虑,但你其实知道大概率是哪类问题——可以针对性提示,而不是笼统报错。
- Android App 失败:大概率是后台剪贴板权限被禁,提示“请开启应用后台运行权限”比“复制失败”有用得多
- H5 失败:如果是 HTTP 环境,提示“请在 https 网站中使用此功能”;如果是老浏览器,提示“当前浏览器不支持,请长按文本手动复制”
- 加个防抖状态变量(如
isCopying)避免用户连点多次,导致多个 toast 叠加或重复执行 - 别用
icon: 'error'——uni.showToast不支持该值,只能用'none'或'success',否则图标不显示还可能报 warning
真正容易被忽略的是:H5 下 navigator.clipboard 的失败不是“偶尔出错”,而是策略性拦截,不满足条件就铁定失败;而 App 端的失败往往和系统权限强相关,提示语必须指向具体可操作动作,而不是泛泛说“失败”。


















