@bravemobile/ react-native-code-push (英语)
没有更新服务器的代码Push
- 没有需要 API 服务器 – 使用静态托管解决方案(如AWS S3)而无需维护额外的API服务器.
- 熟悉的 API - 盖上
microsoft/react-native-code-push,随着本地模块迁移到涡轮摩多尔. - 灵活部署 – 执行自己的发布工作流程,让您完全控制部署过程.
- Diff 更新 - 出版 二进制补丁和资产 diff 发布 所以一个客户端下载了与它已经持有的区别,而不是整个捆绑.
新架构支持
支持回放土著0.77~0.86.
[注] 如果您正在使用 React 原住民 0. 76 或 更低, 请使用版本
12.0.2这个图书馆.
[大
13.0.0将本地模块迁移到 TurboModule 。 A 类13.0.0二进制只运行 OTA 捆绑13.0.0或以后,所以在升级时,将一个新的二进制版本装入并开始其释放历史新鲜.
(测试了反应原生CLI模板应用)
所需经费
- 原生反应: 0.77或以上
- iOS系统: 15.5以上
- 机器人: API 16级或以上
移徙指南
如果您已经使用 react-native-code-push首先替换国家防范机制一揽子计划.
npm remove react-native-code-push
npm install @bravemobile/react-native-code-push
-
编辑
android/app/build.gradle要删除的文件apply from: "../../node_modules/..../codepush.gradle"线条. -
下列改动是可选的,但建议清理旧配置:
- 由于部署密钥不再使用,建议从您手中移除
Info.plist, (中文(简体) ),strings.xml,或JavaScript代码. - 由于自动链接,您可以删除
react-native-code-push模块设置settings.gradle。 。 。 .
- 由于部署密钥不再使用,建议从您手中移除
-
遵循安装指南从 '4. "代码Push -fy"你的应用程序。 。 。 .
* 安装
1. 安装国家预防机制一揽子计划
npm install @bravemobile/react-native-code-push
2. 运行内置命令
对于回放原生的 CLI 项目,您可以使用自动设置命令来配置您的项目用于 CodePush .
此命令将自动编辑您的 AppDelegate 财务报告和审定财务报表 MainApplication 用于整合 CodePush 的文件.
npx code-push init
要导出嵌入的 JS 捆绑 diff 更新发布,使用时 npx code-push init --diff-updates。 。 。 .
运行以下命令以安装 iOS 的 CocoaPods 依赖性 :
cd ios && pod install && cd ..
(或 npx pod-install, (中文(简体) ), bundle exec pod install --project-directory=./ios,) (中文(简体) )
2-1. 人工设置
如果您更喜欢手动设置,或者自动配置失败,可以在下面遵循手动设置指令.
点击可查看手动设置指令 .
iOS 手册设置
(1) 安装可可属地
运行 cd ios && pod install && cd ..
(单位:千美元)npx pod-install, (中文(简体) ), bundle exec pod install --project-directory=./ios,) (中文(简体) )
Cock 编译从 C 来源安装 二进制补丁更新的应用程序 携带,所以没有别的东西可以安装: 可可花与其余的一起建造 在舱.
(2) 编辑 AppDelegate 代码
如果你有的话 AppDelegate.swift (
如果您的项目没有桥接头, 请创建文件 .
- 用 Xcode 打开您的项目( 例如 CodePush DemoApp. xcworkspace)
- 文件 ~ 新建 ~ 从模板取出文件
- 选择“ Objective-C 文件” 并点击“ Next” 并任意写入名称 .
- 然后,Xcode会要求您创建一个连接头文件. 点击“ 创造 ” .
- 删除第3步中创建的文件 .
将以下行添加到连接头文件 。 (例如:. CodePushDemoApp-Bridging-Header.h(中文(简体) )
+ #import <CodePush/CodePush.h>
然后编辑 AppDelegate.swift 就像下面一样.
@main
class AppDelegate: RCTAppDelegate {
override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
// ...
override func bundleURL() -> URL? {
#if DEBUG
RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
#else
- Bundle.main.url(forResource: "main", withExtension: "jsbundle")
+ CodePush.bundleURL()
#endif
}
}
或者,如果你已经 AppDelegate.mm
+ #import <CodePush/CodePush.h>
// ...
- (NSURL *)bundleURL
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
#else
- return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
+ return [CodePush bundleURL];
#endif
}
@end
Android 手动设置
编辑 MainApplication 代码
(RN 0.82+) (韩语). 如果你有的话 MainApplication.kt
+ import com.microsoft.codepush.react.CodePush
class MainApplication : Application(), ReactApplication {
override val reactHost: ReactHost by lazy {
getDefaultReactHost(
context = applicationContext,
packageList =
PackageList(this).packages.apply {
// Packages that cannot be autolinked yet can be added manually here, for example:
// add(MyReactNativePackage())
},
+ jsBundleFilePath = CodePush.getJSBundleFile(),
)
}
// ...
}
(RN 0.73+) (韩语). 如果你有的话 MainApplication.kt
+ import com.microsoft.codepush.react.CodePush
class MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost =
object : DefaultReactNativeHost(this) {
// ...
+ override fun getJSBundleFile(): String = CodePush.getJSBundleFile()
}
// ...
}
或者,如果你已经 MainApplication.java
// ...
+ import com.microsoft.codepush.react.CodePush
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost =
new DefaultReactNativeHost(this) {
// ...
+ @Override
+ override fun getJSBundleFile(): String {
+ return CodePush.getJSBundleFile()
+ }
};
// ...
}
3. 展览设置
对于Expo项目,可以使用自动配置插件来代替手动设置.
将插件添加到您的 Expo 配置 :
// app.config.js
export default {
expo: {
plugins: ["@bravemobile/react-native-code-push"],
},
};
运行预建应用更改 :
npx expo prebuild
要导出嵌入的 JS 捆绑 diff 更新发布,将代码Push插件条目替换为 ["@bravemobile/react-native-code-push", { "diffUpdates": true }]。该选项默认已禁用.
[注] 该插件自动处理所有本土iOS和Android代码修改. 不需要手动编辑 AppDelegate, MainApplication, 或 gradle 文件.
所需资源 曝光 SDK: 50.0.0或以上
4. "代码Push-fy" 您的应用程序
您的应用软件的根组件应该用更高级的组件包裹.
您还应通过配置选项,包括执行 releaseHistoryFetcher 函数.
此函数用于在 ReleaseHistoryInterface 数据.
要启用此功能, 您需要使用 CLI 工具创建发布历史并上传到远程 . (以下步骤更能解释CLI
在运行时,库会获取这些信息来保持应用程序的更新.
import CodePush, {
ReleaseHistoryInterface,
UpdateCheckRequest,
} from "@bravemobile/react-native-code-push";
// ... MyApp Component
async function releaseHistoryFetcher(
updateRequest: UpdateCheckRequest,
): Promise<ReleaseHistoryInterface> {
// Fetch release history for current binary app version.
// You can implement how to fetch the release history freely. (Refer to the example app if you need a guide)
const {data: releaseHistory} = await axios.get<ReleaseHistoryInterface>(
`https://your.cdn.com/histories/${platform}/${identifier}/${updateRequest.app_version}.json`,
);
return releaseHistory;
}
export default CodePush({
checkFrequency: CodePush.CheckFrequency.MANUAL, // or something else
releaseHistoryFetcher: releaseHistoryFetcher,
})(MyApp);
[注] 获取发布历史的 URL 应当指向 CLI 工具生成的资源位置 .
4-1. 遥测回调
CodePushOptions 使用可选择的回调来报告更新时所做的
下载,无论是运行还是被翻回,以及它来自哪个档案. 他们是
纯为观察.
见 遥测回调 每个人的所得 和如何 登记他们.
5. 配置CLI工具
[TIP] 比较详细和实用的例子是:
CodePushDemoApp内example目录 。 (链接(中文(简体) )
(1) 创建一个 code-push.config.ts 在您的工程根目录中的文件.
然后,执行三个功能上传捆绑文件并创建/更新发布历史,
加上一个可选的第四 bundleDownloader - 如果你发表 资产 diff 档案。 。 。 .
CLI工具使用这些功能发布CodePush更新并管理发布.
(这些功能不是由库运行时使用. )
您可以复制并粘贴以下代码,并根据需要修改.
import {
CliConfigInterface,
ReleaseHistoryInterface,
} from "@bravemobile/react-native-code-push";
const Config: CliConfigInterface = {
bundleUploader: async (
source: string,
platform: "ios" | "android",
identifier,
artifact,
): Promise<{downloadUrl: string}> => {
// ...
},
getReleaseHistory: async (
targetBinaryVersion: string,
platform: "ios" | "android",
identifier,
): Promise<ReleaseHistoryInterface> => {
// ...
},
setReleaseHistory: async (
targetBinaryVersion: string,
jsonFilePath: string,
releaseInfo: ReleaseHistoryInterface,
platform: "ios" | "android",
identifier,
): Promise<void> => {
// ...
},
// Only needed to publish asset diff archives (see "4-2. Asset Diff Archives").
// bundleDownloader: async (
// archive,
// platform: "ios" | "android",
// identifier,
// ): Promise<{downloadedFilePath: string}> => {
// // ...
// },
};
module.exports = Config;
bundleUploader
- 执行上传捆绑文件的功能.
- 可选
artifact参数识别完整捆绑、 二进制补丁或资产 diff 存档 。 这个release命令总是提供,包括目标二进制版本和 用于构建存储密钥而无需解析文件名的软件包散列 . - 这个
downloadUrl返回此函数的记录ReleaseHistoryInterface数据 并被库运行时间从此 URL 下载捆绑文件 . - 用于下列情况:
- 创建新的代码Push 更新
release命令.
- 创建新的代码Push 更新
getReleaseHistory
- 通过获取JSON文件或调用API来获取特定二进制应用程序的发布历史.
- 用于下列情况:
- 用 . 打印发行历史
show-history命令. - 装入当前发布历史
release命令. - 获取发布历史以修改其中的信息
update-history命令.
- 用 . 打印发行历史
(类似于 releaseHistoryFetcher 函数在库运行时选项中。 )
setReleaseHistory
- 上传位于
jsonFilePath或使用releaseInfo元数据. - 如果使用 JSON 文件, 应允许修改现有文件. (建议填写文件。 )
- 用于下列情况:
- 为新二进制构建创建新发行记录
create-history命令. - 将新记录添加到已有的发行历史中
release命令. - 使用
update-history命令.
- 为新二进制构建创建新发行记录
(2) A类 code-push.config.ts (TypeScript)文件需要安装加载器.
安装 tsx,无需进一步设置:
npm install --save-dev tsx
ts-node 也继续工作,用于 tsx 未安装。 请注意: ts-node 没有
更长久地维持,所以支持 已贬值,今后将取消
版本 - 请迁移到 tsx在此之前, ts-node 需要满足以下条件: tsconfig.json
设置 :
{
"extends": "@react-native/typescript-config/tsconfig.json",
// ...
"include": [
// ...
+ "code-push.config.ts"
],
+ "ts-node": {
+ "compilerOptions": {
+ "module": "CommonJS",
+ "types": ["node"]
+ }
+ }
}
A 类 code-push.config.js (JavaScript)文件不需要.
6. Diff更新(可选)
取代完整的档案,释放可以提供对照联署材料计算的二进制补丁
装入应用程序二进制 搭载个人的释放也可以搭载资产 diff, for a
客户端运行一个最近更新的发布被忽略 。 两人都需要一个建筑
复制你商店里JS捆绑的钩子
bundleDownloader 内 code-push.config.ts。 。 。 .
见 Diff 更新 钩子 每个二进制版本要保存什么 客户端如何选择存档 .
使用 CLI 工具
[TIP] 你用得着
--help命令以查看可用的命令和选项.
(尚未支持交互模式)
图标
create-history
为特定的二进制应用版本创建新的发布历史.
- 当您向应用程序商店发布新的二进制应用程序时使用此命令 . 这确保了库运行时间将二进制应用程序确认为最新版本,并确定没有为它提供代码Push更新.
示例
- 为二进制应用程序版本创建新发布历史
1.0.0。 。 。 .
npx code-push create-history --binary-version 1.0.0 --platform ios --identifier staging
show-history
显示特定二进制应用程序版本的发布历史 .
示例
- 显示二进制应用程序版本的发布历史
1.0.0。 。 。 .
npx code-push show-history --binary-version 1.0.0 --platform ios --identifier staging
release
为特定二进制应用版本发布代码Push更新.
- 这个命令创建了 CodePush 捆绑文件,上传它,并用新的发行信息更新发行历史.
示例
- 发布代码Push更新
1.0.1瞄准二进制应用程序版本1.0.0。 。 。 .
npx code-push release --binary-version 1.0.0 --app-version 1.0.1 \
--platform ios --identifier staging --entry-file index.js \
--mandatory true
# Expo project
npx code-push release --framework expo --binary-version 1.0.0 --app-version 1.0.1 --platform ios
--framework(单位:千美元)-f: 框架类型(expo)--binary-version:代码Push更新针对的二进制app版本.--app-version:代码Push的版本自我更新.
[大
--app-version应大于--binary-version(中文(简体) ).
--rollout:更新的推出百分比。 (0~100,包含)--minimum-background-duration: 应用程序在恢复应用此更新之前, 必须在背景中显示秒数ON_NEXT_RESUME财务报告和审定财务报表ON_NEXT_SUSPEND仅安装。 (整秒,0秒或更长)- 释放时设定的值优先于
minimumBackgroundDuration转至sync,以及0应用下一次恢复的更新.
- 释放时设定的值优先于
update-history
更新特定代码Push更新的发布历史 .
- 使用
--enable选项,以禁用特定放出以回滚。 (或使之得以) - 使用
--mandatory选项,使更新成为强制性或可选性. - 使用
--rollout选项更改更新的推出百分比。 (0~100,包含)- 如果推出百分比降低,超出新目标的用户将取消推出,并回滚至上一个最新版本.
- 使用
--minimum-background-duration选项以更改应用程序在恢复时应用更新前必须在背景中有多少秒ON_NEXT_RESUME财务报告和审定财务报表ON_NEXT_SUSPEND仅安装。 (整秒,0秒或更长)- 释放后可以降低 设定为
0例如,在下一次恢复时应用更新,而不是等待.
- 释放后可以降低 设定为
示例
- 回滚代码Push更新
1.0.1(目标二进制应用程序版本)1.0.0) (中文(简体) ).
npx code-push update-history --binary-version 1.0.0 --app-version 1.0.1 \
--platform ios --identifier staging \
--enable false
bundle
创建 CodePush 捆绑文件 .
示例
npx code-push bundle --platform android --entry-file index.js
# Expo project
npx code-push bundle --framework expo --platform android --entry-file index.js
--framework(单位:千美元)-f: 框架类型(expo)
默认情况下,捆绑文件在 /build/bundleOutput 目录.
[注] 对于博览会项目,CLI使用
expo export:embed命令,用于捆绑而不是React Industrial的捆绑命令.
(文件名代表捆绑内容的散列值