Flutter項目之app升級方案

来源:https://www.cnblogs.com/lunlunshiwo/archive/2019/02/11/10361298.html
-Advertisement-
Play Games

題接上篇的文章的項目,還是那個空貨管理app。本篇文章用於講解基於Flutter的app項目的升級方案。 在我接觸Flutter之前,做過一個比較失敗的基於DCloud的HTML5+技術的app,做過幾個RN項目。在這兩種不同機制的app升級方案中,RN採用的是微軟的CodePush技術。而那個比較 ...


題接上篇的文章的項目,還是那個空貨管理app。本篇文章用於講解基於Flutter的app項目的升級方案。

在我接觸Flutter之前,做過一個比較失敗的基於DCloud的HTML5+技術的app,做過幾個RN項目。在這兩種不同機制的app升級方案中,RN採用的是微軟的CodePush技術。而那個比較失敗的項目採用的是檢查版本號,下載安裝包的方法。而在這個Flutter項目中,我在寫app更新方法時,查資料的時候查到一篇文章,文章大概意思講解了一下Flutter實行CodePush的可能性。但是,我並未找到可能實現的方法。因此,採用了簡單粗暴的進行app升級。

伺服器的操作

為了檢驗版本號和下載app安裝包,我們在伺服器某文件夾下放置兩個文件,第一個為version.json文件,內容為:

{
    "android": "1.0.1"
}

這個文件用於保存版本號,我們可以寫一個讀取方法來讀取這個版本號:

Future<bool> checkNewVersion() async {
  try {
    final res = await http.get(downLoadUrl + '/version.json');
    if (res.statusCode == 200) {
      final Map<String, dynamic> body = json.decode(res.body);
      if (defaultTargetPlatform == TargetPlatform.android) {
        final packageInfo = await PackageInfo.fromPlatform();
        final newVersion = body['android'];
        return (newVersion.compareTo(packageInfo.version) == 1);
      }
    }
  } catch (e) {
    return false;
  }
  return false;
}

第二個文件為app安裝包,用來下載之後安裝。

app端的操作

在app端需要增加的方法比較多,有需要處理app的許可權和處理版本號讀取以及app安裝包下載和安裝等方法。

許可權的獲取

targetSdkVersion < 24之前,我們可以通過在AndroidManifest.xml這個文件中寫入獲取讀寫許可權:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

但是當Flutter更新到1.0.0版本之後,現階段的targetSdkVersion為27。API 23之前的版本都是自動獲取許可權,而從 Android 6.0 開始添加了許可權申請的需求,更加安全。因此,我們需要做一下額外的才做來獲取許可權。

我在stackoverflow上找到了一篇文章瞭解了一下這個問題的解決方案。這篇文章中贊最高的方法比較負責,因為時間比較短,暫時沒有研究,不過項目組大佬說如果要完美地解決這個問題還是要會過來研究一下。

我在本次項目中採用了第二種方法,在MainActivity.java的onCreate方法中添加

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());

然後引入simple_permissions這個依賴查詢app的許可權和詢問是否開啟許可權。具體方法為:

  //是否有許可權
  Future<bool> checkPermission() async {
    bool res = await SimplePermissions.checkPermission(
        Permission.WriteExternalStorage);
    return res;
  }

  //打開許可權
  Future<PermissionStatus> requestPermission() async {
    return SimplePermissions.requestPermission(Permission.WriteExternalStorage);
  }

版本號的獲取

我們在伺服器上放置了一個名為version.json的文件,我們可以獲取一下這個文件的內容訪問寫在裡面的版本號:

Future<bool> checkNewVersion() async {
  try {
    final res = await http.get(downLoadUrl + '/version.json');
    if (res.statusCode == 200) {
      final Map<String, dynamic> body = json.decode(res.body);
      if (defaultTargetPlatform == TargetPlatform.android) {
        // 獲取此時版本
        final packageInfo = await PackageInfo.fromPlatform();
        final newVersion = body['android'];
        // 此處比較版本
        return (newVersion.compareTo(packageInfo.version) == 1);
      }
    }
  } catch (e) {
    return false;
  }
  return false;
}

