React Native客户端 SDK
此插件为 CodePush 服务提供客户端集成,让你可以轻松地将动态更新体验添加到 React Native 应用 () 。
它是如何工作的?
React Native应用由 JavaScript 文件和任何关联的图像组成,这些图像由打包器捆绑在一起,并作为特定于平台的二进制文件的一部分分发 (.ipa 或 .apk 文件) 。 发布应用时,更新 JavaScript 代码 ((例如进行 bug 修复、添加新功能) 或映像资产)需要重新编译和重新分发整个二进制文件,其中包括要发布到的商店的任何审阅时间。
CodePush 插件通过使 JavaScript 和映像与向 CodePush 服务器发布的更新保持同步,帮助立即在最终用户的前面获得产品改进。 这样,应用就会获得脱机移动体验的好处,以及边加载更新的"类似 Web"灵活性(一旦可用)。
为了确保最终用户始终拥有正常运行的应用版本,CodePush 插件会维护上一个更新的副本,以便如果意外推送包含崩溃的更新,它可自动回滚。 这样,可以放心,新的发布灵活性不会让用户在有机会在服务器上回滚 之前被阻止 。
备注
任何涉及本机代码的产品更改 (例如修改 AppDelegate.m / MainActivity.java 文件、添加新插件) 无法通过 CodePush 分发等)必须通过相应的 () 存储进行更新。
支持React Native平台
- 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+ (RN 针对 Android 工具的升级版本) |
| v0.59 | v5.6+ (RN 重构的 js 捆绑加载程序代码) |
| v0.60-v0.61 | v6.0+ (RN 迁移到自动链接) |
我们努力响应新的React Native版本,但它们偶尔会破坏我们。 我们将在每个新版本中更新此React Native,以便用户可以查看我们的官方支持是什么。
支持的组件
使用 React Native 资产系统 (如使用语法) 时,以下列表表示支持通过 CodePush 更新其引用图像和视频的核心组件 (和属性 require("./foo.png")) :
| 组件 | 属性 (属性) |
|---|---|
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" }) :
| 组件 | 属性 (属性) |
|---|---|
SliderIOS |
maximumTrackImage, minimumTrackImage, thumbImage, trackImage |
Video |
source |
在发布支持引用资产的新核心组件时,我们将更新此列表,以确保用户使用 CodePush 准确了解其预期更新内容。
备注
在源属性中使用 时,CodePush 仅适用于 require 视频组件。例如:
<Video source={require("./foo.mp4")} />
Store 准则符合性
尽管 Google Play 和内部分布式应用 (例如 Enterprise、Fabric、App Center) 对如何使用 CodePush 发布更新没有限制,但 iOS App Store 及其相应的准则具有在将解决方案集成到应用程序中之前应注意的更精确的规则。
Apple开发人员计划许可协议(在第 3.3.2 段)下完全允许对 JavaScript 和资产进行空-空更新 - 并且在其最新版本中 (20210607) 可在此处下载此许可范围更广:
解释的代码可以下载到应用程序,但只要此类代码: () 不会通过提供与提交到 App Store 的应用程序预期用途和播发目的不一致的功能来更改应用程序的主要用途, (b) 不会为其他代码或应用程序创建应用商店或店面, (c) 不会绕过 OS 的签名、沙盒或其他安全功能。
使用 CodePush 可以完全遵循这些规则,只要推送的更新不会明显偏离产品的原始App Store意向。
为了进一步遵守 Apple 的准则,我们建议App Store分布式应用在调用 时不启用 该选项,因为 App Store 评审指南中已编写 updateDialog sync :
应用不得强制用户对应用进行评分、查看应用、下载其他应用或其他类似操作,以访问应用的功能、内容或使用。
这不一定是 这种情况,因为它不会强制用户下载新版本,但如果你决定显示新版本,至少你应该了解 updateDialog 该内容。
示例应用/初学者
社区React Native创建了一些出色的开源应用,这些应用可以作为入门开发人员的示例。 以下列表列出了 OSS React Native也使用 CodePush 的应用,可用于查看其他人如何使用服务:
- F8 应用 - F8 2016 的官方会议应用。
- Feline for Product Hunt - 适用于产品搜寻的 Android 客户端。
- GeoEncoding - Lynx IT Digital 提供的应用,演示如何使用大量React Native组件和模块。
- 数学事实 - 由 Academy 提供的应用,可帮助你更轻松地记住数学事实。
此外,如果希望开始使用 React Native + CodePush,并且正在寻找出色的初学者工具包,应查看以下内容:
持续集成/交付
除了使用 CodePush CLI"手动"发布更新外,我们认为,必须创建可重复且可持续的解决方案,以持续向应用交付更新。 这样一来,你或你的团队就足以创建和维护敏捷部署的节奏。 若要帮助设置基于 CodePush 的 CD 管道,请参阅以下与各种 CI 服务器的集成:
- Azure DevOps - Azure DevOps (以前称为 VSTS) 还具有用于发布到App Center和Google Play应用商店的扩展,因此它通常提供相当出色的移动 CD 解决方案。
- Travis CI
此外,如果想详细了解完整的移动 CI/CD 工作流(包括 CodePush)的外观,请查看ZeeMee工程团队的这篇出色的文章。
TypeScript 消耗
此模块将文件作为 NPM 包的一部分提供,允许你访问它,在支持编辑器 (例如 Visual Studio Code) 中接收 *.d.ts intellisense,以及检查是否正在使用 TypeScript 的编译时 import 类型检查。 大多数情况下,此行为应该开箱即用,但如果在文件中将 指定为 或 编译器选项的值,请确保还将 选项设置为 es6 target module tsconfig.json moduleResolution node 。 这可确保 TypeScript 编译器在 中 node_modules 查找导入模块的类型定义。 否则,在尝试导入模块时,你收到如下 react-native-code-push 错误 error TS2307: Cannot find module 'react-native-code-push' :。