Flutter 應(yīng)用內(nèi)App版本更新

一来屠、前言

我們平時開發(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)安裝

二、效果圖

Slice.png

三铺然、升級邏輯

  • 請求版本升級接口
    接口返回數(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)建步驟如下
    image.png
文件在項目中路徑

上圖為文件路徑瓦盛,創(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地址,如有什么不足和錯誤請指正摊阀,覺得受用反手就給顆??吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻蛇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胞此,更是在濱河造成了極大的恐慌臣咖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漱牵,死亡現(xiàn)場離奇詭異夺蛇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酣胀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蚊惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灵临,你說我怎么就攤上這事截型。” “怎么了儒溉?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵宦焦,是天一觀的道長。 經(jīng)常有香客問我,道長波闹,這世上最難降的妖魔是什么酝豪? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮精堕,結(jié)果婚禮上孵淘,老公的妹妹穿的比我還像新娘。我一直安慰自己歹篓,他們只是感情好瘫证,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庄撮,像睡著了一般背捌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洞斯,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天毡庆,我揣著相機(jī)與錄音,去河邊找鬼烙如。 笑死么抗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亚铁。 我是一名探鬼主播乖坠,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刀闷!你這毒婦竟也來了熊泵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤甸昏,失蹤者是張志新(化名)和其女友劉穎顽分,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體施蜜,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卒蘸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翻默。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缸沃。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖修械,靈堂內(nèi)的尸體忽然破棺而出趾牧,到底是詐尸還是另有隱情,我是刑警寧澤肯污,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布翘单,位于F島的核電站吨枉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哄芜。R本人自食惡果不足惜貌亭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望认臊。 院中可真熱鬧圃庭,春花似錦、人聲如沸失晴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽师坎。三九已至恕酸,卻和暖如春堪滨,著一層夾襖步出監(jiān)牢的瞬間胯陋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工袱箱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遏乔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓发笔,卻偏偏與公主長得像盟萨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子了讨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • “親前计,朋友圈第一條幫忙點(diǎn)贊胞谭,謝謝!” 打開微信男杈,某個朋友的信息總是這一句話丈屹,我重新退出微信,關(guān)閉手機(jī)...
    雪域紅妝閱讀 407評論 0 0
  • 直角式 以山式站立伶棒,雙腳分開與肩同寬旺垒,腳趾指向正前方,大腳趾壓實(shí)墊面肤无,雙手在體前十指交扣先蒋,吸氣,手臂由體前高舉過頭...
    青橙_cded閱讀 404評論 0 0