前言
自2018年我開源了XUpdate之后,至今已迭代了14個版本,月下載量達(dá)4k+,Github的star量也已經(jīng)有700+.
最近在研究Flutter,于是就隨手寫了一個Flutter小項目練練手,在寫的時候我就發(fā)現(xiàn),目前并沒有非常好用的版本更新Flutter插件,嘗試了使用Bugly的版本更新Flutter插件,但是效果非常不好.然后百度了一下,基本上都是如下方案:
- 1.使用
package_info
插件獲取當(dāng)前應(yīng)用的版本信息 - 2.使用
dio
插件進(jìn)行網(wǎng)絡(luò)請求獲取最新版本信息 - 3.使用
flutter_downloader
插件下載最新APP并安裝
我想了一下,這實在是太麻煩了,要知道我的XUpdate把這些都已經(jīng)做好了,只需要一行代碼就可以實現(xiàn)應(yīng)用內(nèi)的版本更新,不僅如此我們完全沒必要把這個幾乎通用的功能在自己的應(yīng)用內(nèi)再實現(xiàn)一遍.
為此我仔細(xì)研究了一下Flutter的插件開發(fā),用了不到1天的時間,就把XUpdate的絕大多數(shù)功能在Flutter插件上實現(xiàn)了,這下我就可以舒舒服服地使用一行代碼來實現(xiàn)版本更新了!
下面我給出flutter_xupdate
插件的地址:
https://pub.dev/packages/flutter_xupdate
演示
-
默認(rèn)版本更新
在這里插入圖片描述 -
支持后臺更新
在這里插入圖片描述 -
屏幕寬高比限制顯示更新
在這里插入圖片描述 -
強制更新
在這里插入圖片描述
快速集成指南
添加引用依賴
在你的flutter項目中的pubspec.yaml
文件中添加flutter_xupdate
依賴.
- 方法一: pub集成
dependencies:
flutter_xupdate: ^0.0.2
- 方法二: github集成
dependencies:
flutter_xupdate:
git:
url: git://github.com/xuexiangjys/flutter_xupdate.git
ref: master
Android設(shè)置
修改Android項目的主題為AppCompat
主題摘能,文件路徑: android/app/src/main/res/values/styles.xml
, 例如:
<resources>
<style name="LaunchTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
</resources>
初始化
- 調(diào)用
FlutterXUpdate.init
方法進(jìn)行初始化. - 調(diào)用
FlutterXUpdate.setErrorHandler
方法設(shè)置錯誤監(jiān)聽.
import 'package:flutter_xupdate/flutter_xupdate.dart';
///初始化
void initXUpdate() {
if (Platform.isAndroid) {
FlutterXUpdate.init(
///是否輸出日志
debug: true,
///是否使用post請求
isPost: false,
///post請求是否是上傳json
isPostJson: false,
///是否開啟自動模式
isWifiOnly: false,
///是否開啟自動模式
isAutoMode: false,
///需要設(shè)置的公共參數(shù)
supportSilentInstall: false,
///在下載過程中脏里,如果點擊了取消的話烈菌,是否彈出切換下載方式的重試提示彈窗
enableRetry: false
).then((value) {
updateMessage("初始化成功: $value");
}).catchError((error) {
print(error);
});
FlutterXUpdate.setErrorHandler(
onUpdateError: (Map<String, dynamic> message) async {
print(message);
setState(() {
_message = "$message";
});
});
} else {
updateMessage("ios暫不支持XUpdate更新");
}
}
使用說明
版本更新返回的Json格式
{
"Code": 0, //0代表請求成功,非0代表失敗
"Msg": "", //請求出錯的信息
"UpdateStatus": 1, //0代表不更新,1代表有版本更新,不需要強制升級抛腕,2代表有版本更新,需要強制升級
"VersionCode": 3, //編譯版本號(唯一)
"VersionName": "1.0.2", //版本名(用于展示)
"ModifyContent": "1媒殉、優(yōu)化api接口担敌。\r\n2、添加使用demo演示廷蓉。\r\n3全封、新增自定義更新服務(wù)API接口。\r\n4桃犬、優(yōu)化更新提示界面刹悴。", //更新內(nèi)容
"DownloadUrl": "https://raw.githubusercontent.com/xuexiangjys/XUpdate/master/apk/xupdate_demo_1.0.2.apk",// 文件下載地址
"ApkSize": 2048, //文件的大小(單位:kb)
"ApkMd5": "..." //md5值沒有的話,就無法保證apk是否完整攒暇,每次都會重新下載土匀。框架默認(rèn)使用的是md5加密形用。
}
版本更新
- 默認(rèn)更新
FlutterXUpdate.checkUpdate(url: _updateUrl);
- 默認(rèn)App更新 + 支持后臺更新
FlutterXUpdate.checkUpdate(url: _updateUrl, supportBackgroundUpdate: true);
- 調(diào)整寬高比顯示的版本更新
FlutterXUpdate.checkUpdate(url: _updateUrl, widthRatio: 0.6);
- 自動模式下版本更新, 如果需要完全無人干預(yù)就轧,自動更新证杭,需要root權(quán)限【靜默安裝需要】
FlutterXUpdate.checkUpdate(url: _updateUrl, isAutoMode: true);
- 下載時點擊取消允許切換下載方式
FlutterXUpdate.checkUpdate(
url: _updateUrl,
overrideGlobalRetryStrategy: true,
enableRetry: true,
retryContent: "Github下載速度太慢了,是否考慮切換蒲公英下載妒御?",
retryUrl: "https://www.pgyer.com/flutter_learn");
自定義Json解析
1.定義一個自定義的版本更新解析器
FlutterXUpdate.setCustomParseHandler(onUpdateParse: (String json) async {
//這里是自定義json解析
return customParseJson(json);
});
///將自定義的json內(nèi)容解析為UpdateEntity實體類
UpdateEntity customParseJson(String json) {
AppInfo appInfo = AppInfo.fromJson(json);
return UpdateEntity(
hasUpdate: appInfo.hasUpdate,
isIgnorable: appInfo.isIgnorable,
versionCode: appInfo.versionCode,
versionName: appInfo.versionName,
updateContent: appInfo.updateLog,
downloadUrl: appInfo.apkUrl,
apkSize: appInfo.apkSize);
}
2.調(diào)用checkUpdate
方法,并設(shè)置isCustomParse
參數(shù)為true.
FlutterXUpdate.checkUpdate(url: _updateUrl3, isCustomParse: true);
直接傳入UpdateEntity進(jìn)行更新
///直接傳入UpdateEntity進(jìn)行更新提示
void checkUpdate8() {
FlutterXUpdate.updateByInfo(updateEntity: customParseJson(_customJson));
}