当前位置:   article > 正文

Flutter App更新升级_flutter app版本更新

flutter app版本更新

1. 应用程序升级流程

由于在 IOS 中没法直接下载安装,如果版本不一致则直接跳转到IOS应用对应的应用市场就可以了,所以本文仅介绍Android App的升级流程。

Android App升级流程:

1. 获取本地版本号;

2. 请求服务器获取服务器版本号;

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

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

5. 监听下载进度;

6. 下载完成打开apk进行安装。

2. Android 升级 App 涉及的 API 库

  1. # app升级
  2. package_info_plus: ^1.4.3+1
  3. ota_update: ^4.0.1
  4. url_launcher: ^6.1.5
  5. progress_dialog_null_safe: ^1.0.7

3.在Android文件夹里面增加如下文件

4.filepaths文件里面的代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <paths>
  3. <external-path
  4. name="external-path"
  5. path="."/>
  6. <external-cache-path
  7. name="external-cache-path"
  8. path="."/>
  9. <external-files-path
  10. name="external-files-path"
  11. path="."/>
  12. <files-path
  13. name="files_path"
  14. path="."/>
  15. <cache-path
  16. name="cache-path"
  17. path="."/>
  18. <root-path
  19. name="name"
  20. path="."/>
  21. </paths>

 5.在AndroidManifest.xml里面添加如下代码

  1. <!--网络权限-->
  2. <uses-permission android:name="android.permission.INTERNET" />
  3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  5. <!--存储-->
  6. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  7. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  8. <!-- 必要权限,安装权限 -->
  9. <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  10. 在application里面添加如下代码
  11. <provider
  12. android:name="sk.fourq.otaupdate.OtaUpdateFileProvider"
  13. android:authorities="${applicationId}.ota_update_provider"
  14. android:exported="false"
  15. android:grantUriPermissions="true">
  16. <meta-data
  17. android:name="android.support.FILE_PROVIDER_PATHS"
  18. android:resource="@xml/filepaths" />
  19. </provider>
  20. <provider
  21. android:name="androidx.core.content.FileProvider"
  22. android:authorities="${applicationId}.fileProvider"
  23. android:exported="false"
  24. android:grantUriPermissions="true"
  25. tools:replace="android:authorities">
  26. <meta-data
  27. android:name="android.support.FILE_PROVIDER_PATHS"
  28. android:resource="@xml/filepaths"
  29. tools:replace="android:resource"/>
  30. </provider>

