写点什么

Flutter- 实现 -App- 内更新安装包,让人茅塞顿开

用户头像
Android架构
关注
发布于: 11 小时前
  1. 从服务器拉取 app 版本的最新信息


Map _data = await _fetchVersionInfo();


/// 拉取版本号信息 Future<Map> _fetchVersionInfo() async {HttpResult res = await Api.get('/version-api/versions/latest', query: {'from': _flatform,'version': _version,});return res.code == 200 ? res.data : null;}


  1. 与本地 version 信息比对,选择是否展示更新弹窗,我们采用的是 event_bus 触发


if (localVersion == remoteVersion) return;eventManager.eventBus.fi


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


re(new UpdateAppEvent(versionInfo));


  1. 进行版本升级,要注意区分 Android 与 IOS (1) IOS 更新 app 包


IOS 的处理方式比较简单,直接跳转到 appStore 即可,我这里采用的 urlLauncher 直接跳转


urlLauncher.launch(_link);


(2) Android 更新 app 包


需要开启存储权限,如果没有权限就申请


import 'package:permission_handler/permission_handler.dart';


/// 检查是否有权限,用于安卓 Future<bool> checkPermission() async {if (_flatform == '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;}


需要在 Android 的 AndroidManifest.xml 文件增加权限配置


<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" />


下载 apk 根据返回的下载链接,需要先把 Android 包文件下载到本地,这里需要对文件流进行操作,下载工具我是采用的 HTTP 请求工具库 dio,这里也可以采用专业的下载插件 flutter_downloader,这个插件支持 Android、IOS 下载,但是配置起来复杂,我折腾了好长时间,也没能配置成功,有玩转这个插件的可以给我推荐些文章。


import 'package:dio/dio.dart';import 'package:path_provider/path_provider.dart';


/// 下载安卓更新包 Future<File> downloadAndroid(String url) async {/// 创建存储文件 Directory storageDir = await getExternalStorageDirectory();String storagePath = storageDir.path;File file = new File('{Config.APP_NAME}v${_version}.apk');


if (!file.existsSync()) {file.createSync();}


try {/// 发起下载请求 Response response = await Dio().get(url,onReceiveProgress: showDownloadProgress,options: Options(responseType: ResponseType.bytes,followRedirects: false,));file.writeAsBytesSync(response.data);return file;} catch (e) {print(e);}}


安装 apk


import 'package:install_plugin/install_plugin.dart';


/// 安装 apkFuture<Null> installApk(String url) async {File _apkFile = await downloadAndroid(url);String _apkFilePath = _apkFile.path;


if (_apkFilePath.isEmpty) {print('make sure the apk file is set');return;}


InstallPlugin.installApk(_apkFilePath, Config.APP_ID).then((result) {print('install apk result');}).catchError((error) {print('install apk error: error');});}


这里我用的是install_plugin: ^2.0.1,该插件在安卓上能正常运行,但是在 Apple 上先是报


[!] Unable to determine Swift version for the following pods:


install_plugin does not specify a Swift version and none of the targets (Runner) integrating it have the SWIFT_VERSION attribute set. Please contact the author or set the SWIFT_VERSION attribute in at least one of the targets that integrate this pod.Xcode:The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Flutter-实现-App-内更新安装包,让人茅塞顿开