flutter自动更新

2023-10-27

一. 应用程序升级流程

本文仅介绍Android App的升级流程:

1. 获取本地apk版本号;

2. 请求接口获取服务器版本号和更新包地址;

3. 如果本地版本和服务器版本不一致则提示升级,弹窗更新提示框;

4. 用户确定升级,调用文件传输方法下载apk文件;

5. 监听下载进度,当下载完成打开apk进行安装;

二.获取本地版本信息

1、安装包

package_info | Dart Package

2、引用包

// 引入获取版本信息包
import 'package:package_info/package_info.dart';
 
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String appName = packageInfo.appName;
String version = packageInfo.version;
String packageName = packageInfo.packageName;
 
// 应用名称
print("appName:${appName}");
// 版本号
print("version:${version}");
// 包名称
print("packageName:${packageName}");

三.获取应用安装目录

1、安装包

path_provider | Dart Package

2、引用包

// 引入获取文件存储路径的包
import 'package:path_provider/path_provider.dart';

Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
 
// 获取应用的安装目录
print("appDocDir:${appDocPath}");

四.下载更新apk文件

1、安装包

ota_update | Dart Package

2、引用包

// 引入下载文件的包
import 'package:ota_update/ota_update.dart';

String fileName = "下载包名称.apk";//包名称必须保持一致
String url = "http://xxxx/下载包名称.apk";//线上更新包地址
String _progress = '0';
OtaUpdate()
   .execute(url, destinationFilename: fileName)
   .listen(
        (OtaEvent event) async{
          switch (event.status) {
            case OtaStatus.DOWNLOADING: // 下载中
              _progress = event.value!;
              print('下载进度:${event.value!}%');
              break;
            case OtaStatus.INSTALLING: //安装中
              _progress = '100';
              break;
            case OtaStatus.PERMISSION_NOT_GRANTED_ERROR: // 权限错误
              print('由于缺少权限,无法继续!');
              break;
            default: // 其他问题
              break;
          }
        },
     );

五.配置信息

1、android/app/src/main/AndroidManifest.xml

<!-- 访问网络 -->
<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" />
<!--application中添加-->
<provider
    android:name="sk.fourq.otaupdate.OtaUpdateFileProvider"
    android:authorities="${applicationId}.ota_update_provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
               android:resource="@xml/filepaths" />
</provider>
<!--application里添加 android:requestLegacyExternalStorage="true" -->
<application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="项目名称"
        android:requestLegacyExternalStorage="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:usesCleartextTraffic="true">

2、android/app/src/main/res/xml/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>

3、android/build.gradle

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
    project.evaluationDependsOn(':app')
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "27.1.1"
            }
        }
    }
}

4、android/app/src/build.gradle

android {
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter自动更新 的相关文章

  • 应用程序在加载 xml 布局文件的主线程中做了太多工作

    我正在制作一个 9x9 数独网格 其中 81 个单元格本身就是一个 3x3 网格 单个细胞看起来像这样 1 2 3 4 5 6 7 8 9 每个数字代表该单元格的铅笔注释 我有一个名为 cell layout xml 的文件 表示这种 3x
  • 如何使用 gradle 从 3 个子模块构建 1 个 jar

    I have 安卓工作室3 gradle 4 1 梯度工具3 classpath com android tools build gradle 3 0 1 当我有一个模块并使用 gradle 工具 2 时 我使用了 task makeJar
  • 如何在MaterialApp主题中设置fontSize的MediaQuery textScaleFactor

    我想在 MaterialApp 主题内设置 MediaQuery 以便在用户更改设置时 FontSize 尊重用户设置 我尝试创建最终的curlScale MediaQuery of context textScaleFactor 并相应地
  • Android 图表[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个项目 其中有一些图表 图形 刻度图 烛台图和范围图 但问题是 没有该图表的库 我有烛台图的
  • socket.io xhr 在连接缓慢时出现错误(3G 移动网络)

    当我在 3G 移动网络 互联网连接速度慢 上测试我的真实聊天应用程序时 Socket io反复断开然后重新连接 我已经记录了原因 它说 xhr post error 这提高了 transport error 然后断开连接 我可以知道什么意思
  • 在 gradle 中,我应该排除分支下的所有依赖项还是只排除根就足够了?

    我已将以下自定义任务添加到我的build gradlefile 为了打印出依赖项的依赖项 This part is useful for finding conflict resolution s between dependencies
  • 吉夫伦致命信号11

    我正在尝试使用一些本机代码来创建 Gif 我使用绘画绘制图像 创建一些笔画 单击 保存 绘制的图像将保存为 JPG 格式 当我单击 创建 Gif 时 它会获取所有图像并开始创建 gif 这是当我收到致命信号 11 并且应用程序重新启动时 我
  • Android 全屏对话框确认和拒绝操作

    材料设计中的全屏对话框应该在操作栏 工具栏上有确认和拒绝操作 我的问题是 我该怎么做 显示对话框 getFragmentManager beginTransaction add R id container new MyDialogFrag
  • 错误类型 3 - 活动类不存在

    我正在尝试运行 webRTC 应用程序 但返回以下错误 启动应用程序 com onlinevoicecallapp com onlinevoicecallapp MainActivity 设备外壳命令 am start n com onli
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 必须提供一个函数体。尝试添加函数体

    我自己写的 因为statefulwidget没有自动创建模式 并且在 7 个不同的错误中我无法修复这个问题 import package flutter material dart class NaberMain extends State
  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 安卓。 CalendarView...一次仅显示一个月的日历

    我正在使用 CalendarView 其中我想一次仅查看一个月的日历并滚动查看下个月 但 CalendarView 一次显示所有月份 下面是我的代码
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • FirebaseAnimatedList 实时更改内容

    我想知道如何使用新查询 更改路径的新内容来重建 FirebaseAnimatedList new Flexible child new FirebaseAnimatedList query query sort DataSnapshot a
  • 哪个视图最亮?

    在Android中 哪个是轻量级视图 例如 View Textview Edittext 等 在某些情况下 我们需要使用视图来填充区域而不向用户显示视图 同时屏幕加载速度应该很快 您可以使用空间 android widget Space S
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 离子初始加载时间

    我正在使用 Ionic 构建一个简单的应用程序 但我的应用程序在冷启动时的初始加载时间方面存在性能问题 这是我所做的 collection repeat 代替带有 track by 的 ng repeat 原生滚动 overflow scr

随机推荐