6.下面是更新app使用的代码片段

  1. /// 检查更新
  2. //定义apk的名称,与下载进度dialog
  3. String apkName = 'flutterApp.apk';
  4. String progress = "";
  5. late ProgressDialog pr;
  6. Future<void> doCheck() async {
  7. PackageInfo packageInfo = await PackageInfo.fromPlatform();
  8. String appName = packageInfo.appName;
  9. String packageName = packageInfo.packageName;
  10. String version = packageInfo.version;
  11. String buildNumber = packageInfo.buildNumber;
  12. String deviceType = "";
  13. // 应用名称
  14. print("appName:${appName}");
  15. // 包名称
  16. print("packageName:${packageName}");
  17. // 版本号
  18. print("version:${version}");
  19. // 构建编号
  20. print("buildNumber:${buildNumber}");
  21. sp.setString('app_version', version);
  22. if (Platform.isAndroid) {
  23. deviceType = "Android";
  24. } else {
  25. deviceType = "ios";
  26. }
  27. var params = <String, dynamic>{
  28. 'packageName': packageName,
  29. 'system': deviceType,
  30. };
  31. try {
  32. CheckoutBeanEntity checkVersionBeanEntity =
  33. await DataUtils.checkVersion(params);
  34. switch (checkVersionBeanEntity.code) {
  35. case MyHttpConfig.successCode:
  36. if (int.parse(buildNumber) <
  37. checkVersionBeanEntity.data.versionCode) {
  38. if (Platform.isAndroid) {
  39. // ignore: use_build_context_synchronously
  40. showUpdate(
  41. context,
  42. checkVersionBeanEntity.data.versionCode.toString(),
  43. checkVersionBeanEntity.data.fileUrl,
  44. checkVersionBeanEntity.data.description);
  45. } else {
  46. const url =
  47. "https://itunes.apple.com/cn/app/id1380512641"; // id 后面的数字换成自己的应用 id 就行了
  48. if (await canLaunch(url)) {
  49. await launch(url, forceSafariVC: false);
  50. } else {
  51. throw 'Could not launch $url';
  52. }
  53. }
  54. }
  55. break;
  56. default:
  57. MyToastUtils.showToastBottom(checkVersionBeanEntity.msg);
  58. break;
  59. }
  60. } catch (e) {
  61. // MyToastUtils.showToastBottom("网络异常");
  62. }
  63. }
  64. /// 显示更新内容
  65. Future<void> showUpdate(
  66. BuildContext context, String version, String url, String info) async {
  67. return showDialog<void>(
  68. context: context,
  69. barrierDismissible: false, //设置为false,点击空白处弹窗不关
  70. builder: (BuildContext context) {
  71. return CupertinoAlertDialog(
  72. title: Text('检测到新版本 v$version'),
  73. content: Text(
  74. info,
  75. style: TextStyle(
  76. fontSize: ScreenUtil().setSp(30),
  77. ),
  78. ),
  79. actions: <Widget>[
  80. FlatButton(
  81. child: const Text('下次在说'),
  82. onPressed: () {
  83. Navigator.of(context).pop();
  84. },
  85. ),
  86. FlatButton(
  87. child: const Text('立即更新'),
  88. onPressed: () => doUpdate(context, version, url),
  89. ),
  90. ],
  91. );
  92. },
  93. );
  94. }
  95. ///3.执行更新操作
  96. doUpdate(BuildContext context, String version, String url) async {
  97. //关闭更新内容提示框
  98. Navigator.pop(context);
  99. // downloadAndroid(url);
  100. _updateVersion(url);
  101. }
  102. /// android app更新
  103. void _updateVersion(String url) async {
  104. pr = ProgressDialog(
  105. context,
  106. showLogs: true,
  107. type: ProgressDialogType.download, //下载类型带下载进度
  108. isDismissible: false, //点击外层不消失
  109. );
  110. if (!pr.isShowing()) {
  111. pr.show();
  112. }
  113. try {
  114. // destinationFilename 是对下载的apk进行重命名
  115. OtaUpdate().execute(url, destinationFilename: 'hbgspad.apk').listen(
  116. (OtaEvent event) {
  117. print('status:${event.status},value:${event.value}');
  118. switch (event.status) {
  119. case OtaStatus.DOWNLOADING: // 下载中
  120. setState(() {
  121. progress = event.value!;
  122. double d = double.parse(progress);
  123. pr.update(
  124. progress: d,
  125. message: "下载中,请稍后…",
  126. );
  127. });
  128. break;
  129. case OtaStatus.INSTALLING: //安装中
  130. if (pr.isShowing()) {
  131. pr.hide();
  132. }
  133. break;
  134. case OtaStatus.PERMISSION_NOT_GRANTED_ERROR: // 权限错误
  135. print('更新失败,请稍后再试');
  136. if (pr.isShowing()) {
  137. pr.hide();
  138. }
  139. break;
  140. default: // 其他问题
  141. break;
  142. }
  143. },
  144. );
  145. } catch (e) {
  146. print('更新失败,请稍后再试');
  147. }
  148. }

7.里面组件报错的话,不要担心,因为那个都是自己定义的,只要替换成正常自己的代码提示请求方式和解析返回结果就可以了。

最后就能实现更新app功能了,喜欢的话留个赞吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/549363
推荐阅读
相关标签
  

闽ICP备14008679号