Flutter 实现 App 内更新安装包,微信小程序页面跳转方法总结

(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学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

target ‘Runner’ do

use_frameworks!

  1. 展示下载进度,dio提供下载进度的回调

/// 展示下载进度

void showDownloadProgress(num received, num total) {

if (total != -1) {

double _progress =

double.parse(’${(received / total).toStringAsFixed(2)}’);

eventManager.eventBus

.fire(new UpdateAndroidProgressEvent(_progress));

}

}


版权声明:本文为m0_64382950原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。