Flutter应用升级插件hgg_app_upgrade的使用

Flutter应用升级插件hgg_app_upgrade的使用

添加依赖

  1. pubspec.yaml中加入:

    dependencies:
      hgg_app_upgrade: ^1.1.0
    
  2. 执行flutter命令获取包:

    flutter pub get
    
  3. 引入:

    import 'package:hgg_app_upgrade/hgg_app_upgrade.dart';
    
  4. 如果你需要支持Android平台,在./android/app/src/main/AndroidManifest.xml文件中配置provider,代码如下:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.flutter.laomeng.flutter_upgrade_example">
        <application
            android:name="io.flutter.app.FlutterApplication"
            android:icon="@mipmap/ic_launcher"
            android:label="flutter_upgrade_example">
            ...
            <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="com.hgg.hgg_app_upgrade_example.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    tools:replace="android:resource"
                    android:resource="@xml/file_paths" />
            </provider>
        </application>
    </manifest>
    

    注意:provider中authorities的值为当前App的包名,和顶部的package值保持一致。

App升级功能使用介绍

只需在主页的initState方法中调用升级检测方法:

@override
void initState() {
  AppUpgrade.appUpgrade(
    context,
    _checkAppInfo(),
    iosAppId: 'id88888888',
  );
  super.initState();
}

_checkAppInfo方法访问后台接口获取是否有新的版本的信息,返回Future<AppUpgradeInfo> 类型,AppUpgradeInfo包含title、升级内容、apk下载url、是否强制升级等版本信息。如果没有新的版本不返回即可。

Future<AppUpgradeInfo> _checkAppInfo() async {
  // 这里一般访问网络接口,将返回的数据解析成如下格式
  return Future.delayed(Duration(seconds: 1), () {
    return AppUpgradeInfo(
      title: '新版本V1.1.1',
      contents: [
        '1、支持立体声蓝牙耳机,同时改善配对性能',
        '2、提供屏幕虚拟键盘',
        '3、更简洁更流畅,使用起来更快',
        '4、修复一些软件在使用时自动退出bug',
        '5、新增加了分类查看功能'
      ],
      force: false,
    );
  });
}

iosAppId参数用于跳转到app store。

访问后台接口获取新版本的信息一般需要当前App的包名和版本,查询方法如下:

await HggUpgrade.appInfo

返回的类型是AppInfo

  • versionName:版本号,比如1.0.0。
  • versionCode:Android独有版本号,对应Android build.gradle中的versionCode,ios返回“0”。
  • packageName:包名,对应Android build.gradle中的applicationId,ios的BundleIdentifier。

iOS平台升级

iOS平台直接跳转到app store相关页面,iosAppId一定要设置对,否则app store会找不到应用程序。

Android平台下载apk

Android平台则会判断是否设置了apk下载url,如果设置了则下载apk则直接下载,效果如下:

当下载完成时直接跳转到apk安装引导界面,效果如下:

用户点击允许,出现如下界面:

点击继续安装即可,上面的安装引导界面是系统界面,不同的手机或者不同的Android版本会略有不同。

Android平台跳转应用市场

如果不提供apk下载地址,点击“立即体验”,则会跳转到应用市场,不指定应用市场则会弹出提示框,让用户选择应用市场,效果如下:

提示框内将会包含手机内安装的所有的应用市场,用户选择一个然后跳转到对应应用市场的详情界面,如果当前应用未在此市场上架则会出现“找不到的界面”。

通常情况下会指定应用市场,这就需要知道用户手机内安装的应用市场,查询方法如下:

_getInstallMarket() async {
  List<String> marketList = await HggUpgrade.getInstallMarket();
}

插件内置了国内常用的应用市场,包括小米、魅族、vivo、oppo、华为、zte、360助手、应用宝、pp助手、豌豆荚,如果你需要检测其他的应用市场,比如google play,只需添加google play的包名即可:

_getInstallMarket() async {
  List<String> marketList = await HggUpgrade.getInstallMarket(marketPackageNames: ['com.google.android.apps.maps']);
}

方法返回手机安装的应用市场,根据安装的应用市场指定跳转应用市场,如果你要指定内置的应用市场,可以根据包名获取内置的应用市场的相关信息:

AppMarketInfo _marketInfo = AppMarket.getBuildInMarket(packageName);

指定华为应用市场:

AppUpgrade.appUpgrade(
  context,
  _checkAppInfo(),
  iosAppId: 'id88888888',
  appMarketInfo: AppMarket.huawei
);

指定没有内置的应用市场方法如下:

AppUpgrade.appUpgrade(
  context,
  _checkAppInfo(),
  iosAppId: 'id88888888',
  appMarketInfo: AppMarketInfo(
    '应用市场名称(选填)', '应用市场包名', '应用市场类名'
  ),
);

用户行为和下载回调

新的版本(1.1.0)新增了取消立即更新回调,用法如下:

AppUpgrade.appUpgrade(
  context,
  _checkAppInfo(),
  cancelText: '以后再说',
  okText: '马上升级',
  iosAppId: 'id88888888',
  appMarketInfo: AppMarket.huawei,
  onCancel: () {
    print('onCancel');
  },
  onOk: () {
    print('onOk');
  },
);

新增的下载进度下载状态变化回调,用法如下:

