10.0.0
概述
RuStore In-app updates SDK 可确保用户设备上的应用保持最新版本。这有助于用户发现更新,体验性能提升并获得错误修复的结果。
实现示例
请使用 RuStore In-app updates SDK 来实现不同的更新方式。 目前支持:延迟更新、静默更新(不使用 RuStore UI)和强制更新。
请参考示例应用程序,以了解如何正确集成更新 SDK。
用户场景
- 延迟更新
- 强制更新
- 静默更新



SDK 正常运行条件
RuStore In-app updates SDK 的运行需要满足以下条件。
- 已在 RuStore 控制台的“推送通知 > 项目”部分加载应用程序数据。
- 应用程序已通过审核(无需发布应用程序)。
您的应用程序不同构建类型(debug、release 等)的签名和 package name 可能各不相同。 在这种情况下,您必须在 RuStore 控制台的“推送通知 > 项目”部分为每种构建类型创建一个项目。
- Android 操作系统版本为 7.0 或更高。
- 用户设备上的 RuStore 版本为最新版本。
- 用户已在 RuStore 中登录。
- RuStore 应用程序已获得安装应用程序的权限。
连接到项目
请执行以下命令将软件包连接到项目。
flutter pub add flutter_rustore_update
该命令将在 pubspec.yaml 文件中添加一行。
dependencies:
flutter_rustore_update: ^10.0.0
检查更新可用性
在请求更新之前,请检查您的应用程序是否有可用更新。 要检查更新可用性,请调用info() 方法。 调用此方法时将检查以下条件。
- 用户设备上已安装最新版本的 RuStore。
用户和应用在 RuStore 中均未被封禁。
。- RuStore 应用程序已获准安装其他应用。
- 用户已在 RuStore 中登录。
info 对象,其中包含关于更新必要性的信息。 请提前请求此对象并将其缓存,以便在用户方便的时间点无延迟地请求用户启动更新下载。
RustoreUpdateClient.info().then((info) {
print(info);
}).catchError((err) {
print(err);
});
info 对象包含用于确定更新可用性的一组必要参数。
-
updateAvailability— 更新可用性:UNKNOWN (int == 0)— 默认值;UPDATE_NOT_AVAILABLE (int == 1)— 无需更新;UPDATE_AVAILABLE (int == 2)— 需要下载更新,或更新已下载到用户设备上;DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS (int == 3)— 更新正在下载或安装已启动。
-
installStatus— 如果用户当前正在安装更新,则为更新的安装状态:UNKNOWN (int == 0)— 默认值;DOWNLOADED (int == 1)— 已下载;DOWNLOADING (int == 2)— 正在下载;FAILED (int == 3)— 错误;PENDING (int == 5)— 等待中。
仅在 updateAvailability 字段包含 UPDATE_AVAILABLE 值时,才能启动更新下载。
下载并安装更新
使用监听器
在确认更新可 用 (AppUpdateInfo) 后,您可以请求更新的下载状态 —— 为此,请启动更新下载状态监听器。
检查更新下载状态
对于静默更新,建议实现自定义界面。
请使用 listener() 方法。
RustoreUpdateClient.listener((state) {
switch (state.installStatus) {
case INSTALL_STATUS_DOWNLOADED:
// Обновление готово к установке
break;
case INSTALL_STATUS_DOWNLOADING:
// Здесь можно отобразить прогресс скачивания
break;
case INSTALL_STATUS_FAILED:
print("err ${state.installErrorCode}");
break;
}
});
state 对象描述了当前的下载状态。 该对象的内容如下所示。
-
installStatus— 如果用户当前正在安装更新,则为更新的安装状态:UNKNOWN (int == 0)— 默认值;DOWNLOADED (int == 1)— 已下载;DOWNLOADING (int == 2)— 正在下载;FAILED (int == 3)— 错误;PENDING (int == 5)— 等待中;
在更新 SDK 中,没有针对用户取消下载更新这种情况的特定状态。 如果用户在下载阶段中断了更新,installStatus 将返回初始状态 UNKNOWN (0) 并显示下载按钮。
如果用户已经下载了更新但取消了安装,则 installStatus 将返回 DOWNLOADED (1) 值。
请参考以下几种情况。
- 用户开始下载更新但取消了下载 —— 在这种情况下:
updateAvailability为UPDATE_AVAILABLE(2);installStatus为UNKNOWN(0)。
- 用户下载了更新文件但没有安装 —— 在这种情况下:
updateAvailability为UPDATE_AVAILABLE(2);installStatus为DOWNLOADED(1)。
bytesDownloaded— 已下载的字节数;totalBytesToDownload— 需要下载的字节总数;installErrorCode— 下载期间的错误代码。 错误代码在 错误处理 章节中有所描述。
启动更新下载
延迟更新
启动更新流程
要启动应用程序更新下载,请调用 download() 方法。
AppUpdateInfo 对象在一次使用后将失效。 若要再次调用 startUpdateFlow() 方法,请再次使用 info() 方法请求 AppUpdateInfo。
RustoreUpdateClient.download().then((value) {
print("download code ${value.code}");
if (value.code == ACTIVITY_RESULT_CANCELED) {
// Пользователь отказался от скачивания
}
}).catchError((err) {
print("download err ${err}");
}
);
如果用户确认下载更新,则 resultCode = ACTIVITY_RESULT_OK;如果用户拒绝,则 resultCode = ACTIVITY_RESULT_CANCELED。
在收到 INSTALL_STATUS_DOWNLOADED 状态后,您可以调用更新安装方法。
建议通知用户更新已准备好安装。
该方法可能会返回错误。
强制更新
启动更新流程
要启动强制更新应用程序的下载,请调用 immediate() 方法。
RustoreUpdateClient.immediate().then((value) {
print("silent code ${value.code}");
}).catchError((err) {
print("immediate err ${err}");
}
);
resultCode (Int):
ACTIVITY_RESULT_OK (-1)— 更新已完成,可能无法获取代码,因为 k. 应用程序在更新时终止。ACTIVITY_RESULT_CANCELED (0)— 流程被用户中断,或发生了错误。 在收到此代码时,应终止应用程序的运行。ACTIVITY_RESULT_NOT_FOUND (2)— 未安装 RuStore,或安装的版本不支持强制更新 (RuStore versionCode<191)。
throwable — 更新场景启动错误。
更新成功后无需进一步操作。
静默更新
启动更新流程
请调用 silent() 方法来启动应用程序的静默更新下载。
RustoreUpdateClient.silent().then((value) {
print("silent code ${value.code}");
}).catchError((err) {
print("silent err ${err}");
}
);
当调用 code = ACTIVITY_RESULT_OK 的 then 时,将注册一个更新下载任务。
在此场景中,只能调用带有 ACTIVITY_RESULT_OK 的 then 或 catchError。
调用该方法后,您可以在监听器中跟踪更新的下载状态。
在收到 INSTALL_STATUS_DOWNLOADED 状态后,您可以调用更新安装方法。 建议通知用户更新已准备好安装。
对于静默更新,建议实现自定义界面。
安装更新
在更新文件下载完成后,您可以启动更新安装 。 更新通过 Android 原生工具进行。 请使用以下方法启动更新安装:
completeUpdateFlexible()— 更新并重启应用程序;completeUpdateSilent()— 更新并关闭应用程序。
建议在更新准备好安装时通知用户。
灵活完成更新
RustoreUpdateClient.completeUpdateFlexible().catchError((err) {
print("completeUpdateFlexible err ${err}");
});
来自 RuStore 的 UI 更新:
-
用户将看到更新完成的 UI 对话框。
-
更新成功后,应用程序将重新启动。
静默完成更新
RustoreUpdateClient.completeUpdateSilent().catchError((err) {
print("completeUpdateSilent err ${err}");
});
来自 RuStore 的无 UI 更新:
- 系统不会显示更新完成的 UI 对话框。
- 如果更新成功,应用程序将会关闭。
错误处理
插件中的所有错误都通过常量实现。 常量的描述位于 const.dart 文件中。
可能出现的错误列表
RuStoreNotInstalledException— 用户设备上未安装 RuStore;RuStoreOutdatedException— 用户设备上安装的 RuStore 版本不支持此 SDK;RuStoreUserUnauthorizedException— 用户未在 RuStore 中登录;RuStoreException— RuStore 基础错误,其他错误均继承自此类;RuStoreInstallException(public val code: Int)— 下载和安装错误.ERROR_UNKNOWN(Int = 4001)— 未知错误。ERROR_DOWNLOAD(Int = 4002)— 下载时出错。ERROR_BLOCKED(Int = 4003)— 安装被系统拦截。ERROR_INVALID_APK(Int = 4004)— 更新 APK 文件无效。ERROR_CONFLICT(Int = 4005)— 与当前应用版本冲突。ERROR_STORAGE(Int = 4006)— 设备存储空间不足。ERROR_INCOMPATIBLE(Int = 4007)— 与设备不兼容。ERROR_APP_NOT_OWNED(Int = 4008)— 未购买该应用。ERROR_INTERNAL_ERROR(Int = 4009)— 内部错误。ERROR_ABORTED(Int = 4010)— 用户取消了更新安装。ERROR_APK_NOT_FOUND(Int = 4011)— 未找到用于启动安装的 APK 文件。ERROR_EXTERNAL_SOURCE_DENIED(Int = 4012)— 禁止启动更新。 例如,在第一个方法中返回了更新不可用的响应,但用户调用了第二个方法。ERROR_ACTIVITY_SEND_INTENT(Int = 9901)— 发送打开 Activity 的 Intent 时出错。ERROR_ACTIVITY_UNKNOWN(Int = 9902)— 打开 Activity 时出现未知错误。
应用更新依赖项列表
ru.rustore.sdk:core:0.1.10— GNU Lesser General Public License v3.0;ru.rustore.sdk:analytics:0.1.5— GNU Lesser General Public License v3.0;org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20— The Apache Software License, Version 2.0;org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4— The Apache Software License, Version 2.0;androidx.core:core-ktx:1.9.0— Apache License, Version 2.0;androidx.appcompat:appcompat:1.5.1— Apache License, Version 2.0;androidx.activity:activity:1.5.1— Apache License, Version 2.0.