原生插件中调用剪贴板必须直接使用平台原生api:ios用uipasteboard.standard,android用clipboardmanager,uni-app的js api不可用;需手势触发、权限适配、异常捕获及降级处理。

原生插件里调用剪贴板必须自己写平台代码,uni-app API 不可用
在 uni-app 原生插件(如 iOS 的 UniModule、Android 的 UniPlugin)中,uni.setClipboardData 和 uni.getClipboardData 这类 JS 层 API 完全不可用——它们只运行在 WebView JS 上下文,而原生插件运行在独立的 Native 线程里。你得直接调用对应平台的原生剪贴板接口。
iOS 原生插件中写入剪贴板:用 UIPasteboard.standard
在 Objective-C 或 Swift 编写的 iOS 插件中,不能依赖任何 uni-app 封装,必须手动操作系统剪贴板:
- Objective-C 示例:
[UIPasteboard generalPasteboard].string = @"复制的内容";
- Swift 示例:
UIPasteboard.general.string = "复制的内容"
- 需确保插件方法被 JS 主动触发(如通过
uni.requireNativePlugin调用),否则 iOS 14+ 会静默拒绝或弹权限提示 - 若要支持富文本或图片,得用
setValue:forType:或setData:forType:,但普通文本用string属性最稳
Android 原生插件中读写剪贴板:用 ClipboardManager
Android 插件(Java/Kotlin)必须使用系统 ClipboardManager,且注意 targetSdkVersion 影响:
- Java 示例(API 27+ 推荐):
ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);<br>ClipData clip = ClipData.newPlainText("label", "复制的内容");<br>cm.setPrimaryClip(clip); - Kotlin 示例:
val cm = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager<br>cm.setPrimaryClip(ClipData.newPlainText("label", "复制的内容")) - Android 12+(targetSdk >= 31)要求声明
android.permission.READ_CLIPBOARD才能读取,但写入仍无需权限 - 读取时务必加 try-catch,部分厂商 ROM(如 MIUI)可能抛
SecurityException或返回空
JS 层如何安全调用原生插件实现剪贴板
不能直接 requireNativePlugin 后裸调,必须做三层兜底:
- 先判断当前平台:
uni.getSystemInfoSync().platform是"ios"还是"android",H5 端绝对不能进原生分支 - 插件调用必须由用户手势触发(
@click第一层),否则 iOS 会拦截、Android 可能无响应 - 原生插件返回结果要用 Promise 包裹,失败时 fallback 到 JS 方案(如 H5 用
navigator.clipboard.writeText) - 插件内部不要做耗时操作(如网络请求、正则匹配),剪贴板本身是瞬时操作;复杂清洗逻辑留在 JS 层做
ClipboardManager 的拦截策略,连 setPrimaryClip 都可能静默失败,必须加日志和降级路径。