AppUpgrade.appUpgrade(
  context,
  _checkAppInfo(),
  cancelText: '以后再说',
  okText: '马上升级',
  iosAppId: 'id88888888',
  appMarketInfo: AppMarket.huawei,
  downloadProgress: (count, total) {
    print('count:$count,total:$total');
  },
  downloadStatusChange: (DownloadStatus status, {dynamic error}) {
    print('status:$status,error:$error');
  },
);

提示框样式定制

如果默认的升级提示框不满足你的需求,那么你可以定制你的升级提示框。

AppUpgrade.appUpgrade(context, _checkAppInfo(),
    titleStyle: TextStyle(fontSize: 30),
    contentStyle: TextStyle(fontSize: 18),
    ...
)

通过titleStylecontentStyle设置其样式,可以设置字体大小、颜色、粗体等。

AppUpgrade.appUpgrade(context, _checkAppInfo(),
    cancelText: '以后再说',
    cancelTextStyle: TextStyle(color: Colors.grey),
    okText: '马上升级',
    okTextStyle: TextStyle(color: Colors.red),
    ...
)

默认“取消”按钮文本是"以后再说",默认“升级”按钮的文本是“立即体验”。

AppUpgrade.appUpgrade(context, _checkAppInfo(),
    okBackgroundColors: [Colors.blue, Colors.lightBlue],
    ...
)

设置“升级”按钮的背景颜色,需要2种颜色,2种颜色左到右线性渐变,如果想设置纯色,只需将2种颜色设置为同一个颜色即可,默认颜色是系统的primaryColor:

AppUpgrade.appUpgrade(context, _checkAppInfo(),
    progressBarColor: Colors.lightBlue.withOpacity(.4),
    ...
)

设置进度条的颜色:

AppUpgrade.appUpgrade(context, _checkAppInfo(),
    progressBarColor: Colors.lightBlue.withOpacity(.4),
    ...
)

设置升级提示框的圆角半径,默认是20:

AppUpgrade.appUpgrade(context, _checkAppInfo(),
    borderRadius: 15,
    ...
)

更多关于Flutter应用升级插件hgg_app_upgrade的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用升级插件hgg_app_upgrade的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用hgg_app_upgrade插件的示例代码。这个插件通常用于在应用内提示用户进行版本更新。

首先,确保在你的pubspec.yaml文件中添加对hgg_app_upgrade的依赖:

dependencies:
  flutter:
    sdk: flutter
  hgg_app_upgrade: ^最新版本号  # 替换为实际的最新版本号

然后,运行flutter pub get来安装插件。

接下来,在你的Flutter应用中,你可以按照以下步骤使用hgg_app_upgrade插件:

  1. 导入插件
import 'package:hgg_app_upgrade/hgg_app_upgrade.dart';
  1. 配置和使用插件

下面是一个完整的示例,展示了如何检查版本更新并提示用户:

import 'package:flutter/material.dart';
import 'package:hgg_app_upgrade/hgg_app_upgrade.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    _checkForUpdates();
  }

  Future<void> _checkForUpdates() async {
    // 模拟从服务器获取的最新版本信息
    final updateInfo = UpgradeInfo(
      versionCode: 2, // 新版本代码
      versionName: "2.0.0", // 新版本名称
      upgradeContent: "本次更新修复了一些bug并优化了性能", // 更新内容
      apkUrl: "https://example.com/path/to/your/app-release.apk", // APK下载地址
      isForcibly: false, // 是否强制更新
    );

    // 使用插件检查版本更新
    HggAppUpgrade().checkUpgrade(updateInfo: updateInfo).then((result) {
      if (result == UpgradeResult.hasUpdate) {
        // 有更新,显示更新对话框
        HggAppUpgrade().showUpgradeDialog(
          context: context,
          upgradeInfo: updateInfo,
          onIgnore: () {
            // 用户选择忽略更新
            print("用户选择忽略更新");
          },
          onDownload: () {
            // 用户选择下载更新
            print("用户选择下载更新");
          },
        );
      } else if (result == UpgradeResult.noUpdate) {
        // 没有更新
        print("当前已是最新版本");
      } else if (result == UpgradeResult.forciblyUpgrade) {
        // 强制更新
        HggAppUpgrade().showForciblyUpgradeDialog(
          context: context,
          upgradeInfo: updateInfo,
          onDownload: () {
            // 用户选择下载更新(强制更新场景)
            print("用户选择下载强制更新");
          },
        );
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Center(
        child: Text('检查应用更新示例'),
      ),
    );
  }
}

// 模拟的升级信息类
class UpgradeInfo {
  final int versionCode;
  final String versionName;
  final String upgradeContent;
  final String apkUrl;
  final bool isForcibly;

  UpgradeInfo({
    required this.versionCode,
    required this.versionName,
    required this.upgradeContent,
    required this.apkUrl,
    required this.isForcibly,
  });
}

在上面的代码中,我们定义了一个UpgradeInfo类来模拟从服务器获取的更新信息。然后,在_checkForUpdates方法中,我们使用HggAppUpgrade().checkUpgrade方法来检查版本更新,并根据结果显示相应的对话框。

请注意,在实际应用中,你可能需要从服务器动态获取更新信息,而不是像示例中那样硬编码。此外,处理APK下载和安装可能需要额外的权限和配置,具体取决于你的应用和目标平台。

回到顶部