Flutter APP升级功能模块分享

Posted by Hi@Yoese on Sunday, October 25, 2020

实现功能

  • 自动检查本地APP版本是否最新
  • 自动提醒用户升级
  • 引导用户去 AppStore 或 Google Play 市场完成升级操作
  • 当用户放弃本次升级后,在1天内不再提醒

实现逻辑

![业务逻辑](https://raw.githubusercontent.com/tongweizj/MaxFlutterTutorial/master/doc/img/max-flutter-tutorial-1.png “Image title” %}

业务功能截图

目录结构

.
├── lib
│   ├── main.dart
│   ├── setting.dart
│   ├── core
│   │   ├── service
│   │   └── viewmodels
│   └── ui
│       ├── home_view.dart
│       ├── updater_view.dart
│       └── widgets
└── pubspec.yaml

核心代码片段说明

update_view.dart

在启动页或某个必须经过的页面上加入update_view, 用异步的方式调用升级检查功能,如果可以升级,就在当前页面插入ShowDialog

/// update_view.dart
  _isUpdate() async {
    var isUpdate = await UpdateModel.isUpdate();
    if (isUpdate["isUpdate"] == 1) {
      buildUpdateShowDialog(context, isUpdate["appStoreUrl"]);
    }
  }

update_model.dart

class UpdateModel {
  /// 检查是否需要升级
  static Future isUpdate() async {
    // changeState(ViewState.Busy);
    //每次打开APP获取当前时间戳
    var timeEnd = DateTime.now().millisecondsSinceEpoch;
    //获取"Later"保存的时间戳
    var timeStart = UpdateApi.getUpgradeRemindLaterTime();

    if (timeStart == 0 && timeEnd - timeStart >= getUpdateFrequency) {
      // 之前没有点击过,这事第一次打开APP时执行"版本更新"的网络请求
      // 或者 间隔时间 >= 一周,执行网络请求

      Map appVersionData = await UpdateApi.getAppVersion();
      var respAppVer = Map.from({
        "isUpdate": 1,
        "appStoreUrl": "",
      });
      var _serviceVersionCode;
      if (appVersionData != null) {
        /// 判断当前用户手机系统是ios 还是 android
        if (Platform.isIOS) {
          // 赋值ios客户单的版本号
          _serviceVersionCode = appVersionData["versionCode"]["ios"];
          // 赋值ios客户端的AppStore的URL
          respAppVer["appStoreUrl"] = SERVER_AppStore_URL;
        } else if (Platform.isAndroid) {
          //android相关代码
          _serviceVersionCode = appVersionData["versionCode"]["android"];
          //GooglePlay的 下载URL
          respAppVer["appStoreUrl"] = SERVER_GooglePlay_URL;
        }
      }
      /// 比较本地版本号和服务端版本号的大小
      respAppVer["isUpdate"] = await _checkVersionCode(_serviceVersionCode);
      return respAppVer;
    }
  }

  //检查版本更新的版本号
  static _checkVersionCode(String appSerCode) {
    String _appLocalCodeStr = UpdateApi.getAppLocalCode();
    final _appSerCode = Version.parse(appSerCode);
    final _appLocalCode = Version.parse(_appLocalCodeStr);
    if (_appSerCode > _appLocalCode) {
      return 1;
    } else {
      return 0;
    }
  }
}

源代码

Github

「真诚赞赏,手留余香」

Hi@Yoese

真诚赞赏,手留余香

使用微信扫描二维码完成支付