uni-app无跨平台重启api,需分平台实现:android可用plus.runtime.restart()热重启,ios需urlscheme唤起,h5和小程序仅能通过uni.relaunch+状态清理模拟。

uni-app 没有跨平台的“重启 App”原生 API,所谓“重启”必须按平台拆解实现:App 端可有限热重启或强制退出再拉起,小程序和 H5 只能模拟(页面栈重置 + 状态清理)。
Android 上用 plus.runtime.restart() 实现热重启
这是最接近“真正重启”的方式,会重新加载 JS 引擎和原生 Activity,但仅限 Android 且需确认运行环境支持。
- 调用前务必检查是否存在:
if (plus.runtime && plus.runtime.restart),否则直接报错 - 部分厂商 ROM 或低版本基座(如早期 3.1.x)可能未实现该方法,降级方案必须 fallback 到
plus.runtime.quit() - 不能在
onUnload或页面卸载中立即调用 —— 容易因生命周期冲突导致黑屏或无响应,建议加setTimeout(() => { plus.runtime.restart() }, 100) - 注意:
plus.runtime.restart()不会自动清空uni.setStorageSync数据,如需彻底重置,得手动加uni.clearStorageSync()
iOS 上无法真正重启,只能用 urlScheme + location.href 间接拉起
iOS 系统禁止 App 自行退出,plus.runtime.quit() 在 iOS 上静默失败;官方审核也不允许调用退出 API。唯一合规路径是“跳转 + 外部唤起”。
- 先在
manifest.json的app-plus → distribute → ios下配置urlScheme,例如"urlScheme": "myapp" - 调用时分两步:先
uni.reLaunch({url: '/pages/index/index'})清页面栈,再setTimeout(() => location.href = 'myapp://', 300) - 必须加延迟,否则
location.href在页面未完全卸载前触发,会被拦截或无效 - 用户首次使用需手动允许“打开此应用”,且后台被系统杀掉后,
urlScheme唤起可能失败 —— 这不是代码问题,是 iOS 机制限制
H5 和小程序端只能模拟重启:用 uni.reLaunch() + 手动清状态
这些平台没有进程概念,所谓“重启”本质是重置前端状态。漏掉任何一环都会让用户感觉“没重启成功”。
-
uni.reLaunch({url: '/pages/index/index'})是必须的,它清空整个页面栈 - 全局状态如 Vuex/Pinia 必须显式重置,比如
store.dispatch('reset')或store.$state = initialState -
uni.clearStorageSync()要放在reLaunch前,否则新页面加载时旧缓存仍存在 - H5 可额外用
location.reload(),但仅适用于单页模式且无路由守卫拦截的场景;若用了 Vue Router 的 history 模式,reload()可能导致 404
别忽略冷启动残留:WebView 缓存、原生模块状态、插件实例
即使页面栈和 JS 状态都清了,某些底层资源不会随 reLaunch 释放 —— 这是多数人踩坑最深的地方。
- 自定义原生插件(如蓝牙、定位)的监听器或连接对象,不会自动销毁,需在重启前主动
unregister或close() - Webview 内部缓存(比如加载过的大图、音视频)可能持续占用内存,
plus.webview.currentWebview().evalJS('location.reload()')对子 Webview 无效 - 如果用了
uni.createMapContext或uni.createCanvasContext,其上下文引用需手动置为null,否则 GC 不回收 - 条件编译要写全:
#ifdef APP-PLUS、#ifdef MP-WEIXIN、#ifdef H5,别漏掉MP-ALIPAY或MP-BAIDU等小平台











