appcenter codepush release -a <ownerName>/<appName> -c <updateContentsPath> -t <targetBinaryVersion> -d <deploymentName>
[-t|--target-binary-version <version>]
[-с|--update-contents-path <updateContentsPath>]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[-k|--private-key-path <privateKeyPath>]
[-m|--mandatory]
[-x|--disabled]
[--description <description>]
[-d|--deployment-name <deploymentName>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]
应用名称参数
此参数指定要为其发布此更新的 App Center 应用的名称。 如果要查找它,可以运行 appcenter apps list
命令来查看应用列表。
更新内容参数
此参数指定要发布的已更新应用代码和资产的位置。 例如,可以提供单个文件 (、React Native应用) 的 JS 捆绑包,或目录路径 (例如 /platforms/ios/www
Cordova 应用的文件夹) 。 无需压缩多个文件或目录来部署这些更改,因为 CLI 会自动为你压缩这些更改。
请务必指定路径引用特定于平台的、已准备/捆绑的应用版本。 下表概述了在发布之前应运行的命令,以及以后可以使用 updateContentsPath
参数引用的位置:
相对于项目根) 的包路径 (
React Native wo/assets (Android)
react-native bundle --platform android --entry-file <entryFile> --bundle-output <bundleOutput> --dev false
选项的值 --bundle-output
。
React Native android) (资产
react-native bundle --platform android --entry-file <entryFile> --bundle-output <releaseFolder>/<bundleOutput> --assets-dest <releaseFolder> --dev false
--assets-dest
选项的值,它应表示包含应用资产和 JS 捆绑包的新创建的目录
React Native wo/assets (iOS)
react-native bundle --platform ios --entry-file <entryFile> --bundle-output <bundleOutput> --dev false
选项的值--bundle-output
React Native iOS) (资产
react-native bundle --platform ios --entry-file <entryFile> --bundle-output <releaseFolder>/<bundleOutput> --assets-dest <releaseFolder> --dev false
--assets-dest
选项的值,它应表示包含应用资产和 JS 捆绑包的新创建的目录
目标二进制版本参数
此参数指定要为其发布更新的应用程序的存储/二进制版本,以便只有运行该版本的用户才能收到更新,而运行较旧或更新版本的应用二进制文件的用户不会收到更新。 由于以下原因,它很有用:
如果用户运行的是较旧的二进制版本,则 CodePush 更新中可能存在与其运行的内容不兼容的中断性变更。
如果用户运行的是较新的二进制版本,则假定他们运行的内容较新, (并且可能与 CodePush 更新) 不兼容。
如果曾经希望更新面向多个版本的应用商店二进制文件,我们还允许将 参数指定为 semver 范围表达式。 这样,任何运行满足范围表达式的二进制文件版本的客户端设备 (semver.satisfies(version, range)
将返回 true
) 获取更新。 有效 semver 范围表达式的示例如下所示:
范围表达式
谁获取更新
如果应用的 semver 表达式以特殊 shell 字符或运算符(如 、 ^
或 ** *)>
开头,则如果不用引号包装值,则命令可能无法正确执行,因为 shell 无法向 CLI 进程提供正确的值。 因此,调用 命令时release
,最好将应用的 targetBinaryVersion
参数用双引号包装,例如 appcenter codepush release -a <ownerName>/<appName> updateContents ">1.2.3"
。
下表概述了 CodePush 希望更新的 semver 范围为每个应用类型满足的版本值:
二进制版本的源
Description 参数
此参数为部署提供可选的“更改日志”。 该值舍入到客户端,以便在检测到更新时,应用可以选择 (向最终用户显示它,例如,通过“新增功能?”对话框) 。 此字符串接受和 \t
等\n
控制字符,以便你可以在说明中包含空格格式,以提高可读性。
可以使用 设置 --description
此参数。
Disabled 参数
此参数指定最终用户是否应下载更新。 如果未指定,则不会禁用更新。 相反,用户会在应用调用 sync
的那一刻下载它。 如果要发布未立即可用的更新,则此参数非常有用,直到显式 修补它 并希望最终用户 (下载它,例如,公告博客文章) 上线。
可以使用 或 -x
设置--disabled
此参数。
此参数指定是否应将更新视为强制更新 (例如,它包含关键安全修补程序) 。 此属性被舍入到客户端,然后客户端可以决定是否以及如何强制执行它。
此参数是一个“标志”,因此它不存在表示发布是可选的,而其存在则表示它是必需的。 可以 (提供值, --mandatory true
例如,) ,但是,指定 --mandatory
就足以将发布标记为必需版本。
必需属性是唯一的,因为服务器会根据需要动态修改它,以确保为最终用户维护应用版本的语义。 例如,假设你向应用发布了以下三个更新:
如果最终用户当前正在运行 v1
,并且他们向服务器查询更新,它将响应 v3
(,因为这是最新的) ,但它会动态地将版本转换为必需版本,因为必需更新是在两者之间发布的。 此行为非常重要,因为 中包含的 v3
代码是增量代码,而 包含在 中 v2
。 v2
对于尚未获得 v2
的任何人来说,任何强制要求继续成为v3
强制性的。
如果最终用户当前正在运行 v2
,并且他们向服务器查询更新,它将使用 v3
进行响应,但将版本保留为可选版本。 这是因为他们已收到强制更新,因此不需要修改 的策略 v3
。 此行为就是为什么我们说服务器将“动态转换”强制标志,因为就发布而言,其强制属性将始终使用释放时指定的值进行存储。 仅当响应最终用户的更新检查时,它才会根据需要进行动态更改。
仅当发布标记为 mandatory
的更新时,所描述的行为才适用于你。 仅当存在如上所示的混mandatory
杂更新时,服务器才会将版本mandatory
更改为 optional
。
标记为 mandatory
的版本永远不会转换为 optional
。
可以使用 或 设置 --mandatory
此参数 -m
*
无重复发布错误参数
此参数指定如果更新与部署的最新版本相同,CLI 应生成警告而不是错误。 它对于持续集成方案很有用,在这些方案中,小修改可能会触发未更改生产代码的发布。
为了使此参数生效,最终用户必须运行 Cordova) 的版本 1.6.0-beta+
(或 1.9.0-beta+
codePush 插件React Native) (。 如果发布指定推出属性的更新,则运行旧版 Cordova 或 React Native 插件的最终用户都不符合更新条件。 在采用之前) 所述的特定于平台的 CodePush 插件 (的必要版本之前,我们不建议在应用的版本中设置推出值,因为没有人最终会收到它。
此参数将 (的用户百分比指定为介于 和 100
) 之间1
应有资格接收此更新的用户百分比。 如果你希望通过应用的一部分受众 ((例如,25% ) )对新版本进行“外部测试”,并获取反馈或watch异常或崩溃,然后才将其广泛提供给所有人,则此功能非常有用。 如果未设置此参数,则默认为 100%
。 只需将其设置为限制接收它的用户数。
使用推出功能时,需要记住一些其他注意事项:
如果部署的最新版本为“活动”推出, (其推出属性为非 null) ,则无法发布其新更新。 需要“完成”推出 (将 属性设置为 rollout
100
) ,然后才能发布对部署的进一步更新。
如果回滚其最新版本为“活动”推出的部署,则会清除推出值,从而有效地“停用”推出行为
mandatory
与 和 description
字段不同,将发布从一个部署提升到另一个部署时,它不会传播 rollout
属性,因此,如果希望目标部署中的新版本 () 具有推出值,则必须在调用 promote
命令时显式设置它。
可以使用 或 设置 --rollout
此参数 -r
*
释放汇报 (React Native)
appcenter codepush release-react -a <ownerName>/<appName> -d <deploymentName> -t <targetBinaryVersion>
[-t|--target-binary-version <targetBinaryVersion>]
[-o|--output-dir]
[-s|--sourcemap-output]
[-c|--build-configuration-name <arg>]
[--plist-file-prefix]
[-p|--plist-file]
[-g|--gradle-file]
[-e|--entry-file]
[--development]
[-b|--bundle-name <bundleName>]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[-k|--private-key-path <privateKeyPath>]
[-m|--mandatory]
[-x|--disabled]
[--description <description>]
[-d|--deployment-name <deploymentName>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]
该release-react
命令是特定于React Native版本的“vanilla”release
命令,它支持所有相同的参数 (例如 --mandatory
、 --description
) ,但通过执行以下附加任务简化了发布更新的过程:
react-native bundle
运行 命令以生成将发布到 CodePush 服务器的 JS 捆绑包和资产) (更新内容。 它尽可能使用合理的默认值 (例如,创建非开发版本(假设 iOS 条目文件 命名index.ios.js) ),但也公开相关 react-native bundle
参数以实现灵活性 (,例如 --sourcemap-output
,) 。
使用项目的 Info.plist (for iOS) 和 build.gradle ((适用于 Android) 文件)中指定的版本名称推断targetBinaryVersion
此版本。
为了说明命令可以带来的差异release-react
,以下示例演示了如何使用“vanilla”release
命令生成和发布React Native应用的更新:
mkdir ./CodePush
react-native bundle --platform ios \
--entry-file index.ios.js \
--bundle-output ./CodePush/main.jsbundle \
--assets-dest ./CodePush \
--dev false
appcenter codepush release -a <ownerName>/MyApp-iOS -c ./CodePush -t 1.0.0
使用 release-react
命令实现等效的行为需要以下命令,这不太容易出错:
appcenter codepush release-react -a <ownerName>/MyApp-iOS
应用名称参数
它与 上一部分所述的参数相同。
部署名称参数
它与 上一部分所述的参数相同。
Description 参数
它与 上一部分所述的参数相同。
它与 上一部分所述的参数相同。
无重复发布错误参数
它与 上一部分所述的参数相同。
它与 上一部分所述的参数相同。 如果未指定,则发布将提供给所有用户。
目标二进制版本参数
它与 上一部分所述的参数相同。 如果未指定,则默认以应用的 Info.plist ((适用于 iOS) )和适用于 Android) 文件的 build.gradle (中指定的确切版本为目标。
捆绑包名称参数
此参数指定应用于生成的 JS 捆绑包的文件名。 如果未指定,则标准捆绑包名称将用于指定的平台:main.jsbundle (iOS) 、index.android.bundle (Android) ,以及 index.windows.bundle (Windows) 。
可以使用 或 设置 --bundle-name
此参数 -b
*
此参数指定是否生成未优化的开发 JS 捆绑包。 如果未指定,则默认禁用 false
警告并缩小捆绑包。
可以使用 设置此参数 --development
*
Disabled 参数
它与 上一部分所述的参数相同。
入口文件参数
此参数指定应用的根/条目 JavaScript 文件的相对路径。 如果未指定,则默认为 iOS )index.ios.js (、Android) 的index.android.js (或 windows) 的 index.windows.bundle ((如果该文件存在),否则 index.js 。
可以使用 或 设置 --entry-file
此参数 -e
*
仅限 Android (Gradle 文件参数)
此参数指定 CLI 在尝试自动检测发布的目标二进制版本时应使用的 build.gradle 文件的相对路径。 此参数仅适用于高级方案,因为 CLI 可以在“标准”React Native项目中自动查找项目的 build.gradle 文件。 但是,如果项目的 gradle 文件位于 CLI 无法发现的任意位置,则使用此参数可以继续发布 CodePush 更新,而无需显式设置 --target-binary-version
参数。 由于 build.gradle 是必需的文件名,因此指定包含文件夹的路径或文件本身的完整路径将达到相同的效果。
appcenter codepush release-react -a <ownerName>/MyApp-Android -g "./foo/bar/"
appcenter codepush release-react -a <ownerName>/MyApp-Android -g "./foo/bar/build.gradle"
可以使用 或 来设置 --gradle-file
此参数 -g
*
plist 文件参数仅 (iOS)
此参数指定在尝试自动检测发布的目标二进制版本时 CLI 应使用的 Info.plist 文件的相对路径。 此参数仅适用于高级方案,因为 CLI 可以在“标准”React Native项目中自动查找项目的 Info.plist 文件,并且你可以使用 --plistFilePrefix
参数支持每个环境的 plist 文件 (例如 STAGING-Info.plist) 。 但是,如果项目的 plist 位于 CLI 无法发现的任意位置,则使用此参数可以继续发布 CodePush 更新,而无需显式设置 --target-binary-version
参数。
appcenter codepush release-react -a <ownerName>/MyApp-iOS -p "./foo/bar/MyFile.plist"
可以使用 或 来设置 --plist-file
此参数 -p
*
plist 文件前缀参数仅 (iOS)
此参数指定 CLI 在尝试自动检测发布的目标二进制版本时应使用的 Info.plist 文件的文件名前缀。 如果已 (DEV-Info.plist、STAGING-Info.plist) 创建了每个环境 plist 文件,并且想要发布 CodePush 更新而无需显式设置 --target-binary-version
参数,则这非常有用。 通过指定 , --plist-file-prefix
CLI 将在以下位置查找名为 <prefix>-Info.plist
的文件,而不是 Info.plist (这是) 的默认行为: ./ios
和 ./ios/<appName>
。 例如,如果项目的 plist 文件不位于其中任一目录 (,则应用是一个本机 iOS 应用,) 嵌入 RN 视图,或使用完全不同的文件命名约定,请考虑使用 --plist-file
参数。
# Autodetect the target binary version of this release by looking up the
# app version within the STAGING-Info.plist file in either the ./ios or ./ios/<APP> directories.
appcenter codepush release-react -a <ownerName>/MyApp-iOS --plist-file-prefix "STAGING"
# Tell the CLI to use your dev plist (`DEV-Info.plist`).
# The hyphen separator can be explicitly stated.
appcenter codepush release-react -a <ownerName>/MyApp-iOS --plist-file-prefix "DEV-"
源映射输出参数
此参数指定生成的 JS 捆绑包的源映射文件的相对路径。 如果未指定,则不会生成源映射。
可以使用 或 来设置 --sourcemap-output
此参数 -s
*
生成配置名称
生成配置的名称,该配置指定要以此版本为目标的二进制版本。 例如,“调试”或“发布” (iOS 仅) 。
使用 Xcode 11 及更高版本生成时,应使用此参数来替代 Xcode 使用的默认配置。
释放汇报 (Cordova)
appcenter codepush release-cordova -a <ownerName>/<appName> -d <deploymentName> -t <targetBinaryVersion>
[-t|--target-binary-version <targetBinaryVersion>]
[--is-release-build-type]
[-b|--build]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[-k|--private-key-path <privateKeyPath>]
[-m|--mandatory]
[-x|--disabled]
[--description <description>]
[-d|--deployment-name <deploymentName>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]
该 release-cordova
命令是特定于 Cordova 的“vanilla” release
命令版本,它支持所有相同的参数 (例如 --mandatory
、 --description
) ,但通过执行以下附加任务简化了发布更新的过程:
cordova prepare
运行 (或 phonegap prepare
) 命令以 (生成将发布到 CodePush 服务器的 www 文件夹) 的更新内容。
使用项目的config.xmltargetBinaryVersion
文件中指定的 版本名称推断此版本的 。
为了说明命令可以产生的差异 release-cordova
,以下示例演示了如何使用“vanilla” release
命令生成和发布 Cordova 应用的更新:
cordova prepare ios
appcenter codepush release -a <ownerName>/MyApp-iOS -c ./platforms/ios/www -t 1.0.0
使用 release-cordova
命令实现等效行为需要以下命令,这不太容易出错:
appcenter codepush release-cordova -a <ownerName>/MyApp-iOS
应用名称参数
它与 上一部分所述的参数相同。
部署名称参数
它与 上一部分所述的参数相同。
Description 参数
它与 上一部分所述的参数相同。
它与 上一部分所述的参数相同。
没有重复的发布错误参数
它与 上一部分所述的参数相同。
它与 上一部分所述的参数相同。 如果未指定,则发布将提供给所有用户。
目标二进制版本参数
它与 上一部分所述的参数相同。 如果未指定,则命令默认仅面向项目元数据 (Info.plist 中的指定版本(如果此更新适用于 iOS 客户端),而 android 客户端的 build.gradle) 。
Disabled 参数
它与 上一部分所述的参数相同。
此参数指定在生成更新的 cordova prepare
Web 资产时,是否要运行cordova build
而不是 (这是) 的默认行为。 如果项目在生成之前或之后包括挂钩 (,例如,转译 TypeScript) ,因此,运行 CodePush cordova prepare
不足以创建和发布更新,这很有价值。 如果未指定,则默认为 false
。
可以使用 或 来设置 --build
此参数 -b
*
发布更新后,在某些情况下,你可能想要修改一个或多个元数据属性, (例如,忘记将关键 bug 修复标记为必需,想要增加更新) 的推出百分比。 可以通过运行以下命令轻松执行此操作:
appcenter codepush patch -a <ownerName>/<appName> <deploymentName> <existing-release-label>
[-r|--rollout <rolloutPercentage>]
[-d|--description <description>]
[-t|--target-binary-version <targetBinaryVersion>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]
此命令不允许修改发布的实际更新内容 (例如 Cordova www
应用) 的文件夹。 如果要响应已标识为已损坏的版本,应使用 回滚 命令立即回滚该版本,然后在必要时使用相应的修补程序发布新的更新(如果可用)。
除了 <ownerName>/<appName>
和 deploymentName
之外,所有参数都是可选的,因此可以使用此命令一次性更新单个属性或全部属性。 patch
在不指定任何属性标志的情况下调用命令将导致 no-op。
# Mark the latest production release as mandatory
appcenter codepush patch -a <ownerName>/MyApp-iOS Production -m
# Increase the rollout for v23 to 50%
appcenter codepush patch -a <ownerName>/MyApp-iOS Production v23 -rollout 50%
Label 参数
例如, v23
指示要在指定部署中更新) 哪个版本 (。 如果省略,则请求的更改将应用于指定部署中的最新版本。 若要查找要更新的版本标签,可以运行 appcenter codepush deployment history
命令并引用 列 Label
。
它与 上一部分所述的参数相同,可用于更新是否应将发布视为强制发布。 请注意, --mandatory
和 --mandatory true
是等效的,但缺少此标志并不等效 --mandatory false
于 。 如果省略参数,则不会更改目标版本的必需属性的值。 将此参数设置为 以 --mandatory false
显式将发布设为可选。
Description 参数
它与 上一部分所述的参数相同,可用于更新发布说明 (例如,发布时出现拼写错误,或忘记在) 添加说明。 如果省略此参数,则不会更改目标版本的 description 属性的值。
Disabled 参数
它与 上一部分所述的参数相同,可用于更新是否应禁用发布。 请注意 --disabled
和 --disabled true
是等效的,但缺少此标志并不等效 --disabled false
于 。 如果省略参数,则不会对目标版本的 disabled 属性的值进行更改。 将此参数设置为 --disabled false
以显式使发布可获取(如果以前已禁用)。
它与 上一部分所述的参数相同,可用于增加目标版本的推出百分比。 此参数只能设置为值大于当前推出值的整数。 此外,如果要“完成”推出并让所有人都可以使用该版本,可以将此参数设置为 --rollout 100
。 如果省略此参数,则不会更改目标版本的推出参数的值。
此外,如上所述,发布没有推出值的更新时,其处理等效于将推出设置为 100
。 如果在未推出的情况下发布了更新,则无法通过 patch
命令更改更新的推出属性,因为这会被视为降低推出百分比。
目标二进制版本参数
它与 上一部分所述的参数相同,可用于更新 semver 范围,指示版本与哪个二进制版本兼容。 如果你在最初发布更新 (时出错,例如,你指定 1.0.0
但意在 1.1.0
) ,或者你想要增加或减少版本支持的版本范围 (例如,你发现发布在) 后不起作用 1.1.2
。 如果省略此参数,则不会更改目标版本的版本属性的值。
# Add a "max binary version" to an existing release
# by scoping its eligibility to users running >= 1.0.5
appcenter codepush patch -a <ownerName>/MyApp-iOS Staging -t "1.0.0 - 1.0.5"
针对特定部署 ((例如, Staging
) )测试更新后,想要将其提升为“下游” (例如开发>过渡、过渡->生产) ,可以使用以下命令将发布从一个部署复制到另一个部署:
appcenter codepush promote -a <ownerName>/<appName> -s <sourceDeploymentName> -d <destDeploymentName>
[-s|--source-deployment-name <sourceDeploymentName>]
[-d|--destination-deployment-name <destDeploymentName>]
[-t|--target-binary-version <targetBinaryVersion>]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[--description <description>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
命令 promote
为目标部署创建新版本,其中包括源部署的最新版本) 说明、必需和目标二进制版本 (确切的代码和元数据 。 虽然可以使用 release
命令“手动”将更新从一个环境迁移到另一个环境, promote
但该命令具有以下优点:
速度更快,因为无需重新组合要发布的发布资产,也无需记住源部署发布的说明/二进制版本。
它不太容易出错,因为升级操作可确保已在源部署中测试的确切内容 (例如, Staging
) 将在目标部署 (变为活动状态, Production
例如,) 。
我们建议所有用户都利用自动创建Staging
Production
的环境,并直接对 Staging
执行所有版本,然后在promote
进行适当的测试后从 Staging
到 Production
执行所有版本。
Description 参数
它与 上一部分所述的参数相同,可用于替代将用于升级版本的说明。 如果未指定,新版本将从要升级的版本继承说明。
Disabled 参数
它与 上一部分所述的参数相同,可用于替代将用于升级版本的已禁用标志的值。 如果未指定,新版本将从要升级的版本继承 disabled 属性。
它与 上一部分所述的参数相同,可用于替代将用于升级版本的强制标志。 如果未指定,新版本将从要升级的版本继承强制属性。
没有重复的发布错误参数
它与 上一部分所述的参数相同。
它与 上一部分所述的参数相同,可用于指定是否应仅向部分用户提供新创建的版本。 与其他发布元数据参数 (不同, description
例如,) , rollout
发布的 不会作为升级的一部分进行传递/继承,因此,如果不希望新创建的版本可供所有用户使用,则必须显式设置此参数。
目标二进制版本参数
它与 上一部分所述的参数相同,可用于替代将用于升级版本的目标二进制版本。 如果未指定,新版本将从要升级的版本继承目标二进制版本属性。
# Promote the release to production and make it
# available to all versions using that deployment
appcenter codepush promote -a <ownerName>/MyApp-iOS -s Staging -d Production -t "*"
部署的发布历史记录是不可变的,因此在发布更新后无法删除更新。 但是,如果发布已损坏或包含意外功能的更新,则可以轻松地使用 rollback
命令回滚它:
appcenter codepush rollback <ownerName>/<appName> <deploymentName>
appcenter codepush rollback -a <ownerName>/MyApp-iOS Production
执行此命令会为部署创建一个新版本,其中包含与最新版本之前的版本 完全相同的代码和元数据 。 例如,假设你向应用发布了以下更新:
现在,当应用执行更新检查时,已获取v3
的最终用户将“移回” 。v2
此外,任何仍在运行v2
(因此从未获取 v3
)的用户都不会收到更新,因为他们已经运行最新版本 (这就是更新检查除了发布标签) 之外使用包哈希的原因。
如果要将部署回滚到上一个 (以外的版本,例如 v3
->v2
) ,可以指定可选 --target-release
参数:
appcenter codepush rollback -a <ownerName>/MyApp-iOS Production --target-release v34
回滚生成的版本将在命令的 deployment history
输出中批注,以帮助更轻松地识别它们。
查看发布历史记录
可以使用以下命令查看特定应用部署的 50 个最新版本的历史记录:
appcenter codepush deployment history -a <ownerName>/<appName> <deploymentName>
历史记录将显示有关每个版本的所有属性 (例如标签、强制) ,以及指示是否由于升级或回滚操作而发布了任何版本。
此外,历史记录还显示每个版本的安装指标。 可以在上述命令的文档中 deployment list
查看有关如何解释指标数据的详细信息。
清除发布历史记录
可以使用以下命令清除部署的发布历史记录:
appcenter codepush deployment clear -a <ownerName>/<appName> <deploymentName>
运行此命令后,配置为使用其关联部署密钥接收更新的客户端设备将不再接收已清除的更新。 此命令不可逆,因此不应在生产部署中使用。
它是什么?
代码签名是一种为捆绑包创建数字签名的方法,以后可以在安装前在客户端进行验证。
我们为什么需要它?
开发人员希望知道他们提供的代码是他们编写的代码。 代码签名是提供此类保证的主要机制,可帮助缓解或消除一整类中间人攻击。
它是如何工作的?
首先,开发人员生成非对称密钥对:私钥将用于签名捆绑包;用于捆绑包签名验证的公钥。 然后,CodePush CLI 在 和 release-react
release-cordova
命令期间release
使用私钥对捆绑包进行签名。 公钥随移动应用程序一起提供。 由开发人员控制密钥的生成和管理。
在发布命令结束时,CLI 会计算捆绑包的内容哈希,并将此值放入使用私钥签名的 JWT 中。 当 CodePush 插件将捆绑包下载到设备时,它会检查 .codepushrelease
包含 JWT 的文件,并使用公钥验证 JWT 签名。 如果验证失败,则不会安装更新。
使用此功能的要求
如果计划使用此功能,请执行以下步骤:
生成新的二进制更新,包括
更新了支持代码签名的 CodePush 插件
配置代码推送 sdk 以使用公钥 (请参阅相关React Native SDK (iOS、Android) 或 Cordova SDK 部分了解详细信息)
生成面向新二进制版本并指定 --private-key-path
(或 -k
) 参数值的新 CodePush 更新
请参阅我们的兼容性表,以确定 SDK/CLI 中是否支持代码签名功能:
CodePush SDK
支持代码签名的版本
支持的平台
所需的最低 CodePush CLI 版本
代码签名支持 PEM 编码的 RSA 密钥 (用于签名的非证书) 。 可以通过 openssl 生成它们,如下所示:
# generate private RSA key and write it to private.pem file
openssl genrsa -out private.pem
# export public key from private.pem into public.pem
openssl rsa -pubout -in private.pem -out public.pem
生成的密钥示例:
# public key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4moC3GsqF7YISFMQ0fnU
0rUF2xhxNqSGx9/GTxCynsQhR3hceroDXj3rAOTxnNkePB27uZfRDHrH3/LLoj9V
k2ghKRtfjDwXa85uDK8slSQDB9ZlD1TLQEJDZpKr1OTXY9VwbgtFaotSXoFmG3MO
RQeALCbrAgDxQ5Q2kJn6rfBuBoszfUz1qZqrlrY74Axerv1/UtTjL8uyF5r00Bxj
kvTveC2Pm5A3kq6QANktgfKWy9Ugs/4ykZF7fxfH+ukJW+iXwLACrdfzhegg/41H
5w06m30h0jqhIBZ3nbj5MN+qVbANHJMjz+fXqXx1Ovr1DfGtdKOku/BTWDxojCl1
iwIDAQAB
-----END PUBLIC KEY-----
# private key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA4moC3GsqF7YISFMQ0fnU0rUF2xhxNqSGx9/GTxCynsQhR3hc
eroDXj3rAOTxnNkePB27uZfRDHrH3/LLoj9Vk2ghKRtfjDwXa85uDK8slSQDB9Zl
D1TLQEJDZpKr1OTXY9VwbgtFaotSXoFmG3MORQeALCbrAgDxQ5Q2kJn6rfBuBosz
fUz1qZqrlrY74Axerv1/UtTjL8uyF5r00BxjkvTveC2Pm5A3kq6QANktgfKWy9Ug
s/4ykZF7fxfH+ukJW+iXwLACrdfzhegg/41H5w06m30h0jqhIBZ3nbj5MN+qVbAN
HJMjz+fXqXx1Ovr1DfGtdKOku/BTWDxojCl1iwIDAQABAoIBAQCdwf/8VS8fFlbv
DfHKXKlNp5RM9Nrtl/XRjro+nQPYXBBUHClT2gg+wiXcmalAAIhwmscSqhWe/G4I
PMRmaHrYGtYALnKE49nt5AgKDoSh5lW2QExqQkrcm08bSVcxH8J0bWPJSVE0y564
+rCKr8BhmLhWC0f0PXPeAoeCeceRKYX2oDgO8A0yZRSQUdRWiXOiQ4mUQ3IPCmBc
gD1JJNZ5kR4O904PZz5pbgyvN2t5BKOgLKq+x+8Pa8Rb21rFZKMHO8W04oKaRiGs
f4xwOBAWDOfzDKJzT5xepcPyycgjxcuvyKB2g8biWnDGGOTxDgqMX+R4XeP1aISC
h9bzfRoBAoGBAPREuPhIXRJOsIgSWAAiC5vhLZ9wWELWG95eibQm2SfpY4F0sPpE
lNQJ4yzC7J4BiApFzs1yxwwRmgpVd+wF9iMb4NSzaiTM7fju/Xv4aGhBqRXEokGF
v3QxIlbAwBqeL0rJAAadjbUTTO/u6sC80LI3bfPrn/z1hupZQGR559gjAoGBAO1J
xQ2ODVS4dSH2P+Ocd9LiUBPGyV97+MFixh6z1c2Fd3bNuiIhCxkrng45Dq0CkX84
nPUvtYxEQZoFvyB7gAm0SVlLHnJwBiq+Mp9g0UXSy6rZbjhiFkQs1W/W+Z2OIDsC
y+uXZT7No/J9VyjdrWzZJaBImO8/E4NONXWn8M95AoGACH97j+e0lTZ3ncRFm3uT
u9CRrcJSz8BzJ8FSORpA48qS06YjohFQvC+734rIgJa9DN5w22Tq19ik60cd7PAo
KACISd4UC0O147ssxmtV9oqSP1ef7XehuYEcGLiL9mEadBeaEKDalToeqxo8wIfR
GuIiySGhZ0ODdhO00coL7tECgYBargddD70udDNnICj4PbJY5928QQpxr/m3RZz6
3LTHDstBnosUQdZw7wc+3jUqjsG1gZgR5wKVMPx09N8+dZPPoZMqSZfAGelxajAE
UkaHTXBBwUfqyilCMnP6gofv2wGcK4xsYvXxEzslDxtA5b5By5Yic7vmKg+17Sxm
4yAW2QKBgDyEUzXq3Rrm7ZT720pPhuQDDSO0eHe1L1MUjTRsJ96GkIl0iqQCVgK8
A/6rFFTEeVf8L6GNMTwdtnDFz/CqIU+K1X4HLXmUY2suffWVxZ4KYqiEszCbyrdO
puayMcrx2unhKQyDYjUvD8GxHyquA+p52KDke2TkKfDxfzv0WOE1
-----END RSA PRIVATE KEY-----
发布已签名的更新
若要发布已签名的更新,应为 release
release-react
或 命令使用 --private-key-path
(或 -k
) 选项。