App端复制超长文本闪退本质是原生层内存或字符处理溢出,因iOS/Android系统剪贴板对超长或非法Unicode字符串存在隐式限制,需前置截断、清理高危字符并校验权限与日志。
uni.setClipboardData 本身不校验内容长度,但 iOS 的 UIPasteboard 和 Android 的 ClipboardManager 对超长字符串(尤其含大量换行、空格、Unicode 符号)存在隐式限制。实测在部分低端安卓机或 iOS 15–16 系统上,超过 100KB 的纯文本可能触发系统剪贴板写入失败并导致 App 进程崩溃,且无 JS 层报错——这是最隐蔽的闪退来源。
关键不是“能不能复制”,而是“复制时是否触发了原生层异常”。不能只靠 try/catch 捕获 JS 错误,必须前置截断 + 清理。
text.substring(0, 80000)(80KB 是较安全阈值,iOS 更敏感,建议 50KB 起步测试)text.replace(/[u2028u2029u200BuFEFF]/g, '') 干掉零宽字符、段落分隔符等易引发原生解析异常的 Unicode%E4%BD%A0%E5%A5%BD),先 decodeURIComponent(text) 再处理H5 的 navigator.clipboard.writeText() 在浏览器内运行,受限于 JS 堆内存和浏览器策略,顶多报 NotAllowedError 或 Promise reject,不会杀进程;而 App 端调用的是系统级剪贴板服务,一旦传入非法序列(比如 UTF-16 surrogate pair 不完整、超长 Base64 数据),iOS/Android 原生框架可能直接 abort 进程。
所以同一段文本,在 H5 里能复制成功,在 App 里却闪退,不是代码问题,是平台能力边界不同。
text.replace(/[^x00-xFFu4e00-u9fa5sp{P}p{L}]/gu, '')(需支持 Unicode 属性转义,HBuilderX 4.20+ 可用)editor 组件取值),别直接用 innerHTML,优先走组件提供的 getText() 方法获取纯文本即使 manifest.json 里勾选了「剪贴板」模块,某些 HBuilderX 版本(特别是 4.18–4.22)打包时会漏掉 Android 的 android.permission.WRITE_CLIPBOARD 权限声明,导致系统拒绝写入并静默 crash。iOS 端则可能因未开启「UIPasteboard」 entitlement 而失败。
manifest.json → 「模块权限配置」→ 确认「剪贴板」已打钩,且生成的 AndroidManifest.xml 中包含 <uses-permission android:name="android.permission.WRITE_CLIPBOARD" />
manifest.json → 「App 设置」→ 「iOS 设置」→ 确认「剪贴板」已启用,并检查 Xcode 工程中 Signing & Capabilities 是否添加了 UIPasteboard entitlementuni.setClipboardData 会直接 crash,必须升级JS 层 try/catch 捕不到这种闪退,因为崩溃发生在 WebView 外的原生线程。不看原生日志,永远不知道是哪一行触发的。
adb logcat -s AndroidRuntime 过滤崩溃信息,重点找 FATAL EXCEPTION 和 java.lang.RuntimeException: Failed to write to clipboard
Device Logs,筛选关键词 pasteboard 或 UIPasteboard
clipboard 或 ohos.clipboard
真正卡点往往藏在日志最后一行——比如 String length exceeds maximum allowed size 或 Invalid UTF-16 sequence,这些才是决定截断策略的关键依据。