Flutter 实现 App 内更新安装包(1)

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

if (localVersion == remoteVersion) return;eventManager.eventBus.fire(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 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文件增加权限配置

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

import ‘package:dio/dio.dart’;

import ‘package:path_provider/path_provider.dart’;

/// 下载安卓更新包

Future downloadAndroid(String url) async {

/// 创建存储文件

Directory storageDir = await getExternalStorageDirectory();

String storagePath = storageDir.path;

File file = new File(‘ s t o r a g e P a t h / storagePath/ storagePath/{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’;

/// 安装apk

Future 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.

手动添加了SWIFT_VERSION后,又报

fatal error: ‘install_plugin/install_plugin-Swift.h’ file not found

#import <install_plugin/install_plugin-Swift.h>

报错原因是iOS在构建的时候默认是objective-c,而这个插件使用的是swift

解决方法:

创建ios/File.swift

//

// File.swift

// Runner

//

// Created by richer on 2019/11/22.

// Copyright © 2019 The Chromium Authors. All rights reserved.

//

import Foundation

创建ios/Runner-Bridging-Header.h文件

//

// Use this file to import your target’s public headers that you would like to expose to Swift.

//

编辑ios/Podfile,在target ‘Runner’ do后面添加 use_frameworks!

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
有参考价值的朋友也可以关注一下我**

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-TtxTTBSQ-1714702272099)]

[外链图片转存中…(img-6nYlsA4Y-1714702272100)]

[外链图片转存中…(img-w5XZ3wwu-1714702272101)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值