React Native Client SDK
重要
Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但有几种建议的替代方法可以考虑迁移到其中。
此插件为 CodePush 服务提供客户端集成,使你可以轻松地向 React Native 应用添加动态更新体验。
工作原理
React Native 应用由 JavaScript 文件和任何关联的映像组成,这些映像由打包程序捆绑在一起,并作为特定于平台的二进制文件(或.ipa
.apk
文件的一部分)分发。 发布应用时,更新 JavaScript 代码(例如进行 bug 修复、添加新功能)或映像资产,需要重新编译和重新分发整个二进制文件,其中包括要发布到的存储区的任何评审时间。
CodePush 插件通过使 JavaScript 和图像与发布到 CodePush 服务器的更新保持同步,从而在最终用户面前立即获得产品改进。 这样,你的应用就会获得脱机移动体验的好处,以及一旦提供旁加载更新的“类似于 Web”的敏捷性。
为了确保最终用户始终具有正常运行的应用版本,CodePush 插件将维护以前的更新的副本,以便在意外推送包含崩溃的更新时,它可以自动回滚。 这样,你可以放心,新的发布敏捷性不会导致用户在有机会回滚服务器之前被阻止。
注意
任何触摸本机代码(例如修改 AppDelegate.m/MainActivity.java 文件、添加新插件)的任何产品更改都不能通过 CodePush 分发,因此,必须通过相应的商店更新。
支持的 React 本机平台
- iOS (7+)
- Android (5.0+)
- Windows (UWP)
我们尽力保持插件与早期版本的 React Native 的向后兼容性,但由于平台的性质以及版本之间存在中断性变更,可能需要使用 CodePush 插件的特定版本来支持所使用的 React Native 的确切版本。 下表概述了哪些 CodePush 插件版本正式支持相应的 React Native 版本:
React Native 版本 | 支持 CodePush 版本 |
---|---|
<0.14 | 不支持 |
v0.14 | v1.3 (引入了 Android 支持) |
v0.15-v0.18 | v1.4-v1.6 (引入了 iOS 资产支持) |
v0.19-v0.28 | v1.7-v1.17 (引入了 Android 资产支持) |
v0.29-v0.30 | v1.13-v1.17 (RN 重构的本机托管代码) |
v0.31-v0.33 | v1.14.6-v1.17 (RN 重构的本机托管代码) |
v0.34-v0.35 | v1.15-v1.17 (RN 重构的本机托管代码) |
v0.36-v0.39 | v1.16-v1.17 (RN 重构的恢复处理程序) |
v0.40-v0.42 | v1.17 (RN 重构的 iOS 头文件) |
v0.43-v0.44 | v2.0+ (RN 重构的 uimanager 依赖项) |
v0.45 | v3.0+ (RN 重构的实例管理器代码) |
v0.46 | v4.0+ (RN 重构的 js 捆绑加载程序代码) |
v0.46-v0.53 | v5.1+ (RN 删除了 JS 模块未使用的注册) |
v0.54-v0.55 | v5.3+ (Android Gradle 插件 3.x 集成) |
v0.56-v0.58 | v5.4+ (适用于 Android 工具的 RN 升级版本) |
v0.59 | v5.6+ (RN 重构的 js 捆绑加载程序代码) |
v0.60-v0.61 | v6.0+ (已迁移到自动链接的 RN) |
我们努力响应新的 React Native 版本,但它们偶尔会破坏我们。 我们将使用每个 React Native 版本更新此图表,以便用户可以检查官方支持是什么。
支持的组件
使用 React Native 资产系统(如使用 require("./foo.png")
语法),以下列表表示支持通过 CodePush 更新其引用的图像和视频的核心组件(和属性)集:
组件 | Prop(s) |
---|---|
Image |
source |
MapView.Marker (需要 react-native-maps >=O.3.2 ) |
image |
ProgressViewIOS |
progressImage , trackImage |
TabBarIOS.Item |
icon , selectedIcon |
ToolbarAndroid (React Native 0.21.0+) |
actions[].icon 、 logo 、、 overflowIcon |
Video |
source |
以下列表表示当前不支持通过 CodePush 更新其资产的组件(和属性)集,因为它们依赖于静态图像和视频(如使用 { uri: "foo" }
语法):
组件 | Prop(s) |
---|---|
SliderIOS |
maximumTrackImage 、、minimumTrackImage thumbImage 、、trackImage |
Video |
source |
我们将更新此列表,因为发布新的核心组件(支持引用资产),以确保用户知道他们期望使用 CodePush 进行更新的具体内容。
注意
在源属性中使用 require
时,CodePush 仅适用于视频组件。例如:
<Video source={require("./foo.mp4")} />
应用商店准则符合性
虽然 Google Play 和内部分发的应用(例如 Enterprise、Fabric、App Center)对如何使用 CodePush 发布更新没有限制,但 iOS App Store 及其相应的准则在集成应用程序内解决方案之前应注意的更精确的规则。
Apple 开发者计划许可协议(第 3.3.2 段)完全允许对 JavaScript 和资产进行无线更新,在其最新版本(20210607)中可在此处下载,此裁决更为广泛:
解释的代码可以下载到应用程序,但只要此类代码:(a)不会通过提供与提交到 App Store 的应用程序的预期和播发用途不一致的特性或功能来更改应用程序的主要用途,(b) 不会为其他代码或应用程序创建商店或店面, 和 (c) 不会绕过 OS 的签名、沙盒或其他安全功能。
只要推送的更新不会显著偏离产品的原始 App Store 批准的意向,CodePush 就可以完全合规地遵循这些规则。
为了进一步遵守 Apple 的准则,我们建议 App Store 分布式应用在调用sync
时不启用updateDialog
该选项,因为在 App Store 审查指南中,它编写如下:
应用不得强制用户对应用进行评分、查看应用、下载其他应用或访问功能、内容或使用的其他类似操作。
这不一定是这种情况 updateDialog
,因为它不会强制用户下载新版本,但至少如果你决定显示它,你应该知道该裁决。
示例应用/初学者
React Native 社区已亲切地创建了一些出色的开源应用,这些应用可以作为开发人员入门的示例。 以下列表是同时使用 CodePush 的 OSS React Native 应用,可用于查看其他人如何使用该服务:
- F8 应用 - F8 2016 的官方会议应用。
- Feline for Product Hunt - Product Hunt 的 Android 客户端。
- GeoEncoding - Lynx IT Digital 的应用,演示如何使用许多 React Native 组件和模块。
- 数学事实 - 汗学院的应用,可帮助更轻松地记住数学事实。
此外,如果你希望开始使用 React Native + CodePush,并且正在寻找一个出色的初学者工具包,则应查看以下内容:
持续集成/交付
除了使用 CodePush CLI 来“手动”发布更新之外,我们相信,请务必创建一个可重复且可持续的解决方案,以便持续向应用传递更新。 这样,你或你的团队就可以轻松创建和维护敏捷部署的节奏。 若要帮助设置基于 CodePush 的 CD 管道,请参阅以下与各种 CI 服务器的集成:
- Azure DevOps - Azure DevOps(以前称为 VSTS)还具有发布到 App Center 和 Google Play 商店的扩展,因此它通常提供一个相当出色的移动 CD 解决方案。
- Travis CI
TypeScript 消耗
此模块将其 *.d.ts
文件作为 NPM 包的一部分提供,该包允许你 import
访问它,并在支持编辑器(如 Visual Studio Code)中接收 Intellisense,以及编译时类型检查(如果你使用的是 TypeScript)。 在大多数情况下,此行为应该开箱即用,但是,如果已指定es6
为文件中的target
或module
编译器选项tsconfig.json
的值,请确保也已将moduleResolution
选项设置为 node
。 这可确保 TypeScript 编译器在导入模块的类型定义中 node_modules
查找。 否则,尝试导入react-native-code-push
模块时会出现如下错误: error TS2307: Cannot find module 'react-native-code-push'