React Native Client SDK API 参考

重要

Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但有几种建议的替代方法可以考虑迁移到其中。

详细了解支持时间表和替代方案

CodePush 插件由两个组件组成:

  1. JavaScript 模块,可以导入/需要,并允许应用在运行时与服务交互(例如检查更新,检查当前正在运行的应用更新的元数据)。

  2. 一个本机 API(Objective-C 和 Java),它允许 React Native 应用主机使用正确的 JS 捆绑位置自行启动。

以下部分详细介绍了这些 API 的形状和行为:

JavaScript API 参考

如果需要 react-native-code-push,模块对象除了根级 组件修饰器外还提供以下顶级方法:

  • allowRestart:如果挂起的更新在不允许重启时尝试重启应用,则 Reallows 以编程方式重启以编程方式进行重启(可选)。如果挂起的更新尝试重启应用,则立即重新启动应用。 此方法是一个高级 API,仅当应用通过该方法显式禁止重启 disallowRestart 时才是必需的。

  • checkForUpdate:询问 CodePush 服务配置的应用部署是否具有可用的更新。

  • disallowRestart:由于安装了 CodePush 更新,暂时禁止发生任何编程重启。 此方法是一个高级 API,当应用内的组件(例如载入过程)需要确保在其生存期内不会发生任何最终用户中断时非常有用。

  • getCurrentPackage:检索有关当前安装的更新的元数据(如说明、安装时间、大小)。

    注意

    从 CodePush 模块开始 v1.10.3-betagetCurrentPackage 弃用 getUpdateMetadata支持 *。

  • getUpdateMetadata:检索已安装更新的元数据(如说明,必需)。

  • notifyAppReady:通知 CodePush 运行时已安装的更新被视为成功。 如果手动检查并安装更新(未使用同步方法处理所有更新),则必须调用此方法;否则,CodePush 会将更新视为失败,并在应用下次重新启动时回滚到以前的版本。

  • restartApp:立即重启应用。 如果存在挂起的更新,它将立即显示给最终用户。 否则,调用此方法的行为与最终用户终止并重启进程的行为相同。

  • 同步:允许通过单个调用检查更新、下载更新和安装更新。 除非需要自定义 UI 或行为,否则我们建议大多数开发人员在将 CodePush 集成到其应用中时使用此方法

codePush

// Wrapper function
codePush(rootComponent: React.Component): React.Component;
codePush(options: CodePushOptions)(rootComponent: React.Component): React.Component;
// Decorator; Requires ES7 support
@codePush
@codePush(options: CodePushOptions)

用于将 React 组件包装在“更高顺序”的 React 组件中,该组件知道如何在装载应用时同步应用的 JavaScript 捆绑包和映像资产。 在内部,其生命周期句柄内的componentDidMount更高顺序组件调用sync,该句柄运行更新检查,下载更新(如果存在),并安装更新。

此修饰器支持让你自定义其行为,以便轻松启用具有不同要求的应用。 下面是一些可以使用它的示例(可以选择一个甚至使用组合):

  1. 应用启动时的无提示同步(最简单的默认行为)。 你的应用将自动下载可用的更新,并在下次应用重启时应用它们(例如 OS 或最终用户已终止更新或设备重启)。 这样,整个更新体验对最终用户“无提示”,因为它们看不到任何更新提示或“合成”应用重启。

    // Fully silent update that keeps the app in
    // sync with the server, without ever
    // interrupting the end user
    class MyApp extends Component {}
    MyApp = codePush(MyApp);
    
  2. 每次应用恢复时,无提示同步。 与 1 相同,除非我们检查更新,或者应用更新(如果应用在“后台”后每次返回到前台时都存在)。

    // Sync for updates every time the app resumes.
    class MyApp extends Component {}
    MyApp = codePush({ checkFrequency: codePush.CheckFrequency.ON_APP_RESUME, installMode: codePush.InstallMode.ON_NEXT_RESUME })(MyApp);
    
  3. 交互. 当更新可用时,请在下载更新之前提示最终用户获取权限,然后立即应用更新。 如果使用标志发布 mandatory 更新,最终用户仍会收到有关更新的通知,但他们不会选择忽略更新。

    // Active update that lets the end user know
    // about each update, and displays it to them
    // immediately after downloading it
    class MyApp extends Component {}
    MyApp = codePush({ updateDialog: true, installMode: codePush.InstallMode.IMMEDIATE })(MyApp);
    
  4. 日志/显示进度。 当应用与服务器同步以进行更新时,请使用 codePushStatusDidChangecodePushDownloadDidProgress 事件挂钩来记录此过程的不同阶段,甚至向用户显示进度栏。

    // Make use of the event hooks to keep track of
    // the different stages of the sync process.
    class MyApp extends Component {
        codePushStatusDidChange(status) {
            switch(status) {
                case codePush.SyncStatus.CHECKING_FOR_UPDATE:
                    console.log("Checking for updates.");
                    break;
                case codePush.SyncStatus.DOWNLOADING_PACKAGE:
                    console.log("Downloading package.");
                    break;
                case codePush.SyncStatus.INSTALLING_UPDATE:
                    console.log("Installing update.");
                    break;
                case codePush.SyncStatus.UP_TO_DATE:
                    console.log("Up-to-date.");
                    break;
                case codePush.SyncStatus.UPDATE_INSTALLED:
                    console.log("Update installed.");
                    break;
            }
        }
    
        codePushDownloadDidProgress(progress) {
            console.log(progress.receivedBytes + " of " + progress.totalBytes + " received.");
        }
    }
    MyApp = codePush(MyApp);
    

