Flutter实现app自动升级

话不多说,有过开发过移动应用的人都应该自动升级流程,首先获取本地应用版本,然后从服务器获取线上移动应用版本号作比较是否升级。

第一步获取版本信息

API:https://pub.dev/packages/package_info

/**
 *  获取应用版本号
 * */
_getVersion() async {
  PackageInfo packageInfo = await PackageInfo.fromPlatform();
  setState(() {
    _version = packageInfo.version;
  });
}

第二步获取文件存储路径

API:https://pub.dev/packages/path_provider

/**
 *  获取文件存储路径
 * */
_getSavePath() async {
  var directory = await getExternalStorageDirectory();
  String storageDirectory = directory.path;
  _savePath = storageDirectory;
  print("StorageDirectory:${_savePath}");
}

第三步获检查应用的存储权限

API:https://pub.dev/packages/permission_handler

/**
 *  检测存储权限
 * */
Future<bool> _checkPermission() async {
  if (Theme
      .of(context)
      .platform == TargetPlatform.android) {
    final status = await Permission.storage.status;
    if (status != PermissionStatus.granted) {
      final result = await Permission.storage.request();
      if (result == PermissionStatus.granted) {
        return true;
      } else {
        return false;
      }
    } else {
      return true;
    }
  }
  return false;
}

第四步下载需要升级的应用地址

API: https://pub.dev/packages/dio

/**
 *  下载应用
 * */
_download() async {
  _checkPermission();
  String appName = "bby.apk";
  String downPath = "$_savePath/$appName";
  String apkUrl = "https://xxxxxx.apk";//远程应用地址
  Dio dio = new Dio();
  await dio.download(
      apkUrl, downPath, onReceiveProgress: (int count, int total) {
    print("${(count / total * 100).toStringAsFixed(0)}%");

    setState(() {
      _value = double.tryParse((count / total).toStringAsFixed(1));
    });
  });
  print("$downPath");
  await OpenFile.open(
      downPath, type: "application/vnd.android.package-archive");
}

第五步打开下载文件

API:https://pub.dev/packages/open_file

由于是.apk文件打开方式为

{".apk",    "application/vnd.android.package-archive"},

await OpenFile.open( downPath, type: "application/vnd.android.package-archive");

另外要配置 ,不然安装的时候可能会找不到文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="xxx.xxx.xxxxx">
    <application>
        ...
        <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="${applicationId}.fileProvider"
                android:exported="false"
                android:grantUriPermissions="true"
                tools:replace="android:authorities">
            <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/filepaths"
                    tools:replace="android:resource" />
        </provider>
    </application>
</manifest>
filepaths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="camera_photos"
            path="" />
        <external-path
            name="files_root"
            path="Android/data/你的应用包名/" />
        <external-path
            name="external_storage_root"
            path="." />
    </paths>
</resources>

不要忘了Android需要添加权限

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

猜你喜欢

转载自blog.csdn.net/u012941592/article/details/114540221
今日推荐