一来屠、前言
我們平時開發(fā)原生應(yīng)用時有新版本發(fā)布都會有版本升級提示,然后引導(dǎo)客戶去下載更新版本,iOS一般的做法是跳轉(zhuǎn)到AppStore更新,Android的處理辦法要么是商店更新,要么是應(yīng)用內(nèi)直接下載安裝更新旁仿,因?yàn)榈谝淮斡肍lutter開發(fā)應(yīng)用,所以碰到了這個更新的問題孽糖,網(wǎng)上也沒有找到寫的特別詳細(xì)簡潔的處理辦法枯冈,最后經(jīng)過一番努力做好了版本升級,感覺做的還可以办悟,所以這里做次記錄尘奏,希望能幫到有需要的人。
本文iOS是跳轉(zhuǎn)到AppStore更新病蛉,Android是應(yīng)用內(nèi)下載炫加,下載完畢后跳轉(zhuǎn)安裝
二、效果圖
三铺然、升級邏輯
-
請求版本升級接口
接口返回數(shù)據(jù)應(yīng)該有下面這些俗孝,在拿到接口數(shù)據(jù)的版本號后和本地版本號對比,如果接口版本號大于本地版本號則提示升級
1-版本號
// 或者將本地版本號傳給后臺魄健,后臺進(jìn)行對比返回是否升級
version_code: 1.0.0,
2-下載地址
ios_download_url: itms-apps://itunes.apple.com/cn/app/id1480944644?mt=8,
android_download_url: http://xxx.com/xxx-release.apk,
3-升級文案
content: 1.性能優(yōu)化 2.問題修復(fù),
四赋铝、具體升級方案
1、 使用到的三方庫
- PackageInfo:獲取版本號
- ota_update:支持Android應(yīng)用內(nèi)下載沽瘦,實(shí)現(xiàn)應(yīng)用內(nèi)更新功能
- url_launcher:網(wǎng)頁打開工具革骨,適用于iOS版本更新,可以打開應(yīng)用地址析恋,跳轉(zhuǎn)AppStore更新
2良哲、主要代碼
import 'package:flutter/material.dart';
import 'package:package_info/package_info.dart';
import 'dart:io';
import 'package:url_launcher/url_launcher.dart';
import 'package:ota_update/ota_update.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String vInfo = '';
String progress = '';
@override
void initState() {
super.initState();
_initData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('版本升級'),
),
body: Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FlatButton(
color: Colors.black38,
onPressed: _updateVersion,
child: Text('版本升級')
),
Container(
child: Text('$vInfo'),
),
Container(
child: Text('$progress'),
),
],
),
),
);
}
void _initData() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String version = packageInfo.version;
setState(() {
vInfo = Platform.isIOS ? 'iOS_$version' : 'android_$version';
});
}
void _updateVersion() async{
if (Platform.isIOS){
String url = 'itms-apps://itunes.apple.com/cn/app/id414478124?mt=8'; // 這是微信的地址,到時候換成自己的應(yīng)用的地址
if (await canLaunch(url)){
await launch(url);
}else {
throw 'Could not launch $url';
}
}else if (Platform.isAndroid){
String url = 'http://3g.163.com/links/4636'; // 網(wǎng)易新聞下載地址助隧,地址可能失效筑凫,在測試時候可以先確認(rèn)下下載地址是否是有效的
try {
// destinationFilename 是對下載的apk進(jìn)行重命名
OtaUpdate().execute(url, destinationFilename: 'news.apk').listen(
(OtaEvent event) {
print('status:${event.status},value:${event.value}');
switch(event.status){
case OtaStatus.DOWNLOADING: // 下載中
setState(() {
progress = '下載進(jìn)度:${event.value}%';
});
break;
case OtaStatus.INSTALLING: //安裝中
break;
case OtaStatus.PERMISSION_NOT_GRANTED_ERROR: // 權(quán)限錯誤
print('更新失敗,請稍后再試');
break;
default: // 其他問題
break;
}
},
);
} catch (e) {
print('更新失敗,請稍后再試');
}
}
}
}
五巍实、注意事項
- 1滓技、 ota_update 這個插件需要在AndroidManifest.xml中增加以下引用,具體的可以參考這個插件用法蔫浆,但是 資源 xml/filepaths 這個文件插件中是不存在的,所以需要我們自己創(chuàng)建姐叁,具體創(chuàng)建步驟如下
上圖為文件路徑瓦盛,創(chuàng)建一個xml文件夾,然后創(chuàng)建一個filepaths.xml文件外潜,文件內(nèi)容為
<paths>
<external-path
name="external-path"
path="."/>
<external-cache-path
name="external-cache-path"
path="."/>
<external-files-path
name="external-files-path"
path="."/>
<files-path
name="files_path"
path="."/>
<cache-path
name="cache-path"
path="."/>
<root-path
name="name"
path="."/>
</paths>
2020.7.8更新
ota_upage 插件已經(jīng)更新原环,現(xiàn)在要傳destinationFilename: 'news.apk'
apk的命名,但是很遺憾的是以前老的使用這個方法的應(yīng)用無法自動更新了处窥,只能重新下載嘱吗,作者并沒有做好兼容,這個很遺憾
2020.11.30更新
1滔驾、如果你安卓下載地址是http的那么恭喜你成功入坑谒麦。
安卓從sdk 27開始http訪問很多情況下會被禁止。如何做呢哆致?
在上面的xml文件夾內(nèi)再新建一個文件network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在AndroidManifest.xml的
<application
android:name="io.flutter.app.FlutterApplication"
android:label="task todo"
android:networkSecurityConfig="@xml/network_security_config"
...以下省略绕德。添加上面一句用來執(zhí)行剛才添加的network_security_config.xml
參考鏈接
1、Flutter app應(yīng)用內(nèi)更新 版本檢查(教你避坑)
最后附上Demo地址,如有什么不足和錯誤請指正摊阀,覺得受用反手就給顆??吧