flutter跨平臺開發之App升級方案

早起的年輕人發表於2020-02-15

題記 —— 執劍天涯,從你的點滴積累開始,所及之處,必精益求精,即是折騰每一天。

重要訊息


本文章將講述: 在 flutter 跨平臺開發中,使用外掛 install_plugin_custom,實現在 Android 平臺調起自動安裝,在 ios 平臺跳轉 appstore中更新


flutter 跨平臺實際應用開發中,app的升級效果如下 ios 平臺:

在這裡插入圖片描述

Android 平臺:

在這裡插入圖片描述

1 引言

在APP開發方案中,一般我們會通過訪問我們的服務平臺來獲取 APP 的版本資訊,如版本號、版本名稱、是否強制更新等等

在這裡描述的是 在 Android 平臺下載 apk 然後再調起應用程式的安裝,在 ios 平臺點選更新跳轉 appstore 平臺。

在這裡下載 apk 使用的是 Dio ,安裝 apk 使用的是 install_plugin_custom 外掛,flutter 專案中的依賴

  # 許可權申請
  permission_handler: 4.0.0
  # 網路請求
  dio: ^2.1.2
  #  APP升級安裝元件 Android中呼叫自動安裝 apk的程式 ios 呼叫開啟APPStore
  install_plugin_custom:
    git:
      url: https://github.com/zhaolongs/install_plugin_custom.git
      ref: master
複製程式碼

2 flutter 中 Android 平臺的更新

2.1 SD 卡儲存許可權申請

  Future<bool> _checkPermission(BuildContext context) async {
    if (Theme.of(context).platform == TargetPlatform.android) {
      PermissionStatus permission = await PermissionHandler()
          .checkPermissionStatus(PermissionGroup.storage);
      if (permission != PermissionStatus.granted) {
        Map<PermissionGroup, PermissionStatus> permissions =
            await PermissionHandler()
                .requestPermissions([PermissionGroup.storage]);
        if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {
          return true;
        }
      } else {
        return true;
      }
    } else {
      return true;
    }
    return false;
  }

複製程式碼
2.2 SD 卡存儲存路徑獲取
  Future<String> _findLocalPath(BuildContext context) async {
    final directory = Theme.of(context).platform == TargetPlatform.android
        ? await getExternalStorageDirectory()
        : await getApplicationDocumentsDirectory();
    return directory.path;
  }

複製程式碼
2.3 使用 Dio 下載 apk

     //apk 網路儲存連結
     String apkNetUrl ="";
     //手機中sd卡上 apk 下載儲存路徑
     String localPath ="";

      Dio dio = Dio();
      //設定連線超時時間
      dio.options.connectTimeout = 1200000;
      //設定資料接收超時時間
      dio.options.receiveTimeout = 1200000;
      try {
        Response response = await dio
            .download(apkNetUrl, localPath
                onReceiveProgress: (int count, int total) {
          // count 當前已下載檔案大小
          // total 需要下載檔案的總大小
        });
        if (response.statusCode == 200) {
          print('下載請求成功');
          //"安裝";
        } else {
          //"下載失敗重試";
        }
      } catch (e) {
        //"下載失敗重試";
        if (mounted) {
          setState(() {});
        }
      }
複製程式碼
2.4 使用 install_plugin_custom 安裝 apk
//apk 的包名
String apkPackageName ="";
// 安裝 
InstallPluginCustom.installApk(
              localPath,
              apkPackageName)
          .then((result) {
        print('install apk $result');
      }).catchError((error) {
        // "重試";
        installStatues = 2;
        setState(() {});
      });
複製程式碼

3 flutter 中 ios 平臺的更新

如果 flutter 專案是執行在 ios 手機中,那麼有更新資訊的時候,直接跳轉 appstore 中應用程式的頁面更新

if (Theme.of(context).platform == TargetPlatform.iOS) {
      InstallPluginCustom.gotoAppStore(
          "https://apps.apple.com/cn/app/id1472328992");
 } 
複製程式碼

在使用的時候直接替換這裡的跳轉的連結就好。

相關文章