|
1 |
| -# flutter_upgrade |
| 1 | +## Flutter App 升级功能 |
2 | 2 |
|
3 |
| -A new Flutter plugin. |
| 3 | +如果你需要支持Android平台,在`./android/app/src/main/AndroidManifest.xml`文件中配置`provider`,代码如下: |
4 | 4 |
|
5 |
| -## Getting Started |
| 5 | +``` |
| 6 | +<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
| 7 | + xmlns:tools="http://schemas.android.com/tools" |
| 8 | + package="com.flutter.laomeng.flutter_upgrade_example"> |
| 9 | + <application |
| 10 | + android:name="io.flutter.app.FlutterApplication" |
| 11 | + android:icon="@mipmap/ic_launcher" |
| 12 | + android:label="flutter_upgrade_example"> |
| 13 | + ... |
| 14 | + <provider |
| 15 | + android:name="androidx.core.content.FileProvider" |
| 16 | + android:authorities="com.flutter.laomeng.flutter_upgrade_example.fileprovider" |
| 17 | + android:exported="false" |
| 18 | + android:grantUriPermissions="true"> |
| 19 | + <meta-data |
| 20 | + android:name="android.support.FILE_PROVIDER_PATHS" |
| 21 | + tools:replace="android:resource" |
| 22 | + android:resource="@xml/file_paths" /> |
| 23 | + </provider> |
| 24 | + </application> |
| 25 | +</manifest> |
| 26 | +``` |
6 | 27 |
|
7 |
| -This project is a starting point for a Flutter |
8 |
| -[plug-in package](https://flutter.dev/developing-packages/), |
9 |
| -a specialized package that includes platform-specific implementation code for |
10 |
| -Android and/or iOS. |
| 28 | +注意:provider中authorities的值为当前App的包名,和顶部的package值保持一致。 |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | +## App升级功能使用介绍 |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +只需在主页的`initState`方法中调用升级检测方法: |
| 37 | + |
| 38 | +```dart |
| 39 | +@override |
| 40 | + void initState() { |
| 41 | + AppUpgrade.appUpgrade( |
| 42 | + context, |
| 43 | + _checkAppInfo(), |
| 44 | + iosAppId: 'id88888888', |
| 45 | + ); |
| 46 | + super.initState(); |
| 47 | + } |
| 48 | +``` |
| 49 | + |
| 50 | +`_checkAppInfo`方法访问后台接口获取是否有新的版本的信息,返回`Future<AppUpgradeInfo>` 类型,`AppUpgradeInfo`包含title、升级内容、apk下载url、是否强制升级等版本信息。 |
| 51 | + |
| 52 | +`iosAppId`参数用于跳转到app store。 |
| 53 | + |
| 54 | +`_checkAppInfo()`方法通常是访问后台接口,这里直接返回新版本信息,代码如下: |
| 55 | + |
| 56 | +```dart |
| 57 | +Future<AppUpgradeInfo> _checkAppInfo() { |
| 58 | + return Future.value(AppUpgradeInfo( |
| 59 | + title: '新版本V1.1.1', |
| 60 | + contents: [ |
| 61 | + '1、支持立体声蓝牙耳机,同时改善配对性能', |
| 62 | + '2、提供屏幕虚拟键盘', |
| 63 | + '3、更简洁更流畅,使用起来更快', |
| 64 | + '4、修复一些软件在使用时自动退出bug', |
| 65 | + '5、新增加了分类查看功能' |
| 66 | + ], |
| 67 | + apkDownloadUrl: '', |
| 68 | + force: false, |
| 69 | + )); |
| 70 | +``` |
| 71 | + |
| 72 | +好了,基本的升级功能就完成了,弹出提示框的效果如下: |
| 73 | + |
| 74 | + |
| 75 | + |
| 76 | +点击“以后再说”,提示框消失,点击“立即体验”,自动区分不同平台。 |
| 77 | + |
| 78 | +访问后台接口获取新版本的信息一般需要当前App的包名和版本,查询方法如下: |
| 79 | + |
| 80 | +```dart |
| 81 | +await FlutterUpgrade.appInfo |
| 82 | +``` |
| 83 | + |
| 84 | +返回的类型是`AppInfo`: |
| 85 | + |
| 86 | +- versionName:版本号,比如1.0.0。 |
| 87 | +- versionCode:Android独有版本号,对应Android build.gradle中的versionCode,ios返回“0”。 |
| 88 | +- packageName:包名,对应Android build.gradle中的applicationId,ios的BundleIdentifier。 |
| 89 | + |
| 90 | +### iOS平台升级 |
| 91 | + |
| 92 | +iOS平台直接跳转到app store相关页面,`iosAppId`一定要设置对,否则app store会找不到应用程序。 |
| 93 | + |
| 94 | +### Android平台下载apk |
| 95 | + |
| 96 | +Android平台则会判断是否设置了apk下载url,如果设置了则下载apk则直接下载,效果如下: |
| 97 | + |
| 98 | + |
| 99 | + |
| 100 | +当下载完成时直接跳转到apk安装引导界面,效果如下: |
| 101 | + |
| 102 | + |
| 103 | + |
| 104 | +用户点击允许,出现如下界面: |
| 105 | + |
| 106 | + |
| 107 | + |
| 108 | +点击继续安装即可,上面的安装引导界面是系统界面,不同的手机或者不同的Android版本会略有不同。 |
| 109 | + |
| 110 | + |
| 111 | + |
| 112 | +### Android平台跳转应用市场 |
| 113 | + |
| 114 | +如果不提供apk下载地址,点击“立即体验”,则会跳转到应用市场,不指定应用市场则会弹出提示框,让用户选择应用市场,效果如下: |
| 115 | + |
| 116 | + |
| 117 | + |
| 118 | +提示框内将会包含手机内安装的所有的应用市场,用户选择一个然后跳转到对应应用市场的详情界面,如果当前应用未在此市场上架则会出现“找不到的界面”。 |
| 119 | + |
| 120 | +通常情况下会指定应用市场,这就需要知道用户手机内安装的应用市场,查询方法如下: |
| 121 | + |
| 122 | +```dart |
| 123 | +_getInstallMarket() async { |
| 124 | + List<String> marketList = await FlutterUpgrade.getInstallMarket(); |
| 125 | +} |
| 126 | +``` |
| 127 | + |
| 128 | +插件内置了国内常用的应用市场,包括小米、魅族、vivo、oppo、华为、zte、360助手、应用宝、pp助手、豌豆荚,如果你需要检测其他的应用市场,比如google play,只需添加googl play的包名即可: |
| 129 | + |
| 130 | +```dart |
| 131 | +_getInstallMarket() async { |
| 132 | + List<String> marketList = await FlutterUpgrade.getInstallMarket(marketPackageNames: ['google play 包名']); |
| 133 | +} |
| 134 | +``` |
| 135 | + |
| 136 | +方法返回手机安装的应用市场,根据安装的应用市场指定跳转应用市场,如果你要指定内置的应用市场,可以根据包名获取内置的应用市场的相关信息: |
| 137 | + |
| 138 | +```dart |
| 139 | +AppMarketInfo _marketInfo = AppMarket.getBuildInMarket(packageName); |
| 140 | +``` |
| 141 | + |
| 142 | +指定华为应用市场: |
| 143 | + |
| 144 | +```dart |
| 145 | +AppUpgrade.appUpgrade( |
| 146 | + context, |
| 147 | + _checkAppInfo(), |
| 148 | + iosAppId: 'id88888888', |
| 149 | + appMarketInfo: AppMarket.huaWei |
| 150 | +); |
| 151 | +``` |
| 152 | + |
| 153 | +指定没有内置的应用市场方法如下: |
| 154 | + |
| 155 | +```dart |
| 156 | +AppUpgrade.appUpgrade( |
| 157 | + context, |
| 158 | + _checkAppInfo(), |
| 159 | + iosAppId: 'id88888888', |
| 160 | + appMarketInfo: AppMarketInfo( |
| 161 | + '应用市场名称(选填)','应用市场包名','应用市场类名' |
| 162 | + ), |
| 163 | +); |
| 164 | +``` |
| 165 | + |
| 166 | + |
| 167 | + |
| 168 | +## 提示框样式定制 |
| 169 | + |
| 170 | +如果默认的升级提示框不满足你的需求,那么你可以定制你的升级提示框。 |
| 171 | + |
| 172 | +title及升级内容文字样式设置: |
| 173 | + |
| 174 | +```dart |
| 175 | +AppUpgrade.appUpgrade(context, _checkAppInfo(), |
| 176 | + titleStyle: TextStyle(fontSize: 30), |
| 177 | + contentStyle: TextStyle(fontSize: 18), |
| 178 | + ... |
| 179 | +) |
| 180 | +``` |
| 181 | + |
| 182 | +通过`titleStyle`和`contentStyle`设置其样式,可以设置字体大小、颜色、粗体等。 |
| 183 | + |
| 184 | +设置“取消”和“升级按钮”文本和样式: |
| 185 | + |
| 186 | +```dart |
| 187 | +AppUpgrade.appUpgrade(context, _checkAppInfo(), |
| 188 | + cancelText: '以后再说', |
| 189 | + cancelTextStyle: TextStyle(color: Colors.grey), |
| 190 | + okText: '马上升级', |
| 191 | + okTextStyle: TextStyle(color: Colors.red), |
| 192 | + ... |
| 193 | +) |
| 194 | +``` |
| 195 | + |
| 196 | +默认“取消”按钮文本是"以后再说",默认“升级”按钮的文本是“立即体验”。 |
| 197 | + |
| 198 | +设置“升级”按钮的背景颜色,需要2种颜色,2种颜色左到右线性渐变,如果想设置纯色,只需将2种颜色设置为同一个颜色即可,默认颜色是系统的`primaryColor`: |
| 199 | + |
| 200 | +```dart |
| 201 | +AppUpgrade.appUpgrade(context, _checkAppInfo(), |
| 202 | + okBackgroundColors: [Colors.blue, Colors.lightBlue], |
| 203 | + ... |
| 204 | +) |
| 205 | +``` |
| 206 | + |
| 207 | +设置进度条的颜色: |
| 208 | + |
| 209 | +```dart |
| 210 | +AppUpgrade.appUpgrade(context, _checkAppInfo(), |
| 211 | + progressBarColor: Colors.lightBlue.withOpacity(.4), |
| 212 | + ... |
| 213 | +) |
| 214 | +``` |
| 215 | + |
| 216 | +设置升级提示框的圆角半径,默认是20: |
| 217 | + |
| 218 | +```dart |
| 219 | +AppUpgrade.appUpgrade(context, _checkAppInfo(), |
| 220 | + borderRadius: 15, |
| 221 | + ... |
| 222 | +) |
| 223 | +``` |
| 224 | + |
| 225 | + |
| 226 | + |
| 227 | +## Flutter App 升级功能流程 |
| 228 | + |
| 229 | +应用程序升级功能是App的基础功能之一,如果没有此功能会造成用户无法升级,应用程序的bug或者新功能老用户无法触达,甚至损失这部分用户。 |
| 230 | + |
| 231 | + |
| 232 | +对于应用程序升级功能的重要性就无需赘言了,下面介绍下应用程序升级功能的几种方式,从平台方面来说: |
| 233 | + |
| 234 | +- IOS平台,应用程序升级功能只能通过跳转到app store进行升级。 |
| 235 | +- Android平台,既可以通过跳转到应用市场进行升级,也可以下载apk包升级。 |
| 236 | + |
| 237 | +从强制性来说可以分别强制升级和非强制升级: |
| 238 | + |
| 239 | +- 强制升级:就是用户必须升级才能继续使用App,如果不是非常必要不建议使用如此强硬的方式,会造成用户的反感。 |
| 240 | +- 非强制升级就是允许用户点击“取消”,继续使用App。 |
| 241 | + |
| 242 | + |
| 243 | + |
| 244 | +下面分别介绍IOS和Android升级流程。 |
| 245 | + |
| 246 | +## IOS升级流程 |
| 247 | + |
| 248 | +IOS升级流程如下: |
| 249 | + |
| 250 | + |
| 251 | + |
| 252 | +流程说明: |
| 253 | + |
| 254 | +1. 通常我们会访问后台接口获取是否有新的版本,如果有新的版本则弹出提示框,判断当前版本是否为“强制升级”,如果是则只提供用户一个“升级”的按钮,否则提供用户“升级”和“取消”按钮。 |
| 255 | +2. 弹出提示框后用户选择是否升级,如果选择“取消”,提示框消失,如果选择“升级”,跳转到app store进行升级。 |
| 256 | + |
| 257 | + |
| 258 | + |
| 259 | +## Android 升级流程 |
| 260 | + |
| 261 | +相比ios的升级过程,Android就稍显复杂了,流程图如下: |
| 262 | + |
| 263 | + |
| 264 | + |
| 265 | +流程说明: |
| 266 | + |
| 267 | +1. 访问后台接口获取是否有新的版本,这里和IOS是一样的,有则弹出升级提示框,判断当前版本是否为“强制升级”,如果是则只提供用户一个“升级”的按钮,否则提供用户“升级”和“取消”按钮。 |
| 268 | +2. 弹出提示框后有用户选择是否升级,如果选择“取消”,提示框消失,如果选择“升级”,判断是跳转到应用市场进行升级还是通过下载apk升级。 |
| 269 | +3. 如果下载apk升级,则开始下载apk,下载完成后跳转到apk安装引导界面。 |
| 270 | +4. 如果跳转到应用市场升级,判断是否指定了应用市场,比如只在华为应用市场上架了,那么此时需要指定跳转到华为应用市场,即使你在很多应用市场都上架了,也应该根据用户手机安装的应用市场指定一个应用市场,让用户选择应用市场不是一个好的体验,而且用户也不知道应该去哪个市场更新,如果用户选择了一个你没有上架的应用市场,那就更尴尬了。 |
| 271 | +5. 指定应用市场后直接跳转到指定的应用市场的更新界面。 |
11 | 272 |
|
12 |
| -For help getting started with Flutter, view our |
13 |
| -[online documentation](https://flutter.dev/docs), which offers tutorials, |
14 |
| -samples, guidance on mobile development, and a full API reference. |
|
0 commit comments