介紹
在移動(dòng)開(kāi)發(fā)過(guò)程中,應(yīng)用升級(jí)是必不可少的一個(gè)環(huán)節(jié),所以,r_upgrade應(yīng)用升級(jí)插件就出現(xiàn)了,這里先鼓掌歡迎????,下面是使用介紹
r_upgrade
Android和IOS的升級(jí)應(yīng)用插件==Flutter應(yīng)用升級(jí)插件
- 網(wǎng)頁(yè)鏈接形式升級(jí)
- apk下載形式升級(jí)
使用Service或者DownloadManager
- 跳轉(zhuǎn)到應(yīng)用商店升級(jí)
-
Android
熱更新 -
Android
增量升級(jí)
開(kāi)始吧
1.使用插件:
在pubspec.yaml
文件添加下面代碼
dependencies:
r_upgrade: last version
2.使用打開(kāi)鏈接的方式進(jìn)行更新(Android
和IOS
通用)
void upgradeFromUrl()async{
bool isSuccess =await RUpgrade.upgradeFromUrl(
'https://www.baidu.com',
);
print(isSuccess);
}
Android平臺(tái)
1.跳轉(zhuǎn)到應(yīng)用商店升級(jí)
void upgradeFromAndroidStore(){
bool isSuccess = await RUpgrade.upgradeFromAndroidStore(AndroidStore.BAIDU);
print('${isSuccess?'跳轉(zhuǎn)成功':'跳轉(zhuǎn)失敗'}');
}
2.通過(guò)下載鏈接進(jìn)行apk下載
注意,在Android應(yīng)用中,請(qǐng)確保
AndroidManifest.xml
中聲明以下權(quán)限,并在6.0系統(tǒng)上進(jìn)行動(dòng)態(tài)授權(quán),不然會(huì)調(diào)用升級(jí)方法將拋出權(quán)限異常
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1.添加升級(jí)下載進(jìn)度監(jiān)聽(tīng)
RUpgrade.stream.listen((DownloadInfo info){
///...
});
info 里包含的信息如下:
字段 | 含義 |
---|---|
(int) id | 當(dāng)前下載任務(wù)的id |
(int) max_length | 所需下載的總大小 (bytes) |
(int) current_length | 當(dāng)前已下載的大小 (bytes) |
(double) percent | 當(dāng)前下載進(jìn)度(0-100) |
(double) planTime | 計(jì)劃下載完成所需時(shí)間/秒 (需要.toStringAsFixed(0)) |
(String) path | 當(dāng)前下載的文件路徑 |
(double) speed | 當(dāng)前下載的速度kb/s |
(DownloadStatus) status | 當(dāng)前下載狀態(tài) STATUS_PAUSED 下載已暫停 STATUS_PENDING 等待下載 STATUS_RUNNING 下載中 STATUS_SUCCESSFUL 下載成功 STATUS_FAILED 下載失敗 STATUS_CANCEL 下載取消 |
注意: 部分http下載鏈接可能返回 max_length = -1
,請(qǐng)自行判斷
2.立即升級(jí)你的應(yīng)用
目前分為兩部分
useDownloadManager
:
-
true
: 調(diào)用系統(tǒng)的DownloadManager
進(jìn)行下載- 優(yōu)勢(shì):接入簡(jiǎn)單,無(wú)需擔(dān)心操作,下載全由系統(tǒng)管理
- 劣勢(shì):無(wú)法使用http方式進(jìn)行下載,無(wú)法在下載過(guò)程中點(diǎn)擊通知欄進(jìn)行暫停,無(wú)法根據(jù)有無(wú)網(wǎng)絡(luò)進(jìn)行暫停和繼續(xù)下載,適配機(jī)型問(wèn)題等
- 支持的方法:
RUpgrade.stream
、install
、cancel
-
false
: 調(diào)用Service
進(jìn)行下載(默認(rèn)使用)- 優(yōu)勢(shì):功能較全,支持http/https下載,支持網(wǎng)絡(luò)斷開(kāi)后自動(dòng)暫停下載,連接上后繼續(xù)下載,支持?jǐn)帱c(diǎn)續(xù)傳,支持查詢(xún)最后一次下載等
- 劣勢(shì):暫無(wú)發(fā)現(xiàn),如果發(fā)現(xiàn)bug歡迎提issue.
- 支持的方法:默認(rèn)全部
// [isAutoRequestInstall] 下載完成后自動(dòng)彈出安裝
// [apkName] 安裝包的名字(需要包含.apk)
// [notificationVisibility] 通知欄顯示方式
// [useDownloadManager] 是否使用DownloadManager,默認(rèn)不使用(DownloadManager不支持http下載,下載手動(dòng)暫停,斷點(diǎn)續(xù)傳等,不建議使用)
// [upgradeFlavor] 升級(jí)的口味,默認(rèn)全量升級(jí)(默認(rèn))
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);
}
新增升級(jí)的口味:(不支持使用DownloadManager下載)
enum RUpgradeFlavor {
normal, // 全量升級(jí)
hotUpgrade, // 熱更新
incrementUpgrade, // 增量升級(jí)
}
3. 取消下載
void cancel() async {
bool isSuccess=await RUpgrade.cancel(id);
}
4. 安裝應(yīng)用
void install() async {
bool isSuccess=await RUpgrade.install(id);
}
5. 暫停下載
void pause() async {
bool isSuccess=await RUpgrade.pause(id);
}
6. 繼續(xù)下載
void pause() async {
bool isSuccess=await RUpgrade.upgradeWithId(id);
// 返回 false 即表示從來(lái)不存在此ID
// 返回 true
// 調(diào)用此方法前狀態(tài)為 [STATUS_PAUSED]、[STATUS_FAILED]、[STATUS_CANCEL],將繼續(xù)下載
// 調(diào)用此方法前狀態(tài)為 [STATUS_RUNNING]、[STATUS_PENDING],不會(huì)發(fā)生任何變化
// 調(diào)用此方法前狀態(tài)為 [STATUS_SUCCESSFUL],將會(huì)安裝應(yīng)用
// 當(dāng)文件被刪除時(shí),重新下載
}
7. 獲取最后一次下載的ID
該方法只會(huì)尋找當(dāng)前應(yīng)用版本名和版本號(hào)下下載過(guò)的ID
void getLastUpgradeId() async {
int id = await RUpgrade.getLastUpgradedId();
}
8. 獲取ID對(duì)應(yīng)的下載狀態(tài)
void getDownloadStatus()async{
DownloadStatus status = await RUpgrade.getDownloadStatus(id);
}
9. 增量升級(jí)
- 1.下載bsdiff工具到本地
- 2.準(zhǔn)備兩個(gè)安裝包,一個(gè)是即將需要升級(jí)的安裝包(old.apk)、一個(gè)是你需要更新的安裝包(new.apk)
- 3.在命令行切換到上面下載的
bsdiff
目錄下,運(yùn)行命令./bsdiff old.apk new.apk increment.patch
- 4.將上面生成的
increment.patch
上傳到服務(wù)器 - 5.調(diào)用
RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.incrementUpgrade)
方法進(jìn)行下載,即可 - 6.調(diào)用
RUpgrade.install(id)
進(jìn)行安裝
代碼如下:
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. 熱更新
- 你可以使用升級(jí)返回的
id
進(jìn)行熱更新,下載的文件需要將新版本生成的isolate_snapshot_data
、kernel_blob.bin
、vm_snapshot_data
打進(jìn)zip文件中下載
步驟:- 運(yùn)行
flutter clean
清理build文件 - 運(yùn)行
flutter build bundle
生成需要的產(chǎn)物,下面標(biāo)記星號(hào)為必須文件
- 運(yùn)行
|- AssetManifest.json
|- FontManifest.json
|- fonts
|- ...
|- isolate_snapshot_data *
|- kernel-blob.bin *
|- LICENSE
|- packages
|- ...
|- vm_snapshot_data *
- 將標(biāo)記星號(hào)的文件打包成zip文件,上傳到服務(wù)器
- 調(diào)用`RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.hotUpgrade)`方法進(jìn)行下載
- 下載完成后,將上面獲取到的id進(jìn)行熱更新,調(diào)用如下代碼
bool isSuccess = await RUpgrade.install(id);
if (isSuccess) {
_state.currentState
.showSnackBar(SnackBar(content: Text('熱更新成功,3s后退出應(yīng)用,請(qǐng)重新進(jìn)入')));
Future.delayed(Duration(seconds: 3)).then((_){
SystemNavigator.pop(animated: true);
});
}else{
_state.currentState
.showSnackBar(SnackBar(content: Text('熱更新失敗,請(qǐng)等待更新包下載完成')));
}
- 重啟應(yīng)用即可
注意:目前熱更新尚處于測(cè)試階段,只支持Flutter代碼的變更,不支持資源文件等,熱更新造成的一切的后果插件的作者概不負(fù)責(zé),由使用者承擔(dān)。
安卓平臺(tái)通知欄
如果你想自定義通知欄顯示的內(nèi)容, 可以這樣做, 修改或添加文件路徑為project/android/app/main/res/r_upgrade_value.xml
,添加下面代碼
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="r_upgrade_download_speech">%.2fkb/s</string>
<string name="r_upgrade_download_planTime">預(yù)計(jì)%.0f秒后完成</string>
<string name="r_upgrade_download_finish">下載完成</string>
<string name="r_upgrade_download_paused">下載被暫停</string>
<string name="r_upgrade_download_failed">下載失敗</string>
</resources>
然后.當(dāng)你使用upgrade
方法時(shí),你應(yīng)該設(shè)置參數(shù)notificationStyle
,默認(rèn)為顯示預(yù)計(jì)完成時(shí)間.
/// Notification show style about content text
enum NotificationStyle {
speechAndPlanTime, // 100kb/s 預(yù)計(jì)1秒后完成
planTimeAndSpeech, // 預(yù)計(jì)1秒后完成 100kb/s
speech,// 100kb/s
planTime, // 預(yù)計(jì)1秒后完成
none, //
}
IOS平臺(tái)
1.跳轉(zhuǎn)到AppStore進(jìn)行更新
void upgradeFromAppStore() async {
bool isSuccess =await RUpgrade.upgradeFromAppStore(
'您的AppId',//例如:微信的AppId:414478124
);
print(isSuccess);
}
2.獲取AppStore中你的應(yīng)用最后的版本名
void getVersionFromAppStore() async {
String versionName = await RUpgrade.getVersionFromAppStore(
'您的AppId',//例如:微信的AppId:414478124
);
print(versionName);
}
結(jié)尾:Dart客棧已經(jīng)推出
Aqueduct框架系列教程
專(zhuān)輯,歡迎喜歡學(xué)習(xí)Dart語(yǔ)言開(kāi)發(fā)的小伙伴關(guān)注????