React Native应用内如何实现点击modal选项卸载当前apk?
安卓强制更新自动卸载旧版本实现方案
1. 前置权限配置
首先在AndroidManifest.xml中添加卸载所需权限:
<!-- 安卓6.0及以上申请卸载应用权限 --> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <!-- 如果后续需要跳转安装新版本,还需要添加安装权限 --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
2. 版本校验逻辑
- 先获取本地应用的版本号,示例代码:
val localVersionCode = try { val packageInfo = packageManager.getPackageInfo(packageName, 0) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { packageInfo.longVersionCode } else { packageInfo.versionCode.toLong() } } catch (e: PackageManager.NameNotFoundException) { 0L }
- 和服务端返回的最新版本
latestVersionCode对比,如果localVersionCode < latestVersionCode且是强制更新类型,弹出升级提示弹窗。
3. 弹窗确认后触发卸载逻辑
用户点击弹窗的确认按钮后,调用系统卸载能力执行旧版卸载:
// 先跳转应用商店对应应用详情页,避免卸载后无法执行跳转逻辑 val storeIntent = Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName")) storeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(storeIntent) // 触发卸载当前应用 val uninstallUri = Uri.fromParts("package", packageName, null) val uninstallIntent = Intent(Intent.ACTION_DELETE, uninstallUri) // 若需要监听卸载结果可添加以下配置,回调在onActivityResult中接收 uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true) startActivityForResult(uninstallIntent, 1001)
注意:应用被卸载后所有运行逻辑都会终止,所以必须先跳转应用商店,再触发卸载操作,否则用户卸载后无法自动进入应用商店下载页。
4. 常见问题优化
你提到的「残留旧版本直接安装新版本异常」,90%以上的场景是配置问题导致,优先排查以下项,无需强制卸载也能解决:
- 新旧版本的签名文件不一致,包括debug/release签名混用、中途更换签名证书
- 新版本的versionCode没有大于旧版本
- 应用配置的
android:sharedUserId在新旧版本中不一致 - 安卓12及以上版本未给四大组件明确配置
android:exported属性导致安装失败
5. 兼容注意事项
- 普通三方应用无法实现静默卸载,调用卸载能力后一定会弹出系统级卸载确认弹窗,需要用户手动确认才能完成卸载。只有系统签名应用、root设备的应用才能绕过用户确认实现静默卸载。
- 部分定制ROM会限制应用的卸载请求权限,需要提前判断是否持有
REQUEST_DELETE_PACKAGES权限,无权限时先引导用户开启对应权限。 - 如果你的应用是设备管理员应用,需要先请求解除设备管理员权限,才能正常卸载。
内容的提问来源于stack exchange,提问作者FilipiDev
相关产品推荐
相关产品推荐