因為這個項目是基於安卓7.0的手持終端的項目,此處做了是否為安卓的查詢處理。

安裝包下載

在下載安裝包這個功能中,我們安裝了flutter_downloader這個依賴。先獲取一下下載地址,在下載安裝包:

// 獲取安裝地址
Future<String> get _apkLocalPath async {
  final directory = await getExternalStorageDirectory();
  return directory.path;
}
// 下載
Future<void> executeDownload() async {
  final path = await _apkLocalPath;
  //下載
  final taskId = await FlutterDownloader.enqueue(
      url: downLoadUrl + '/app-release.apk',
      savedDir: path,
      showNotification: true,
      openFileFromNotification: true);
  FlutterDownloader.registerCallback((id, status, progress) {
    // 當下載完成時,調用安裝
    if (taskId == id && status == DownloadTaskStatus.complete) {
      _installApk();
    }
  });
}
// 安裝
Future<Null> _installApk() async {
  // XXXXX為項目名
  const platform = const MethodChannel(XXXXX);
  try {
    final path = await _apkLocalPath;
    // 調用app地址
    await platform.invokeMethod('install', {'path': path + '/app-release.apk'});
  } on PlatformException catch (_) {}
}

安裝完成。

總結

以上為Flutter項目的更新步驟。在以上步驟中比較坑人的部分時許可權獲取至一塊中,如果不設置,則會無法成功下載安裝包。相信在不久的將來,Flutter可能也會用上CodePush。

順便說一下那個被我稱為失敗的項目,我去那個項目組的時候這個項目已經做了一半了。而讓我十分震驚的是作為一個基於vue的項目,項目進行了一多半還沒人使用狀態管理,vuex引入了,但是沒人用。嗯,強行carray,發現carry不動。只能儘力補救之後,眼睜睜地看著這個項目走向深淵。當時我還是個萌新,想進去學技術的,結果發現一群自稱三年經驗以上的人還需要我和另一個剛進公司的同事帶。當時還是很絕望的,只能一邊絕望一邊帶著他們加班。現在覺得項目組的水平和氛圍真的重要!!!

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對MySQL有研究的讀者,可能會發現MySQL更新很快,在安裝方式上,MySQL提供了兩種經典安裝方式:解壓式和一鍵式,雖然是兩種安裝方式,但我更提倡選擇解壓式安裝,不僅快,還乾凈。在操作系統上,MySQL也支持多類型操作系統,如linux,windows等,如下為MySQL幾個重大變化的操作系統。 ...
  • --1.創建臨時空間 create temporary tablespace zyj_temp tempfile 'D:\app2\user\virtual\oradata\orcl\zyj_temp.dbf' size 50m autoextend on next 50m maxsize 2048... ...
  • 1. WordCount程式 1.1 WordCount源程式 1.2 運行程式,Run As->Java Applicatiion 1.3 編譯打包程式,產生Jar文件 2 運行程式 2.1 建立要統計詞頻的文本文件 wordfile1.txt Spark Hadoop Big Data word ...
  • 第二章 shanzm [TOC] 第二章 查詢結果排序 2.1 以指定順序返回查詢結果 問題: 你想顯示部門編號為 10 的員工的名字、職位和工資,並根據工資從低到高排序。 解決方案: 使用 代碼如下: 當然你可以使用多欄位排序 比如先按照sal升序排序,然自後按照入職日期降序排列 【註意】 1. ...
  • --以下幾個為相關表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$process ;SELECT * FROM v$locked_object;SELECT * FROM al ...
  • hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。Metastore (hive元數據)Hive將元數據存儲在資料庫中,比如mysql ,derby.Hive中的元數據包括表的名稱 ...
  • ...
  • [20190211]簡單測試埠是否打開.txt--//昨天看一個鏈接,提到如果判斷一個埠是否打開可以簡單執行如下:--//參考鏈接:https://dba010.com/2019/02/04/check-if-a-port-on-a-remote-system-is-reachable-with ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...