android需用plus.navigator.hidesplashscreen()配合uts设置flag_secure,鸿蒙须在onshow时调用uts setwindowprivacy(true),ios仅能替换缩略图;所有平台均须页面级配对开启/关闭,且不适用于小程序和h5。

App端多任务窗口隐藏(Android)必须用 plus.navigator.hideSplashscreen + plus.webview.getLaunchWebview()
uni-app 的“多任务窗口”在 Android 上实际指系统最近任务列表里显示的缩略图,不是网页弹窗或子窗口。这个缩略图默认会截取当前页面快照,存在隐私泄露风险——比如支付页、身份证上传页被截图后出现在多任务界面。
真正起作用的是原生层的 FLAG_SECURE 标志,但 uni-app 没有直接暴露该 API。必须通过原生插件或 uts 调用,或者退而求其次:在关键页面加载完成后,主动隐藏启动页并确保主 webview 不被截屏。
-
plus.navigator.hideSplashscreen()要在onReady或mounted后立即调用,否则 splash 仍可能被截屏 - 获取主窗口后设置
setSecure(true)需要 uts 插件,纯 JS 无法实现;仅靠hideSplashscreen不够,必须配合窗口隐私模式 - 如果使用自定义 splash(如 nvue),需确保其
style中未启用transparentTitle或透明背景,否则仍可能透出内容
鸿蒙平台必须用 UTS 设置窗口隐私模式
鸿蒙审核明确要求支付等敏感场景禁用截屏/录屏,仅靠前端逻辑无效。必须通过 UTS 调用 AbilityStage 或 Window 原生 API 设置 setWindowPrivacy(true)。
关键点不在“怎么写”,而在“什么时候调用”:必须在页面 onShow 时生效,onHide 时还原,否则会影响其他页面的正常截屏需求(如分享截图)。
- UTS 接口定义中
isWindowPrivacy必须为boolean类型,传true才生效,1或字符串"true"会被忽略 - 鸿蒙 4.0+ 要求调用前检查
abilityContext是否可用,否则抛undefined is not an object错误 - 不能在 App.vue 的
onLaunch全局设置,否则整个 App 都无法截屏,违反鸿蒙 UX 规范
iOS 端没有真正的“多任务窗口隐藏”,但可规避缩略图泄露
iOS 不允许 App 主动禁用多任务缩略图,但可通过 UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: false) 替换缩略图为纯色视图。uni-app 层面唯一可控手段是:在敏感页面激活时,用原生插件覆盖系统缩略图。
更现实的做法是避免触发缩略图生成时机:
- 不使用
plus.webview.create创建额外 webview,每个页面只保留一个主窗口,减少缩略图源数量 - 敏感页禁用
pullToRefresh和bounce,防止用户下拉触发系统级快照捕获 - 不要在
onLoad阶段就调用plus.runtime.openURL("app-settings:"),这会提前激活后台进程,增加缩略图生成概率
隐私模式 ≠ 全屏模式,别混淆两者的生命周期
很多人把 "navigationStyle": "custom" 或 hideTabBar 当成隐私保护,这是典型误解。这些只是 UI 隐藏,对系统截屏、录屏、多任务缩略图完全无效。
真正起效的隐私控制,必须发生在原生窗口创建之后、内容渲染完成之前。这意味着:
-
plus.webview.getWebviewById('__uniapp_view_splash')在某些低端安卓机型上返回 null,需加空值判断再调用setSecure - UTS 插件在鸿蒙真机调试时,若未在
module.json正确声明abi和target,会静默失败,无任何错误提示 - 所有隐私模式设置都应在页面级而非全局做,且必须配对:进入时开启,离开时关闭,否则下次进入可能失效
最易被忽略的一点:微信小程序和 H5 完全不支持上述任一机制,所谓“多端统一隐私方案”根本不存在。App 端的隐私控制必须单独实现、单独测试、单独上线验证。