CodePushOptions

codePush修饰器接受一个“options”对象,该对象允许你自定义上述默认行为的许多方面:

  • checkFrequency (codePush.CheckFrequency - 指定何时要检查更新。 默认为 codePush.CheckFrequency.ON_APP_START。 有关 CheckFrequency 可用选项的说明及其用途,请参阅枚举参考。

  • deploymentKey (字符串) - 指定要查询其更新的部署密钥。 默认情况下,此值派生自 Info.plist 文件(iOS)和 MainActivity.java 文件(Android),但如果需要动态使用其他部署,则可以从脚本端重写该值。

  • installMode (codePush.InstallMode) - 指定何时要安装可选更新(未标记为必需更新)。 默认为 codePush.InstallMode.ON_NEXT_RESTART。 有关 InstallMode 可用选项的说明及其用途,请参阅枚举参考。

  • mandatoryInstallMode (codePush.InstallMode) - 指定何时要安装标记为必需更新的更新。 默认为 codePush.InstallMode.IMMEDIATE。 有关 InstallMode 可用选项的说明及其用途,请参阅枚举参考。

  • minimumBackgroundDuration (数字) - 指定应用在重新启动应用之前要处于后台的最小秒数。 此属性仅适用于使用 InstallMode.ON_NEXT_RESUMEInstallMode.ON_NEXT_SUSPEND安装的更新,并且对于更快地在最终用户面前获取更新非常有用,而不会太模糊。 默认为 0在恢复后立即应用更新,或者除非应用暂停时间足够长,但不管它位于后台多长时间。

  • updateDialog (UpdateDialogOptions - 用于确定在更新可用时是否应向最终用户显示确认对话框的“options”对象,如果是,则使用哪些字符串。 默认为 null禁用对话框。 将此设置为任何 true 值将启用具有默认字符串的对话框,并将对象传递给此参数允许启用对话框,并重写一个或多个默认字符串。 在 App Store 分布式应用中启用此选项之前,请参阅 此说明

    以下列表表示可用选项及其默认值:

    • appendReleaseDescription (Boolean) - 指示是否要将可用版本的说明追加到通知消息(显示给最终用户)。 默认为 false

    • descriptionPrefix (字符串) - 指示在向最终用户显示更新通知时要为发布说明添加前缀(如果有)的字符串。 默认为 " Description: "

    • mandatoryContinueButtonLabel (字符串) - 要用于最终用户必须按下的按钮的文本才能安装强制更新。 默认为 "Continue"

    • mandatoryUpdateMessage (字符串) - 当更新指定为必需时,用作更新通知正文的文本。 默认为 "An update is available that must be installed."

    • optionalIgnoreButtonLabel (字符串) - 最终用户可以按下的按钮使用的文本,以忽略可用的可选更新。 默认为 "Ignore"

    • optionalInstallButtonLabel (字符串) - 最终用户可按按钮的文本安装可选更新。 默认为 "Install"

    • optionalUpdateMessage (字符串) - 当更新是可选的时用作更新通知正文的文本。 默认为 "An update is available. Would you like to install it?"

    • title (字符串) - 用作向最终用户显示的更新通知的标头的文本。 默认为 "Update available"

  • rollbackRetryOptions (RollbackRetryOptions) - 回滚重试机制允许应用程序尝试重新安装以前回滚的更新(选项中指定的限制)。 它是一个“options”对象,用于确定是否应进行回滚重试,如果是,则用于回滚重试的设置。 这默认为 null,这会影响禁用重试机制。 将此设置为任何真实值将启用具有默认设置的重试机制,并将对象传递给此参数允许启用回滚重试,并重写一个或多个默认值。

    以下列表表示可用选项及其默认值:

    • delayInHours (数字) - 指定应用在尝试重新安装同一回滚包之前,应用将在最新回滚后等待的最短时间(以小时为单位)。 不能小于 0。 可以是浮点数。 默认为 24

    • maxRetryAttempts (数字) - 指定应用在停止尝试之前可以进行的最大重试次数。 不能小于 1。 默认为 1

codePushStatusDidChange (事件挂钩)

当同步进程在整体更新过程中从一个阶段移动到另一个阶段时调用。 使用表示当前状态的状态代码调用事件挂钩,可以是任何 SyncStatus 值。

codePushDownloadDidProgress (事件挂钩)

从 CodePush 服务器下载可用更新时定期调用。 使用对象调用该方法,该对象包含以下两个 DownloadProgress 属性:

  • totalBytes (数字) - 此更新预期接收的总字节数(这是文件集的大小,从上一版本更改)。

  • receivedBytes (数字) - 到目前为止下载的字节数,可用于跟踪下载进度。

codePush.allowRestart

codePush.allowRestart(): void;

将发生 Reallows 编程重启,否则会因为之前调用 disallowRestart而被拒绝。 如果 disallowRestart 一开始从未调用过,则调用此方法会导致不执行任何操作。

如果 CodePush 更新当前处于挂起状态,该更新尝试重启应用(例如已使用 InstallMode.IMMEDIATE),但由于已调用而被阻止 disallowRestart ,则调用 allowRestart 将导致立即重启。 此重启允许尽快应用更新,而无需在关键工作流期间中断最终用户(例如载入过程)。

例如,如果在调用文档后出现disallowRestart上述disallowRestart三种方案之一,则调用allowRestart将触发立即重启。 但是,如果以下几点为 true,则调用 allowRestart 不会触发重启:

  1. 自上次调用以来 disallowRestart 未安装 CodePush 更新,因此,无论如何都无需重启。

  2. 当前有一个挂起的 CodePush 更新,但它是通过 InstallMode.ON_NEXT_RESTART安装的,因此不需要编程重启。

  3. 目前有一个挂起的 CodePush 更新,但它是通过安装的 InstallMode.ON_NEXT_RESUME ,并且应用尚未放入后台,因此无需以编程方式重启。

  4. 自上次disallowRestart被调用以来,没有发出任何restartApp电话。

此行为可确保除非在不允许的时间段内显式请求重启,否则不会触发 allowRestart 任何重启。 这样,与调用restartApp(true)类似,allowRestart除非前者仅在当前挂起的更新想要重启时触发重启,但前提是更新处于挂起状态,后者将重新启动。

有关如何使用此方法的示例,请参阅 disallowRestart

codePush.checkForUpdate

codePush.checkForUpdate(deploymentKey: String = null, handleBinaryVersionMismatchCallback: (update: RemotePackage) => void): Promise<RemotePackage>;

查询 CodePush 服务,查看配置的应用部署是否具有可用的更新。 默认情况下,它将使用 Info.plist 文件(iOS)或MainActivity.java文件(Android)中配置的部署密钥,但可以通过可选deploymentKey参数指定值来替代该密钥。 如果要将用户动态“重定向”到特定部署,例如允许通过复活日蛋或用户设置开关“提前访问”,这非常有用。

第二个可选参数 handleBinaryVersionMismatchCallback 是一个可选的回调函数,可用于在有任何二进制更新时通知用户。 例如,假设当前安装的二进制版本是带有标签(代码推送标签)v1 的 1.0.1。 稍后的本机代码在开发周期中已更改,二进制版本已更新为 1.0.2。 触发 codepush 更新检查时,我们将忽略二进制版本不匹配的更新(因为更新不是针对当前已安装应用的二进制版本)。 在这种情况下,已安装的应用(1.0.1)将忽略面向版本 1.0.2 的更新。 可用于 handleBinaryVersionMismatchCallback 提供挂钩来处理此类情况。

重要

如果要开发 iOS 应用程序,请谨慎使用此回调中的 警报,因为 App Store 审查过程:应用不得强制用户对应用进行评分、审阅应用、下载其他应用或其他类似的操作以访问功能、内容或使用应用。

此方法返回一个 Promise,它解析为两个可能值之一:

  1. null 如果没有可用的更新。 以下方案中可能会发生这种情况:

    1. 配置的部署不包含任何版本,因此,无需更新任何版本。
    2. 配置的部署中的最新版本面向的二进制版本不同于当前运行的二进制版本(较旧版本或较新版本)。
    3. 当前正在运行的应用已具有已配置部署的最新版本,因此不需要它。
    4. 配置部署中的最新版本当前标记为已禁用,因此不允许下载它。
    5. 配置部署中的最新版本处于“活动推出”状态,请求设备不属于符合其资格的用户的百分比。
  2. 一个 RemotePackage 实例,表示可以检查或更高版本的可用更新。

示例用法:

codePush.checkForUpdate()
.then((update) => {
    if (!update) {
        console.log("The app is up to date!");
    } else {
        console.log("An update is available! Should we download it?");
    }
});

codePush.disallowRestart

codePush.disallowRestart(): void;

由于以下任一方案,暂时禁止进行编程重启:

  1. 使用 安装 CodePush 更新 InstallMode.IMMEDIATE

  2. 使用 InstallMode.ON_NEXT_RESUME CodePush 更新安装,并且应用从后台恢复((可选)由 minimumBackgroundDuration 属性限制)

  3. 调用了该方法restartApp

    注意

    步骤 1 和 2 通过 restartApp 调用你有效,因此你可以考虑 disallowRestart 阻止任何调用 restartApp,无论你的应用是直接或间接调用它。

调用此方法后,仍允许对更新进行任何调用 sync 、下载并安装更新,但尝试重启应用将排队,直到 allowRestart 调用为止。 这样,就会捕获重启请求,并且只要希望允许它发生,就可以“刷新”。

这是一个高级 API,当应用中的各个组件(如载入过程)需要确保在其生存期内不会发生任何最终用户中断,同时继续允许应用以自己的速度与 CodePush 服务器保持同步并使用任何适当的安装模式时,这一点主要很有用。 这样可以让应用尽快发现和下载可用更新,同时在关键最终用户体验期间防止任何中断。

作为替代方法,还可以在调用sync时使用InstallMode.ON_NEXT_RESTART(绝不会尝试以编程方式重启应用),然后显式调用restartApp应用中“安全”的点执行此操作。 disallowRestart 当与 CodePush 服务器同步的代码与想要强制实施无重启策略的代码/组件分开时,提供此方法的替代方法。

示例用法:

class OnboardingProcess extends Component {
    ...

    componentWillMount() {
        // Ensure that any CodePush updates that are
        // synchronized in the background can't trigger
        // a restart while this component is mounted.
        codePush.disallowRestart();
    }

    componentWillUnmount() {
        // Reallow restarts, and optionally trigger
        // a restart if one was currently pending.
        codePush.allowRestart();
    }

    ...
}

codePush.getCurrentPackage

注意

自 CodePush 模块起,此方法被视为已弃用 v1.10.3-beta 。 如果运行的是此版本(或更新版本),建议改用 codePush.getUpdateMetadata ,因为它具有更可预测的行为。

codePush.getCurrentPackage(): Promise<LocalPackage>;

检索有关当前安装的“包”(如说明、安装时间)的元数据。 这对于应用更新后显示“新增功能?”对话框等方案非常有用,或者检查是否有等待通过恢复或重启应用挂起的更新。

此方法返回一个 Promise,它解析为两个可能值之一:

  1. null 如果应用当前正在从二进制文件而不是 CodePush 更新运行 JS 捆绑包,则为 。 这种情况发生在以下情况下:

    1. 最终用户安装了应用二进制文件,但尚未安装 CodePush 更新
    2. 最终用户安装了二进制文件的更新(例如,从存储中清除旧的 CodePush 更新),并优先返回二进制文件中的 JS 二进制文件。
  2. 一个 LocalPackage 实例,表示当前正在运行的 CodePush 更新的元数据。

示例用法:

codePush.getCurrentPackage()
.then((update) => {
    // If the current app "session" represents the first time
    // this update has run, and it had a description provided
    // with it upon release, let's show it to the end user
    if (update.isFirstRun && update.description) {
        // Display a "what's new?" modal
    }
});

codePush.getUpdateMetadata

codePush.getUpdateMetadata(updateState: UpdateState = UpdateState.RUNNING): Promise<LocalPackage>;

检索已安装更新(如说明,必需)的元数据,其状态与指定的 updateState 参数匹配。 这对于应用更新后显示“新增功能?”对话框等方案非常有用,或者检查是否有等待通过恢复或重启应用挂起的更新。 有关可能的更新状态及其表示内容的详细信息,请参阅 UpdateState 参考

此方法返回一个 Promise,它解析为两个可能值之一:

  1. null 如果具有指定状态的更新当前不存在, 这种情况发生在以下情况下:

    1. 最终用户尚未安装任何 CodePush 更新,这就是为什么没有任何元数据可用于任何更新,无论指定为 updateState 参数什么。

    2. 最终用户安装了二进制文件的更新(例如,从存储中清除旧的 CodePush 更新),并优先返回二进制文件中的 JS 二进制文件。 它将表现出与 #1 相同的行为

    3. 参数 updateState 设置为 UpdateState.RUNNING,但应用当前未运行 CodePush 更新。 可能存在挂起的更新,但应用尚未重启以使其处于活动状态。

    4. 参数 updateState 设置为 UpdateState.PENDING,但应用没有任何当前挂起的更新。

  2. 一个 LocalPackage 实例,表示当前请求的 CodePush 更新(正在运行或挂起)的元数据。

示例用法:

// Check if there's currently a CodePush update running, and if
// so, register it with the HockeyApp SDK (https://github.com/slowpath/react-native-hockeyapp)
// so that crash reports will correctly display the JS bundle version the user was running.
codePush.getUpdateMetadata().then((update) => {
    if (update) {
        hockeyApp.addMetadata({ CodePushRelease: update.label });
    }
});

// Check to see if there's still an update pending.
codePush.getUpdateMetadata(UpdateState.PENDING).then((update) => {
    if (update) {
        // There's a pending update, do we want to force a restart?
    }
});

codePush.notifyAppReady

codePush.notifyAppReady(): Promise<void>;

通知 CodePush 运行时,应将全新安装的更新视为成功,因此不需要自动客户端回滚。 必须在更新捆绑包的代码中调用此函数。 否则,当应用下次重启时,CodePush 运行时将假定已安装的更新失败并回滚到以前的版本。 存在此行为以帮助确保最终用户不会被损坏的更新阻止。

如果使用函数 sync ,并在应用启动时执行更新检查,则无需手动调用 notifyAppReady ,因为 sync 会为你调用它。 之所以存在此行为,是因为假设在应用中调用时 sync ,它表示成功启动的良好近似值。

注意

此方法也别名为 notifyApplicationReady (为了向后兼容)。

codePush.restartApp

codePush.restartApp(onlyIfUpdateIsPending: Boolean = false): void;

立即重启应用。 如果向参数提供 onlyIfUpdateIsPending 真实值,则仅当实际存在等待应用的挂起更新时,应用才会重启。

此方法适用于高级方案,在满足以下条件时主要有用:

  1. 应用正在指定安装模式值,或者在ON_NEXT_RESUME调用syncLocalPackage.install方法时指定安装模式值ON_NEXT_RESTART。 在应用重启(由最终用户或 OS)或恢复之前,此操作不会应用更新,因此不会立即向最终用户显示更新。

  2. 你有一个特定于应用的用户事件(如最终用户导航回应用的主页路由),该事件允许你以不显眼的方式应用更新,并可能比等待到下一次重启或恢复之前更快地将更新更新传递给最终用户。

codePush.sync

codePush.sync(options: Object, syncStatusChangeCallback: function(syncStatus: Number), downloadProgressCallback: function(progress: DownloadProgress), handleBinaryVersionMismatchCallback: function(update: RemotePackage)): Promise<Number>;

将应用的 JavaScript 捆绑包和映像资产与最新版本同步到配置的部署。 与 checkForUpdate 方法不同,该方法检查是否存在更新,让我们控制接下来要执行的操作,sync为你处理更新检查、下载和安装体验。

此方法支持两种不同的(但可自定义)“模式”,以轻松启用具有不同要求的应用:

  1. 无提示模式(默认行为)会自动下载可用的更新,并在应用下次重启时应用它们(例如 OS 或最终用户终止它,或设备重启)。 这样,整个更新体验对最终用户“无提示”,因为它们看不到任何更新提示或“合成”应用重启。

  2. 活动模式(当更新可用时),在下载更新之前提示最终用户获取权限,然后立即应用更新。 如果使用标志发布 mandatory 更新,最终用户仍会收到有关更新的通知,但他们不会选择忽略更新。

示例用法:

// Fully silent update that keeps the app in
// sync with the server, without ever
// interrupting the end user
codePush.sync();

// Active update, which lets the end user know
// about each update, and displays it to them
// immediately after downloading it
codePush.sync({ updateDialog: true, installMode: codePush.InstallMode.IMMEDIATE });

提示

如果要根据最终用户的设备电池电量、网络条件等决定是否检查或下载可用更新,请将调用包装在 sync 一个条件中,以确保仅在需要时调用它。

SyncOptions

sync虽然该方法尝试使用很少的配置轻松执行无提示和主动更新,但它接受一个“选项”对象,该对象允许你自定义上述默认行为的许多方面。 可用的选项与 CodePushOptions 相同,但选项除外 checkFrequency

示例用法:

// Use a different deployment key for this
// specific call, instead of the one configured
// in the Info.plist file
codePush.sync({ deploymentKey: "KEY" });

// Download the update silently, but install it on
// the next resume, as long as at least 5 minutes
// has passed since the app was put into the background.
codePush.sync({ installMode: codePush.InstallMode.ON_NEXT_RESUME, minimumBackgroundDuration: 60 * 5 });

// Download the update silently, and install optional updates
// on the next restart, but install mandatory updates on the next resume.
codePush.sync({ mandatoryInstallMode: codePush.InstallMode.ON_NEXT_RESUME });

// Changing the title displayed in the
// confirmation dialog of an "active" update
codePush.sync({ updateDialog: { title: "An update is available!" } });

// Displaying an update prompt which includes the
// description for the CodePush release
codePush.sync({
   updateDialog: {
    appendReleaseDescription: true,
    descriptionPrefix: "\n\nChange log:\n"
   },
   installMode: codePush.InstallMode.IMMEDIATE
});

// Shortening the retry delay and increasing
// the number of maximum retry attempts
// in comparison to defaults
codePush.sync({
   rollbackRetryOptions: {
    delayInHours: 8,
    maxRetryAttempts: 3
   }
});

除了这些选项, sync 该方法还接受多个可选函数参数,使你可以订阅“管道”的 sync 生命周期,根据需要显示其他 UI(例如“检查更新模式或下载进度模式):

  • syncStatusChangedCallback ((syncStatus: Number) => void) - 当同步进程从一个阶段移动到整个更新过程中的另一个阶段时调用。 该方法使用状态代码(表示当前状态)调用,可以是任何 SyncStatus 值。

  • downloadProgressCallback ((进度: DownloadProgress) => void) - 从 CodePush 服务器下载可用更新时定期调用。 使用对象调用该方法,该对象包含以下两个 DownloadProgress 属性:

    • totalBytes (数字) - 此更新预期接收的总字节数(这是文件集的大小,从上一版本更改)。

    • receivedBytes (数字) - 到目前为止下载的字节数,可用于跟踪下载进度。

  • handleBinaryVersionMismatchCallback (更新: RemotePackage) => void) - 当有可用的任何二进制更新时调用。 使用对象调用 RemotePackage 该方法。 有关更多详细信息, 请参阅 codePush.checkForUpdate 部分。

示例用法:

// Prompt the user when an update is available
// and then display a "downloading" modal
codePush.sync({ updateDialog: true },
  (status) => {
      switch (status) {
          case codePush.SyncStatus.DOWNLOADING_PACKAGE:
              // Show "downloading" modal
              break;
          case codePush.SyncStatus.INSTALLING_UPDATE:
              // Hide "downloading" modal
              break;
      }
  },
  ({ receivedBytes, totalBytes, }) => {
    /* Update download modal progress */
  }
);

此方法返回一个 Promise,该代码解析为指示 SyncStatus 调用成功的原因 sync 的代码。 此代码可以是以下 SyncStatus 值之一:

  • codePush.SyncStatus.UP_TO_DATE (4) - 应用与 CodePush 服务器最新。

  • codePush.SyncStatus.UPDATE_IGNORED (5) - 应用具有可选的更新,最终用户选择忽略该更新。 (这仅适用于使用时 updateDialog

  • codePush.SyncStatus.UPDATE_INSTALLED (6) - 更新已安装,将在函数返回或下次应用恢复/重启后syncStatusChangedCallback立即运行,具体取决于InstallMode中指定的SyncOptions内容。

  • codePush.SyncStatus.SYNC_IN_PROGRESS (7) - 正在运行的操作 sync 可防止执行当前调用。

sync可以在要检查更新的任何位置调用该方法。 这可能位于 componentWillMount 根组件的生命周期事件、组件的 onPress 处理程序 <TouchableHighlight> 、定期计时器的回调中,或者任何其他内容都适合你的需求。 checkForUpdate与该方法一样,它会执行网络请求来检查后台的更新,因此不会影响 UI 线程或 JavaScript 线程的响应能力。

包对象

checkForUpdategetUpdateMetadata方法返回Promise对象(解析后)提供对“包”对象的访问。 包表示代码更新和任何额外的元数据(如说明,必需?)。 CodePush API 区分以下类型的包:

  • LocalPackage:表示已下载的更新,该更新已运行或已安装,并且正在等待应用重启。

  • RemotePackage:表示尚未下载的 CodePush 服务器上的可用更新。

LocalPackage

包含有关本地下载或已安装的更新的详细信息。 可以通过调用模块级 getUpdateMetadata 方法或作为方法返回 RemotePackage.download 的 promise 值来获取对此对象的实例的引用。

属性
  • appVersion:此更新所依赖的应用二进制版本。 这是调用 CLI release 命令时通过appStoreVersion参数指定的值。 (字符串)
  • deploymentKey:用于最初下载此更新的部署密钥。 (字符串)
  • 说明:更新的说明。 这是发布更新时在 CLI 中指定的值。 (字符串)
  • failedInstall:指示是否已安装此更新,但是否已回滚。 此方法 sync 会自动忽略以前失败的更新,因此,仅当使用 checkForUpdate此属性时,才需要担心此属性。 (布尔)
  • isFirstRun:指示这是安装后首次运行更新。 这可用于确定是否要显示“新增功能?”安装更新后,最终用户的 UI。 (布尔)
  • isMandatory:指示更新是否被视为必需更新。 这是发布更新时在 CLI 中指定的值。 (布尔)
  • isPending:指示此更新是否处于“挂起”状态。 当 true,这意味着更新已下载并安装,但应用需要重启才能应用它尚未发生,这就是为什么其更改当前对最终用户不可见的原因。 (布尔)
  • label:CodePush 服务器自动为更新提供的内部标签,例如 v5。 此值唯一标识其部署中的更新。 (字符串)
  • packageHash:更新的 SHA 哈希值。 (字符串)
  • packageSize:更新中包含的代码的大小(以字节为单位)。 (数字)
方法
  • install(installMode: codePush.InstallMode = codePush.InstallMode.ON_NEXT_RESTART, minimumBackgroundDuration = 0): Promise<void>: 通过将更新保存到运行时期望找到最新版本的应用的磁盘上的位置来安装更新。 参数 installMode 控制何时向最终用户显示更改。 默认值是等待下一个应用重启以显示更改,但你可以参考 InstallMode 枚举引用来说明可用选项及其用途。 如果参数 installMode 设置为 InstallMode.ON_NEXT_RESUME该参数,则 minimumBackgroundDuration 参数允许你控制应用在恢复安装后必须处于后台的时间。

RemotePackage

包含有关可从 CodePush 服务器下载的更新的详细信息。 可以通过在更新可用时调用 checkForUpdate 方法来获取对此对象的实例的引用。 如果使用 sync API,则无需担心, RemotePackage因为它会自动处理下载和安装过程。

属性

继承 RemotePackage 与该 LocalPackage属性相同的所有属性,但包括一个附加属性:

  • downloadUrl:包可供下载的 URL。 此属性仅用于高级用法,因为 download 该方法会自动为你处理更新的获取。 (字符串)
方法
  • download(downloadProgressCallback?: 函数):Promise<LocalPackage>:从 CodePush 服务下载可用更新。 如果指定了 adownloadProgressCallback,则会使用报告下载进度的对象({ totalBytes: Number, receivedBytes: Number })定期DownloadProgress调用它,直到下载完成。 返回使用 .. 解析的 LocalPackagePromise。

枚举

CodePush API 包括以下枚举,可用于自定义更新体验:

InstallMode

此枚举指定何时希望实际应用已安装的更新,并且可以传递给 syncLocalPackage.install 方法。 它包含以下值:

  • codePush.InstallMode.IMMEDIATE (0) - 指示要安装更新并立即重启应用。 此值适用于调试方案以及向用户显示更新提示时的情况,因为它们希望在接受安装后立即看到更改。 此外,此模式可用于强制更新,因为它消除了更新安装与最终用户下次重启或恢复应用之间可能不需要的延迟。

  • codePush.InstallMode.ON_NEXT_RESTART (1) - 指示要安装更新,但不强行重启应用。 当应用“自然”重启(由于 OS 或最终用户终止应用),更新将无缝提取。 执行无提示更新时,此值很合适,因为如果应用突然从无处重启,它可能会对最终用户造成干扰。 他们不会意识到更新甚至已下载。 这是用于和syncLocalPackage.install方法的默认模式。

  • codePush.InstallMode.ON_NEXT_RESUME (2) - 指示要安装更新,但直到下一次最终用户从后台恢复它时,才希望重启应用。 这样,就不会中断其当前会话,但可以提前获取更新,而不是等待下一次自然重启。 此值适用于可在恢复时以非侵入性方式应用的无提示安装。

  • codePush.InstallMode.ON_NEXT_SUSPEND (3) - 指示你想要在后台安装更新,但仅在后台运行几秒钟(默认为 0),minimumBackgroundDuration以便用户上下文不会丢失,除非应用挂起足够长,否则不会丢失。

CheckFrequency

此枚举指定何时希望应用与服务器同步进行更新,并且可以传递到 codePushify 修饰器。 它包含以下值:

  • codePush.CheckFrequency.ON_APP_START (0) - 指示在启动应用进程时检查更新。

  • codePush.CheckFrequency.ON_APP_RESUME (1) - 指示每当应用在“后台”后返回前台时,你想要检查更新(用户按下主页按钮、应用启动单独的付款过程等)。

  • codePush.CheckFrequency.MANUAL (2) - 禁用自动检查更新,但仅在应用代码中调用时才 codePush.sync() 进行检查。

SyncStatus

此枚举提供给 syncStatusChangedCallback 可传递给方法的 sync 函数,以挂钩到整个更新过程。 它包含以下值:

  • codePush.SyncStatus.CHECKING_FOR_UPDATE (0) - 正在查询 CodePush 服务器以获取更新。
  • codePush.SyncStatus.AWAITING_USER_ACTION (1) - 更新可用,并向最终用户显示确认对话框。 (这仅适用于使用时 updateDialog
  • codePush.SyncStatus.DOWNLOADING_PACKAGE (2) - 正在从 CodePush 服务器下载可用更新。
  • codePush.SyncStatus.INSTALLING_UPDATE (3) - 已下载可用更新,即将安装。
  • codePush.SyncStatus.UP_TO_DATE (4) - 应用已配置部署完全最新。
  • codePush.SyncStatus.UPDATE_IGNORED (5) - 应用具有可选的更新,最终用户选择忽略该更新。 (这仅适用于使用时 updateDialog
  • codePush.SyncStatus.UPDATE_INSTALLED (6) - 已安装可用的更新,将在函数返回或下次应用恢复/重启后syncStatusChangedCallback立即运行,具体取决于InstallMode指定的SyncOptions更新。
  • codePush.SyncStatus.SYNC_IN_PROGRESS (7) - 存在一个正在进行的sync操作,可防止执行当前调用。
  • codePush.SyncStatus.UNKNOWN_ERROR (-1) - 同步操作发现未知错误。

UpdateState

此枚举指定更新当前处于状态,并且可以在调用 getUpdateMetadata 该方法时指定。 它包含以下值:

  • codePush.UpdateState.RUNNING (0) - 指示更新表示当前正在运行的应用的版本。 对于在“新增功能?”对话框中显示发布说明或向分析或崩溃报告服务报告最新版本等方案,这可用于识别有关应用的属性。

  • codePush.UpdateState.PENDING (1) - 指示已安装更新,但尚未重启应用。 这可用于确定是否存在挂起的更新,可能需要强制应用编程重启(通过 restartApp) 应用。

  • codePush.UpdateState.LATEST (2) - 指示更新表示最新可用版本,并且可以当前正在运行或挂起。

Objective-C API 参考 (iOS)

Objective-C API 是通过将CodePush.h标头导入 AppDelegate.m 文件中提供的,并且由一个名为 CodePush 的公共类组成。

CodePush

包含用于检索NSURL表示最新 JavaScript 捆绑文件的静态方法,并且可以在 RCTRootViewAppDelegate.m 文件中启动应用时传递给 's initWithBundleURL 方法。

CodePush可以将类的方法视为复合解析程序,该解析程序始终加载适当的捆绑包,以适应以下方案:

  1. 当最终用户从应用商店(如 1.0.0)安装应用时,他们将获取二进制文件中包含的 JS 捆绑包。 这是你在不使用 CodePush 的情况下获得的行为,但我们确保它不会中断:)

  2. 开始发布 CodePush 更新后,最终用户将获取表示配置部署的最新版本的 JS 捆绑包。 这是一种行为,使你能够循环访问你寄送到商店的内容。

  3. 一旦向应用商店(如 1.1.0)发布更新,最终用户就会更新它,他们就会再次获取二进制文件中包含的 JS 捆绑包。 此行为可确保不使用面向以前二进制版本的 CodePush 更新(因为我们不知道它们会正常工作),最终用户始终具有应用的工作版本。

  4. 重复 #2 和 #3,因为 CodePush 版本和应用商店版本继续进入无穷大(及更高版本?)

由于此行为,你可以根据需要安全地将更新部署到应用商店和 CodePush,并放心最终用户将始终获得最新版本。

方法

  • (NSURL *)bundleURL - 返回如上所述的最新 JS 捆绑包 NSURL 。 此方法假定应用二进制文件中包含的 JS 捆绑包的名称为 main.jsbundle

  • (NSURL *)bundleURLForResource:(NSString *)resourceName - 等效于 bundleURL 该方法,但也允许自定义在应用二进制文件中搜索的 JS 捆绑包的名称。 如果不命名此文件 main (这是默认约定),这非常有用。 此方法假定 JS 捆绑包的扩展为 *.jsbundle.

  • (NSURL *)bundleURLForResource:(NSString *)resourceName withExtension:(NSString *)resourceExtension:等效 bundleURLForResource: 于该方法,但也允许自定义在应用二进制文件中搜索的 JS 捆绑包使用的扩展。 如果不命名此文件 *.jsbundle (这是默认约定),这非常有用。

  • (void)overrideAppVersion:(NSString *)appVersionOverride - 设置应用程序的二进制接口版本,否则将默认为 Info.plist 中指定的 App Store 版本CFBundleShortVersionString。 这应该在加载捆绑 URL 之前调用一次。

  • (void)setDeploymentKey:(NSString *)deploymentKey - 设置应用在查询更新时应使用的部署密钥。 这是在 Info.plist设置部署密钥或在 JS 中指定部署密钥时或调用checkForUpdatesync时指定部署密钥的动态替代方法。

Java API 参考 (Android)

用于 React Native 0.60 及更高版本的 API

由于 autolinking 用于 react-native.config.js 链接插件,构造函数在该文件中指定。 但是,可以通过将这些值放在字符串资源中来替代自定义变量来管理 CodePush 插件。

  • 公钥 - 用于代码签名功能中的捆绑验证。 有关代码签名功能的更多详细信息,请参阅“代码签名”部分。 若要设置公钥,应使用名称CodePushPublicKey将公钥strings.xml的内容添加到其中。 CodePush 会自动获取此属性并启用代码签名功能。 例如:

    <string moduleConfig="true" name="CodePushPublicKey">your-public-key</string>
    
  • 服务器 URL - 用于指定 CodePush 服务器 URL。 默认值:“https://codepush.appcenter.ms/"通过向名称CodePushServerUrl添加路径strings.xml来重写 < a0/>。 CodePush 会自动获取此属性,并将使用此路径发送请求。 例如:

    <string moduleConfig="true" name="CodePushServerUrl">https://yourcodepush.server.com</string>
    

API for React Native 低于 0.60

Java API 通过将类导入com.microsoft.codepush.react.CodePush到MainActivity.java文件中提供,并且由一个名为 的公共类CodePush组成。

CodePush

构造 CodePush 客户端运行时,并表示 ReactPackage 添加到应用包列表的实例。

构造函数

  • CodePush(String deploymentKey, Activity mainActivity) - 创建 CodePush 运行时的新实例,用于通过提供的部署密钥查询服务以获取更新。 在mainActivity类中MainActivity配置 React 包列表时,应始终将this参数设置为该参数。 此构造函数将 CodePush 运行时置于“发布模式”,因此,如果要启用调试行为,请改用以下构造函数。

  • CodePush(String deploymentKey, Activity mainActivity, bool isDebugMode) - 等效于上一个构造函数,但允许指定是否希望 CodePush 运行时处于调试模式。 使用此构造函数时, isDebugMode 应始终将参数设置为 BuildConfig.DEBUG 与生成类型保持同步。 将 CodePush 置于调试模式时,将启用以下行为:

    1. 每当将新的二进制文件部署到模拟器/设备时,旧 CodePush 更新不会从存储中删除。 此行为使你能够部署新的二进制文件,而无需在开发过程中颠簸版本,并且每次应用调用 sync时都不会持续获得相同的更新。

    2. 每当安装 CodePush 更新时,React Native 运行时在调试模式下维护的本地缓存将被删除。 这可确保在应用更新后重启应用时,可以看到预期的更改。 合并此 PR,我们不再需要执行此操作。

  • CodePush(String deploymentKey, Context context, boolean isDebugMode, Integer publicKeyResourceDescriptor) - 等效于上一个构造函数,但允许指定读取公钥内容所需的公钥资源描述符。 有关代码签名功能的更多详细信息,请参阅“代码签名”部分。

  • CodePush(String deploymentKey, Context context, boolean isDebugMode, String serverUrl) - 构造函数允许指定 CodePush 服务器 URL。 默认值: "https://codepush.appcenter.ms/" 由中指定的 serverUrl值重写。

静态方法

  • getBundleUrl() - 返回应用 JS 捆绑文件的最新版本的路径,假定资源名称为 index.android.bundle。 如果应用使用不同的捆绑名称,请使用此方法的重载版本,允许指定它。 此方法的分辨率行为与上述 Objective-C 等效项相同。

  • getBundleUrl(String bundleName) - 使用指定的资源名称(如 index.android.bundle)返回应用 JS 捆绑文件最新版本的路径。 此方法的分辨率行为与上述 Objective-C 等效项相同。

  • overrideAppVersion(String appVersionOverride) - 设置应用程序的二进制接口版本,否则将默认为 build.gradle 中指定的 Play Store 版本versionName。 在构造 CodePush 实例之前,应调用一次此操作。