# r_upgrade
**Repository Path**: bujuetech/r_upgrade
## Basic Information
- **Project Name**: r_upgrade
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-06-18
- **Last Updated**: 2026-01-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# r_upgrade
[](https://pub.dartlang.org/packages/r_upgrade)

Android和IOS的升级应用插件==Flutter应用升级插件
- [✔] 跳转链接方式升级
- [✔] 跳转到应用商店升级
- [✔] `Android`使用下载链接下载APK
- [✔] 监听下载信息
- [✔] 取消/暂停/继续下载
- [✔] 根据ID安装应用
- [✔] 根据ID获取下载状态
- [✔] 获取最后一次下载ID(根据版本名和版本号)
- [✔] 修改通知栏显示的信息
- [✔] `Android`热更新
- [✔] `Android`增量升级
- [✔] `IOS`根据APPID跳转AppStore升级
- [✔] `IOS`根据APPID获取AppStore当前上架版本
# 外卖红包🧧
微信扫一扫下方的二维码关注公众号,领取外卖红包,点外卖最高可免单!(希望点外卖的时候都能领取一下,我会得到几毛钱的收益,也是对这个插件的支持,非常感谢!)

## 开始吧
### 1.使用插件:
在`pubspec.yaml`文件添加下面代码
```yaml
dependencies:
r_upgrade: last version
```
### 2.使用打开链接的方式进行更新(`Android`和`IOS`通用)
```dart
void upgradeFromUrl()async{
bool isSuccess =await RUpgrade.upgradeFromUrl(
'https://www.baidu.com',
);
print(isSuccess);
}
```
## Android平台
### 1.跳转到应用商店升级
```dart
void upgradeFromAndroidStore(){
bool isSuccess = await RUpgrade.upgradeFromAndroidStore(AndroidStore.BAIDU);
print('${isSuccess?'跳转成功':'跳转失败'}');
}
```
### 2.通过下载链接进行apk下载
> 注意,在Android应用中,请确保`AndroidManifest.xml`中声明以下权限,并在6.0系统上进行动态授权,不然会调用升级方法将抛出权限异常
```xml
```
#### 1.添加升级下载进度监听
```dart
RUpgrade.stream.listen((DownloadInfo info){
///...
});
```
info 里包含的信息如下:
| 字段 | 含义 |
| - | - |
| (int) id | 当前下载任务的id |
| (int) max_length | 所需下载的总大小 (bytes) |
| (int) current_length | 当前已下载的大小 (bytes) |
| (double) percent | 当前下载进度(0-100) |
| (double) planTime | 计划下载完成所需时间/秒 (需要.toStringAsFixed(0)) |
| (String) path | 当前下载的文件路径 |
| (double) speed | 当前下载的速度kb/s |
| (DownloadStatus) status | 当前下载状态
`STATUS_PAUSED` 下载已暂停
`STATUS_PENDING`等待下载
`STATUS_RUNNING`下载中
`STATUS_SUCCESSFUL`下载成功
`STATUS_FAILED`下载失败
`STATUS_CANCEL`下载取消|
注意: 部分http下载链接可能返回 `max_length = -1`,请自行判断
#### 2.立即升级你的应用
目前分为两部分
`useDownloadManager`:
- `true`: 调用系统的`DownloadManager`进行下载
- 优势:接入简单,无需担心操作,下载全由系统管理
- 劣势:无法使用http方式进行下载,无法在下载过程中点击通知栏进行暂停,无法根据有无网络进行暂停和继续下载,适配机型问题等
- 支持的方法:`RUpgrade.stream`、`install`、`cancel`
- `false`: 调用`Service`进行下载(默认使用)
- 优势:功能较全,支持http/https下载,支持网络断开后自动暂停下载,连接上后继续下载,支持断点续传,支持查询最后一次下载等
- 劣势:暂无发现,如果发现bug欢迎提issue.
- 支持的方法:默认全部
```dart
// [isAutoRequestInstall] 下载完成后自动弹出安装
// [apkName] 安装包的名字(需要包含.apk)
// [notificationVisibility] 通知栏显示方式
// [useDownloadManager] 是否使用DownloadManager,默认不使用(DownloadManager不支持http下载,下载手动暂停,断点续传等,不建议使用)
// [upgradeFlavor] 升级的口味,默认全量升级(默认)
void upgrade() async {
int id = await RUpgrade.upgrade(
'https://raw.githubusercontent.com/rhymelph/r_upgrade/master/apk/app-release.apk',
apkName: 'app-release.apk',isAutoRequestInstall: true);
}
```
新增升级的口味:(不支持使用DownloadManager下载)
```dart
enum RUpgradeFlavor {
normal, // 全量升级
hotUpgrade, // 热更新
incrementUpgrade, // 增量升级
}
```
#### 3. 取消下载
```dart
void cancel() async {
bool isSuccess=await RUpgrade.cancel(id);
}
```
#### 4. 安装应用
```dart
void install() async {
bool isSuccess=await RUpgrade.install(id);
}
```
#### 5. 暂停下载
```dart
void pause() async {
bool isSuccess=await RUpgrade.pause(id);
}
```
#### 6. 继续下载
```dart
void pause() async {
bool isSuccess=await RUpgrade.upgradeWithId(id);
// 返回 false 即表示从来不存在此ID
// 返回 true
// 调用此方法前状态为 [STATUS_PAUSED]、[STATUS_FAILED]、[STATUS_CANCEL],将继续下载
// 调用此方法前状态为 [STATUS_RUNNING]、[STATUS_PENDING],不会发生任何变化
// 调用此方法前状态为 [STATUS_SUCCESSFUL],将会安装应用
// 当文件被删除时,重新下载
}
```
#### 7. 获取最后一次下载的ID
该方法只会寻找当前应用版本名和版本号下下载过的ID
```dart
void getLastUpgradeId() async {
int id = await RUpgrade.getLastUpgradedId();
}
```
#### 8. 获取ID对应的下载状态
```dart
void getDownloadStatus()async{
DownloadStatus status = await RUpgrade.getDownloadStatus(id);
}
```
#### 9. 增量升级
- 1.下载[bsdiff](https://github.com/rhymelph/r_upgrade/releases/download/v0.3.0/bsdiff)工具到本地
- 2.准备两个安装包,一个是即将需要升级的安装包(old.apk)、一个是你需要更新的安装包(new.apk)
- 3.在命令行切换到上面下载的`bsdiff`目录下,运行命令`./bsdiff old.apk new.apk increment.patch`
- 4.将上面生成的`increment.patch`上传到服务器
- 5.调用`RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.incrementUpgrade)`方法进行下载,即可
- 6.调用`RUpgrade.install(id)`进行安装
代码如下:
```dart
int id;
void incrementUpgrade(){
id = await RUpgrade.upgrade(
'https://mydata-1252536312.cos.ap-guangzhou.myqcloud.com/r_upgrade.patch',
fileName: 'r_upgrade.patch',
useDownloadManager: false,
isAutoRequestInstall: false,
upgradeFlavor: RUpgradeFlavor.incrementUpgrade,
);
}
void install(){
try {
await RUpgrade.install(id);
} catch (e) {
_state.currentState
.showSnackBar(SnackBar(content: Text('增量更新失败!')));
}
}
```
#### 10. 热更新
- 你可以使用升级返回的`id`进行热更新,下载的文件需要将新版本生成的`isolate_snapshot_data`、`kernel_blob.bin`、`vm_snapshot_data`打进zip文件中下载
步骤:
- 运行 `flutter clean` 清理build文件
- 运行 `flutter build bundle` 生成需要的产物,下面标记星号为必须文件
```
|- AssetManifest.json
|- FontManifest.json
|- fonts
|- ...
|- isolate_snapshot_data *
|- kernel-blob.bin *
|- LICENSE
|- packages
|- ...
|- vm_snapshot_data *
```
- 将标记星号的文件打包成zip文件,上传到服务器
- 调用`RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.hotUpgrade)`方法进行下载
- 下载完成后,将上面获取到的id进行热更新,调用如下代码
```dart
bool isSuccess = await RUpgrade.install(id);
if (isSuccess) {
_state.currentState
.showSnackBar(SnackBar(content: Text('热更新成功,3s后退出应用,请重新进入')));
Future.delayed(Duration(seconds: 3)).then((_){
SystemNavigator.pop(animated: true);
});
}else{
_state.currentState
.showSnackBar(SnackBar(content: Text('热更新失败,请等待更新包下载完成')));
}
```
- 重启应用即可
> 注意:目前热更新尚处于测试阶段,只支持Flutter代码的变更,不支持资源文件等,热更新造成的一切的后果插件的作者概不负责,由使用者承担。
## 安卓平台通知栏
如果你想自定义通知栏显示的内容, 可以这样做, 修改或添加文件路径为`project/android/app/main/res/values/r_upgrade_value.xml`,添加下面代码
```xml
%.2fkb/s
预计%.0f秒后完成
下载完成
下载被暂停
下载失败
```
然后.当你使用`upgrade`方法时,你应该设置参数`notificationStyle`,默认为显示预计完成时间.
```dart
/// Notification show style about content text
enum NotificationStyle {
speechAndPlanTime, // 100kb/s 预计1秒后完成
planTimeAndSpeech, // 预计1秒后完成 100kb/s
speech,// 100kb/s
planTime, // 预计1秒后完成
none, //
}
```
## IOS平台
### 1.跳转到AppStore进行更新
```dart
void upgradeFromAppStore() async {
bool isSuccess =await RUpgrade.upgradeFromAppStore(
'您的AppId',//例如:微信的AppId:414478124
);
print(isSuccess);
}
```
### 2.获取AppStore中你的应用最后的版本名
```dart
void getVersionFromAppStore() async {
String versionName = await RUpgrade.getVersionFromAppStore(
'您的AppId',//例如:微信的AppId:414478124
);
print(versionName);
}
```