manifest.json漏配permission字段会导致真机报fail no permission或控制台显示uni.api.esm.js:496,需在mp-weixin节点下补全scope.writeclipboard权限声明,desc不能为空且须为中文,改后须重新编译并真机测试。

微信小程序 manifest.json 漏配 permission 字段
真机报 fail no permission 或控制台显示 uni.api.esm.js:496,大概率是微信小程序没在 manifest.json 里声明剪贴板权限。自基础库 2.21.0 起,不配就直接拦截,连弹窗都不会出现。
必须在 manifest.json 的 mp-weixin 节点下补全:
{
"mp-weixin": {
"permission": {
"scope.writeClipboard": {
"desc": "用于复制内容"
}
}
}
}
注意:scope.writeClipboard 是微信官方要求的字段名,不是 scope.userclipboardwrite(那是旧版或其它平台写法);desc 值不能为空,且需为中文描述;改完必须重新编译并真机测试,开发者工具可能不校验该配置。
App 端未启用剪贴板模块
iOS 和 Android App 都会静默失败,但不会报错,只返回 success 回调不触发——这是最隐蔽的坑。
检查路径:manifest.json → 「App 模块配置」→ 找到对应平台:
- iOS:勾选「剪贴板」模块(位于「iOS 设置」页签)
- Android:在「模块权限配置」中启用
clipboard模块 - 鸿蒙:还需额外在
harmony-configs/entry/src/main/module.json5中声明ohos.permission.READ_PASTEBOARD
没勾选 = 调用无效,且无任何提示。尤其注意:App 打包后修改配置需重新生成安装包,热更新不生效。
H5 端直接调用 uni.setClipboardData 必然失败
uni.setClipboardData 在 H5 平台根本不存在,调用后既不报错也不执行,表现为“点了没反应”。这不是 bug,是平台限制。
必须降级使用原生 API,并满足两个硬性条件:
- 运行环境必须是 HTTPS 或
localhost(http://127.0.0.1 不行) - 必须由用户点击等手势直接触发,不能包裹在
setTimeout、Promise.then或onLoad里
正确写法示例:
async copyText(text) {
if (uni.getSystemInfoSync().platform === 'h5') {
try {
await navigator.clipboard.writeText(text);
} catch (err) {
console.error('H5 复制失败:', err);
// 可 fallback 到 document.execCommand(仅 IE/旧版 Safari)
}
} else {
await uni.setClipboardData({ data: text });
}
}
触发时机错在异步回调或生命周期里
哪怕配置全对,只要调用不在用户点击事件的第一层,微信和部分安卓 WebView 就判定为“非用户主动行为”,直接拒绝。
这些写法全部失效:
setTimeout(() => uni.setClipboardData(...), 0)this.$nextTick(() => uni.setClipboardData(...))onShow() { uni.setClipboardData(...) }Promise.then(() => uni.setClipboardData(...))
唯一安全的位置:绑定在按钮上的事件处理器函数体第一行,比如 @click="handleCopy" 中的 handleCopy 函数开头就调用 uni.setClipboardData。动态内容(如接口返回后再复制)也必须确保请求发起和复制调用都在同一点击上下文中,中间不能跨异步边界。
权限配置、平台降级、触发时机,三者缺一不可。最容易被忽略的是 H5 降级和 App 模块勾选——它们不报错,只沉默,排查时得靠排除法逐项验证。











