Flutter- 实现 -App- 内更新安装包,让人茅塞顿开
从服务器拉取 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;}
与本地 version 信息比对,选择是否展示更新弹窗,我们采用的是 event_bus 触发
if (localVersion == remoteVersion) return;eventManager.eventBus.fi
re(new UpdateAppEvent(versionInfo));
进行版本升级,要注意区分 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.
评论