React-Native热更新

  1. 一、分类
  2. 二、CodePush
  • 安装
    1. 安装Code Push Cli
  • 账户管理
    1. 认证方式
      1. 安装完成后,注册通过
      2. 如果已经有一个帐户,通过将帐户链接到另一个身份提供者
      3. 如果需要正常登陆则通过
      4. 如果您想确定自己是否已经登录
      5. 退出登陆
      6. 如果忘记从计算机注销,则不想保留正在运行的会话
  • 密钥登陆
  • 代理支持
    1. 默认情况下,该login命令将自动查找通过HTTPS_PROXY或HTTP_PROXY环境变量指定的系统范围的代理,并使用该代理连接到CodePush服务器。如果您想禁用此行为,并让CLI建立与CodePush的直接连接,通过--noProxy完成:
    2. 而如果不想通过系统代理,而指定代理方式,可以通过--proxy完成:
  • 应用管理
    1. 基本操作
    2. 应用多人管理
    3. 所有权转移
    4. 部署管理
  • 发布更新
    1. 发布更新(常规)
    2. 发布更新(React-Native)
    3. 发布更新(Cordova)
  • 调试CodePush集成
  • 修补更新参数
  • 发布更新
  • 回滚更新
  • 查看发行记录
  • 清除发布历史记录
  • 代码签名
    1. 他是什么
    2. 为什么需要
    3. 如何工作
  • 三、react-native-code-push
  • Android
    1. npm install react-native-code-push —save OR yarn add react-native-code-push
    2. 基本配置
    3. 打包(Android基础包)
    4. 开启第一次更新(简单实例)
    5. code-push release-react 还是 code-push release ?
    6. Android-API
  • IOS
  • JS代码
    1. 四、code-push-server
  • 下载库
  • MySql
  • 修改数据存储路径
  • 数据库初始化
  • 开启服务
  • code-push配置
    1. 登陆
    2. 其他所有工作都使用code-push完成
  • react-native配置
  • 一、分类

    有两种选择方式:

    • Pushy:官方热更新方案
    • Code-Push:微软提供的热更新方案

    二、CodePush

    官方网址

    所有的操作最好都现在官方上过一遍,毕竟电脑配置,环境都会影响。

    安装

    安装Code Push Cli

    npm install -g code-push-cli

    账户管理

    认证方式

    安装完成后,注册通过

    code-push register

    他会打开浏览器进行注册/登陆功能,可以使用 github 、Microsoft进行第三方账户登陆。登陆成功后会生成一个访问密钥,将其复制到命令行后即可登陆验证操作。

    如果已经有一个帐户,通过将帐户链接到另一个身份提供者

    code-push link

    如果需要正常登陆则通过

    code-push login

    如果您想确定自己是否已经登录

    code-push whoami

    他会返回当前账户注册的邮件

    退出登陆

    code-push logout

    如果忘记从计算机注销,则不想保留正在运行的会话
    • 通过移动中心网站
    • 通过Mobile Center CLI命令:
      mobile-center tokens list
      mobile-center tokens delete <machineName>

      密钥登陆

      如果不想打开服务器进行验证登陆,则需要运行以下命令来创建“访问密钥”
      code-push access-key add "VSTS Integration"

    创建新密钥后,可以使用命令的--accessKey标志指定其值,该标志login允许执行身份验证,而不是启动浏览器。
    code-push login --accessKey <accessKey>

    通过这种方法登录时,访问密钥不会在注销时自动失效,并且可以在以后的会话中使用,直到将其从CodePush服务器中明确删除或到期为止。

    代理支持

    默认情况下,该login命令将自动查找通过HTTPS_PROXY或HTTP_PROXY环境变量指定的系统范围的代理,并使用该代理连接到CodePush服务器。如果您想禁用此行为,并让CLI建立与CodePush的直接连接,通过--noProxy完成:

    code-push login --noProxy

    而如果不想通过系统代理,而指定代理方式,可以通过--proxy完成:

    code-push login --proxy https://foo.com:3454

    所有通过代理参数完成的登陆,都会在登陆成功后保存的本地,可以无需再次键入代理,如果需要取消则需要重新启动并设置代理参数即可。通过 code-push whoami 可以查看当前的代理地址

    应用管理

    基本操作

    需要使用以下命令在CodePush服务中注册应用程序:
    code-push app add <appName> <os> <platform>

    appName:用户软件在codepush下的名字
    os:当前软件的系统环境
    platform:js集成环境(cordovareact-native)

    举个栗子:
    使用-Android-iOS为命名约定,无需担心创建后的相关内容,因为后面可以查看细节部分。

    code-push app add MyApp-Android android cordova
    code-push app add MyApp-iOS ios react-native

    注意:对于iOS和Android使用相同的应用程序可能会导致安装异常,因为为iOS生成的CodePush更新程序包将具有与为Android生成的更新内容不同的内容。

    所有新应用程序都会自动带有两个部署环境(Staging和Production)可以开始使用它们通过各自的SDK(cordovareact-native)进行配置。

    如果决定不喜欢为应用程序提供的名称,则可以使用以下命令随时对其进行重命名:
    code-push app rename <appName> <newAppName>

    如果有时不再需要某个应用程序,则可以使用以下命令将其从服务器中删除:
    code-push app rm <appName>

    如果要列出已在CodePush服务器上注册的所有应用程序,则可以运行以下命令:
    code-push app ls

    应用多人管理

    如果要在同一CodePush应用程序上与其他开发人员一起工作,则可以使用以下命令将他们添加为协作者:
    code-push collaborator add <appName> <collaboratorEmail>

    appName:协作者可以查看的app名称
    collaboratorEmail:协作者邮箱

    添加后,所有协作者将立即对新共享的应用程序具有以下权限:

    1.查看该应用程序,其协作者,部署和发布历史记录
    2.发布对任何应用程序部署的更新
    3.促进任何应用程序部署之间的更新
    4.回滚任何应用程序的部署
    5.修补任何应用程序部署中的所有版本

    相反,这意味着应用程序协作者不能执行以下任何操作:

    1.重命名或删除应用
    2.在应用程序中创建,重命名或删除新的部署
    3.清除部署的发布历史记录
    4.在应用中添加或删除协作者

    如果某人不再与您一起处理应用程序,则可以使用以下命令将其作为协作者删除:
    code-push collaborator rm <appName> <collaboratorEmail>

    如果您想随时列出已添加到应用程序中的所有协作者,则只需运行以下命令:
    code-push collaborator ls <appName>

    所有权转移

    在版本2.0.0.0的更新中,删除了该app transfer命令。这要求访问Mobile Center并执行一些步骤。

    1.转到https://mobile.azure.com并创建一个新组织。
    2.邀请希望将应用程序转移到组织的人。他们接受邀请后,将其访问权限更改为“管理员”。
    3.导航到自己的应用程序,然后单击“管理应用程序”按钮(在该应用程序的“入门”页面上,在右上角)。点击那里的转移按钮,将应用转移到组织。请注意,尽管将来会更改此操作,但当前无法撤消该操作。
    4.受邀者接受后,选择创建的组织并从中删除自己。

    部署管理

    虽然每个App有对应的平台,但是对于 CodePush 而言,只是一个分组而已。他会帮助开发人员完成从测试、QA、过度环境,完成最后的生产环境。

    注意:将看到下面的release,promote并rollback命令是需要应用程序的名称,并以工作部署名称,因为它是唯一标识分布点两者的组合(例如我要发布的更新将我的iOS应用发送给Beta测试人员)。

    每当使用CLI注册应用程序时,默认情况下,CodePush服务都会包括两个部署:Staging(过度环境)和Production(生产环境)。如果这两个环境无法满足测试过程,可以使用:
    code-push deployment add <appName> <deploymentName>

    appName:应用名称
    deploymentName:部署环境名称

    与应用程序一样,您也可以分别使用以下命令来删除和重命名部署:

    code-push deployment rm <appName> <deploymentName>
    code-push deployment rename <appName> <deploymentName> <newDeploymentName>

    查看指定App下的部署列表详情:
    code-push deployment ls <appName> [--displayKeys|-k]
    查看详情包括:

    1.部署环境名称列表,软件名称等基本信息
    2.部署环境相应的密钥(需要加上 -k 参数)
    3.更新内容表述,版本号,是否强制下发,下发时间
    4.active:当前正在运行此版本的成功安装次数。该指标显示了活跃用户的总数以及代表的总受众人数的百分比。
    5.total:此更新获得的成功安装的总数。
    6.pending:已下载但尚未安装此版本的次数
    7.rollbacks:此版本已在客户端上自动回滚的次数。如果在安装过程中发布了包含崩溃的更新,则CodePush插件会将最终用户回滚到以前的版本,并将该问题报告给服务器。
    8.rollout:表示有资格接收此更新的用户百分比。
    9.disabled:指示该版本是否已标记为已禁用,因此最终用户可以下载该版本。仅对于实际禁用的版本显示此属性。

    发布更新

    在完成上述配置后并下发软件下载包,即可开始发布更新。CodePush CLI包括三个用于发布更新的不同命令:

    • 常规:将由外部工具或构建脚本生成的更新发布到CodePush服务器。在适应现有工作流程方面提供了最大的灵活性。
    • react-native:执行与常规release命令相同的功能,但还处理生成更新的应用程序内容(JS包和资产)的任务。无需多个指令。
    • cordova:同react-native类似效果。

    注意:客户端只能发现和下载部署中的50个最新版本。

    发布更新(常规)

    code-push release <appName> <updateContents> <targetBinaryVersion>
    [--deploymentName <deploymentName>]
    [--description <description>]
    [--disabled <disabled>]
    [--mandatory]
    [--noDuplicateReleaseError]
    [--rollout <rolloutPercentage>]
    [--privateKeyPath <pathToPrivateKey>]
    • appName
      这指定了要为其发布此更新的CodePush应用的名称。
    • updateContents
      这指定了要发布的更新的应用程序代码和资源的位置。可以指定js文件或者目录,但是不要需要对他们压缩,因为codepush会自己完成。
      重要的是,您指定的路径是指特定于平台的应用程序的预准备/捆绑版本。
      平台|准备命令|包路径(相对于项目根)
      -|-|-
      Cordova(Android)|cordova prepare android|对于cordova-android版本7和更高版本:./platforms/android/app/src/main/assets/www目录;对于cordova-android版本6和更早版本:./platforms/android/assets/www目录;
      Cordova(iOS)|cordova prepare ios|./platforms/ios/www 目录
      React Native wo / assets(Android)|react-native bundle --platform android --entry-file <entryFile> --bundle-output <bundleOutput> --dev false|--bundle-output期权的价值
      React Native w / assets(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 w / assets(iOS)|react-native bundle --platform ios --entry-file <entryFile> --bundle-output <releaseFolder>/<bundleOutput> --assets-dest <releaseFolder> --dev false|--assets-dest选项的值,应代表包含您的资产和JS捆绑包的新创建的目录

    • targetBinaryVersion
      这指定了要为其发布更新的应用程序的存储//二进制版本,以便只有运行该版本的用户才能收到更新,而运行较旧和/或较新版本的应用程序二进制文件的用户则不会。出于以下原因,这很有用:

      如果用户运行的是较旧的二进制版本,则CodePush更新中的重大更改可能与他们所运行的版本不兼容。
      如果用户正在运行较新的二进制版本,则假定他们正在运行的版本与CodePush更新较新(并且可能不兼容)。
      如果希望通过更新来定位应用商店二进制文件的多个版本,我们还允许您将参数指定为semver range表达式。这样,任何运行满足范围表达式(即semver.satisfies(version, range)return true)的二进制版本的客户端设备都将获得更新。有效的semver范围表达式的示例如下:
      范围表达|谁得到更新
      -|-
      1.2.3|仅运行特定二进制应用程序商店版本1.2.3的设备
      *|任何配置为使用CodePush应用程序更新的设备
      1.2.x|运行主要版本1,次要版本2和应用程序的任何修补程序版本的设备
      1.2.3 - 1.2.7|在1.2.3(包括)和1.2.7(包括)之间运行任何二进制版本的设备
      >=1.2.3 <1.2.7|运行介于1.2.3(包含)和1.2.7(包含)之间的任何二进制版本的设备
      1.2|相当于 >=1.2.0 <1.3.0
      ~1.2.3|相当于 >=1.2.3 <1.3.0
      ^1.2.3|相当于 >=1.2.3 <2.0.0
      注意:如果您的semver表达了特殊的shell字符或运营商,如启动>,^或** ,该命令可能不正确,如果你不用引号括作为外壳将不提供正确的价值观对我们的CLI值执行处理。因此,最好targetBinaryVersion在调用release命令时将参数用双引号引起来,例如code-push release MyApp-iOS updateContents “>1.2.3”。
      下表概述了CodePush希望更新的版本范围可以满足每种应用类型的版本值:
      平台|应用商店版本的来源
      -|-
      科尔多瓦|文件中的<widget version>属性config.xml
      React Native(Android)|文件中的android.defaultConfig.versionName属性build.gradle
      React Native(iOS)|文件中的CFBundleShortVersionString密钥Info.plist
      React Native(Windows)|文件中的<Identity Version>密钥Package.appxmanifest
      如果用户正在运行较新的二进制版本,则假定他们正在运行的版本与CodePush更新较新(并且可能不兼容)。

    • deploymentName
      这指定要将更新发布到哪个部署。默认值为Staging,但是准备部署到Production或自定义部署之一时,只需显式设置此参数即可。
      注意:可以使用“ —deploymentName”或“ -d”来设置参数。

    • description
      这为部署提供了一个可选的“更改日志”。该值只是往返于客户端,以便在检测到更新时,应用可以选择将其显示给最终用户(例如,通过“新功能”对话框)。该字符串接受诸如\n和的控制字符,\t因此可以在描述中包括空格格式,以提高可读性。
      注意:可以使用“ —description”或“ —des”设置此参数

    • disabled
      这指定更新是否应由最终用户下载。如果未指定,则不会禁用该更新。如果您要发布一个无法立即获得的更新,则此参数非常有用,直到您希望最终用户能够下载该更新。
      注意:可以使用“ —disabled”或“ -x”设置此参数

    • mandatory
      这指定是否应将更新视为强制性更新(例如,该更新包含重要的安全修复程序)。
      例如,假设您对应用发布了以下三个更新:
      Release|Mandatory\?
      v1|No
      v2|Yes
      v3|No

      如果最终用户当前正在运行v1,并且他们查询服务器以获取更新,它将以v3(因为这是最新的)响应,但是由于在两者之间发布了强制更新,因此它将动态地将发布转换为强制更新。
      如果最终用户当前正在运行v2,并且他们查询服务器以获取更新,它将以响应v3,但将发行版保留为可选。
      注意:可以使用—mandatory或设置此参数。-m

    • noDuplicateReleaseError
      这指定如果更新与部署中的最新版本相同,则CLI应该生成警告而不是错误。

    • rolloutPercentage
      该参数指定应有资格接收此更新的用户百分比(为1和之间的整数100)。如果您想让一部分受众(例如25%)“发布”新版本,并获得反馈和/或注意异常/崩溃,这可能会有所帮助,然后再将其广泛提供给所有人。如果未设置此参数,则将其设置为100%。
      利用推出功能时,需要牢记一些其他注意事项:

      1.不能将最新更新发布到其最新发布为“Active”发布(即,其发布属性为非null)的部署中。必须先完成部署(即,将该rollout属性设置为100),然后才能发布对部署的进一步更新。即必须
      2.如果回滚最新版本为“active”的部署,则将清除回滚值,从而有效地“暂停”回滚行为。
      3.与mandatory和description字段不同,当需要将发布从一个部署升级到另一个部署时,它不会传播该rollout属性,因此,如果希望新发布(在目标部署中)具有部署值,则需要显式设置它当您调用promote命令时。
      注意:为了使此参数真正生效,您的最终用户需要运行CodePush插件的版本1.6.0-beta+(对于Cordova)或1.9.0-beta+(对于React Native)。如果发布的更新指定了rollout属性,则运行较旧版本的Cordova或React Native插件的最终用户将无资格获得此更新。因此,在您采用必要版本的特定于平台的CodePush插件之前(如前所述),我们建议您不要在发行版中设置推广值,因为没有人最终会收到它。
      注意:可以使用—rollout或设置此参数。-r

    • pathToPrevatekey
      此参数指定用于生成更新签名的私钥文件的路径。如果省略了私钥路径参数,则将忽略代码推送插件中的签名验证。
      注意:仅Android和iOS平台上的React Native应用程序支持此选项。

    发布更新(React-Native)

    code-push release-react <appName> <platform>
    [--bundleName <bundleName>]
    [--deploymentName <deploymentName>]
    [--description <description>]
    [--development <development>]
    [--disabled <disabled>]
    [--entryFile <entryFile>]
    [--gradleFile <gradleFile>]
    [--mandatory]
    [--noDuplicateReleaseError]
    [--outputDir <outputDir>]
    [--plistFile <plistFile>]
    [--plistFilePrefix <plistFilePrefix>]
    [--sourcemapOutput <sourcemapOutput>]
    [--targetBinaryVersion <targetBinaryVersion>]
    [--rollout <rolloutPercentage>]
    [--privateKeyPath <pathToPrivateKey>]
    [--config <config>]

    简化了释放通过执行以下附加行为更新的过程:

    1.运行react-native bundle命令以生成将被发布到CodePush服务器的更新内容(JS包和资源)。它尽可能使用明智的默认值(例如,假设iOS入口文件命名为index.ios.js,创建非开发版本),而且还公开相关react-native bundle参数以实现灵活性(例如—sourcemapOutput)。
    2.targetBinaryVersion通过使用项目Info.plist(对于iOS)和build.gradle(对于Android)文件中指定的版本名称来推断此发行版。

    举个例子:
    一般发布需要打包和发布两个操作:

    // 打包
    react-native bundle --platform ios \
    --entry-file index.ios.js \
    --bundle-output ./CodePush/main.jsbundle \
    --assets-dest ./CodePush \
    --dev false
    // 发布
    code-push release MyApp-iOS ./CodePush 1.0.0

    使用此命令可以一步完成:
    code-push release-react MyApp-iOS ios

    • appName
      同上

    • platform
      这指定了当前更新所定位的平台,并且可以是android,ios或windows(不区分大小写)。该值仅用于确定如何正确捆绑更新内容,而实际上并未发送到服务器。

    • bundleName
      这指定了应用于生成的JS包的文件名。如果未指定,则标准捆绑包名称将用于指定的平台:main.jsbundle(iOS),index.android.bundle(Android)和index.windows.bundle(Windows)。
      注意:可以使用—bundleName或-b设置此参数

    • updateContents
      同上

    • targetBinaryVersion
      同上

    • deploymentName
      同上

    • description
      同上

    • development
      这指定是否生成未缩小的开发JS包。如果未指定,则默认为false禁用警告并缩小包的位置。
      注意:可以使用—development或—dev设置此参数

    • disabled
      同上

    • entryFile
      这指定了应用程序的根/条目JavaScript文件的相对路径。如果未指定,则默认为index.ios.js(对于iOS), index.android.js(对于Android)或index.windows.bundle(对于Windows)(如果该文件存在)
      注意:可以使用—entryFile或-e设置此参数

    • gradleFile(仅适用于Android)
      这指定了build.gradle在尝试自动检测发行版的目标二进制版本时CLI应该使用的文件的相对路径。此参数仅适用于高级方案,因为CLI可以自动build.grade在“标准” React Native项目中找到您的文件。但是,如果gradle文件位于CLI找不到的任意位置,则使用此参数可以使您继续释放CodePush更新,而无需显式设置--targetBinaryVersion参数。由于build.gradle是必需的文件名,因此指定包含文件夹的路径或文件本身的完整路径都将达到相同的效果。

    • plistFile(仅适用于IOS)
      这指定了Info.plist在尝试自动检测发行版的目标二进制版本时CLI应该使用的文件的相对路径。该参数仅适用于高级方案,因为CLI可以自动Info.plist在“标准” React Native项目中找到您的文件,并且您可以使用该--plistFilePrefix参数来支持每个环境的plist文件(例如STAGING-Info.plist)。但是,如果您的plist位于CLI找不到的任意位置,则使用此参数可以使您继续释放CodePush更新,而无需显式设置--targetBinaryVersion参数。
      注意:可以使用—plistFile或-p设置此参数

    • plistFilePrefix(仅适用于IOS)
      这指定了Info.plistCLI在尝试自动检测发行版的目标二进制版本时应使用的文件的文件名前缀。如果你已经创建了每个环境的plist文件(例如,这可能是有用的DEV-Info.plist,STAGING-Info.plist),并且希望能够释放CodePush更新,而无需显式设置的—targetBinaryVersion参数。通过指定 —plistFilePrefx,CLI将在以下位置查找一个名为的文件<prefix>-Info.plist,而不是简单的文件名Info.plist(这是默认行为):./ios和./ios/<appName>。如果您的plist文件不在这两个目录中(例如,您的应用程序是具有嵌入式RN视图的本机iOS应用程序),或者使用了完全不同的文件命名约定,请考虑使用—plistFile参数。
      注意:可以使用—plistFilePrefix或—pre设置此参数

    • sourcemapOutput
      这指定了将生成的JS包的源映射文件写入的相对路径。如果未指定,将不会生成源映射。
      注意:可以使用—sourcemapOutput或-s设置此参数

    • outputDir
      这指定资源,JS捆绑包和源地图文件应写入的相对路径。如果未指定,则资源,JS捆绑包和源地图将被复制到该/tmp/CodePush文件夹中。
      注意:复制之前,指定文件夹中的所有内容将被删除
      注意:可以使用—outputDir或-o设置此参数

    • mandatory
      同上

    • noDuplicateReleaseError
      同上

    • rolloutPercentage
      同上

    • pathToPrevatekey
      同上

    发布更新(Cordova)

    略…

    调试CodePush集成

    为了调试CodePush更新发现体验,可以运行以下命令,以便在应用程序中轻松查看CodePush插件生成的诊断日志:
    code-push debug <platform>
    注意:该命令无法调试ios真机

    修补更新参数

    发布更新后,在某些情况下,需要修改与之关联的一个或多个数据属性(例如,忘记将关键的错误修复标记为强制性的,希望增加更新的发布百分比)。可以通过运行以下命令轻松地执行此操作:

    code-push patch <appName> <deploymentName>
    [--label <releaseLabel>]
    [--mandatory <isMandatory>]
    [--description <description>]
    [--rollout <rolloutPercentage>]
    [--disabled <isDisabled>]
    [--targetBinaryVersion <targetBinaryVersion>]

    注意:此命令不允许修改发行版的实际更新内容,除了appName和deploymentName,其他都是可选参数

    • releaseLabel
      用于指定在哪个版本上进行更新。如果省略,则请求的更改将应用于指定部署中的最新版本。
      为了查找要更新的发行版的标签,您可以运行下面命令查看当前版本列表
      code-push deployment history
      注意:可以使用—label或设置此参数。-l

    • isMandatory
      仅允许更新是否应将发行版视为强制发行。
      注意:请注意,—mandatory和—mandatory true是等效的;而省略则是忽略,而不是—mandatory false。

    • description

        仅允许更新与发行版关联的描述(例如,在发行时输入了错字,或者根本没有添加描述)。如果省略此参数,则不会更改目标版本的description属性的值。
      
    • rolloutPercentage
      仅允许您增加目标发行版的推出百分比。只能将此参数设置为一个值,该值大于当前推出的值。
    • isDisabled
      仅允许您更新是否应禁用发行版。
      注意:请注意,—disabled和—disabled true是等效的;而省略则是忽略,而不是—disabled false。

    • targetBinaryVersion
      仅允许更新semver范围,该范围指示发行版与哪个二进制版本兼容。如果在最初发布更新时犯了一个错误(例如,指定1.0.0但表示1.1.0),或者想增加或减少该版本支持的版本范围(例如,发现某个发布根本无法使用1.1.2),这将非常有用。。如果忽略此参数,则不会更改目标发行版的version属性的值。

    发布更新

    一旦针对特定的部署(例如Staging)测试了更新,并希望将其“下游”升级(例如dev-> staging,staging-> production),则只需使用以下命令从一个版本复制发布部署到另一个:

    code-push promote <appName> <sourceDeploymentName> <destDeploymentName>
    [--description <description>]
    [--label <label>]
    [--disabled <disabled>]
    [--mandatory]
    [--noDuplicateReleaseError]
    [--rollout <rolloutPercentage>]
    [--targetBinaryVersion <targetBinaryVersion]

    该promote命令将为目标部署创建一个新版本,其中包括源部署的最新版本中的确切代码和元数据(描述,强制性版本和目标二进制版本)。尽管可以使用release命令“手动”将更新从一个环境迁移到另一个环境,但该promote命令具有以下优点:

    1.速度更快,因为不需要重组要发布的发行资产,也不需要记住与源部署的发行版关联的描述/应用商店版本。
    2.由于提升操作可确保已在源部署(例如Staging)中测试的确切内容在目标部署(例如Production)中变为活动状态,因此它不那么容易出错。

    • descriptin
      同上,仅允许您覆盖将用于升级版本的描述。

    • label
      使用此可选参数,可以从源部署中选择指定的标签,并将其升级到目标部署。如果未指定,则将升级源部署上的最新版本。

    • disabled
      同上,仅允许您覆盖将用于升级版本的Disabled标志的值。如果未指定,则新版本将继承要升级的版本的disabled属性。

    • mandatory
      同上,仅允许您覆盖将用于升级版本的强制性标志。如果未指定,则新版本将继承要升级的版本的必需属性。

    • noDuplicateReleaseError
      同上

    • rolloutPercentage
      同上,并允许指定是否仅将新创建的发行版提供给部分用户。与其他发布元数据参数(例如description)不同,rollout发布的不会作为升级的一部分进行继承/继承,因此,如果不希望新创建的发布可用于所有人,则需要显式设置此设置。

    • targetBinaryVersion
      同上,仅允许覆盖将用于升级版本的目标二进制版本。如果未指定,则新版本将继承要升级的版本的目标二进制版本属性。

    回滚更新

    部署的发布历史记录是不可变的,因此一旦发布了单个更新,便不能删除或删除它们,而又不能删除所有部署的发布历史记录。但是,如果发布的更新已损坏或包含意外功能,则可以使用以下rollback命令轻松将其回滚:

    code-push rollback <appName> <deploymentName>
    code-push rollback MyApp-iOS Production

    这具有为部署创建一个新版本的作用,该版本包括与最新版本完全相同的代码和元数据。例如,假设向应用发布了以下更新:
    Release|描述|Mandatory
    -|-|-
    v1|初版本|Yes
    v2|新增功能|No
    v3|修复bug|Yes

    如果rollback在该部署上运行该命令,v4则将创建一个包含v2发行版内容的新发行版
    Release|描述|Mandatory
    -|-|-
    v1|初版本|Yes
    v2|新增功能|No
    v3|修复bug|Yes
    v4(从v3还原到v2)|新增功能|没有

    v3现在,已经获取的最终用户将被“移回”到v2该应用执行更新检查时。此外,所有仍在运行的用户v2(因此从未获得过)不会v3收到更新,因为他们已经在运行最新版本(这就是为什么我们的更新检查除了使用发布标签之外,还使用程序包哈希值的原因)。

    如果要将部署回滚到除先前版本以外的版本(例如v3-> v2),则可以指定可选--targetRelease参数:
    code-push rollback MyApp-iOS Production --targetRelease v34

    注意:回滚产生的发行版将在deployment history命令的输出中进行注释,以帮助更轻松地识别它们。

    查看发行记录

    可以使用以下命令查看特定应用程序部署的50个最新版本的历史记录:
    code-push deployment history <appName> <deploymentName>
    注意:也可以使用“ h”别名来运行history命令

    清除发布历史记录

    虽然无法删除单个发行版,但是可以使用以下命令清除与部署关联的整个发行版历史记录:
    code-push deployment clear <appName> <deploymentName>
    运行此命令后,配置为使用其关联的部署密钥接收更新的客户端设备将不再接收已清除的更新。此命令是不可逆的,因此不应在生产部署中使用。

    代码签名

    他是什么

    代码签名是为捆绑创建数字签名的一种方式,以后可以在安装之前在客户端进行验证。

    为什么需要

    开发人员想知道他们交付的代码就是他们编写的代码。代码签名是提供这种保证的主要机制,可以帮助减轻或消除整个中间级攻击。

    如何工作

    首先,开发人员生成一个非对称密钥对:私钥将用于对捆绑包进行签名;捆绑签名验证的公共密钥。该CodePush CLI然后使用私钥签名过程中捆绑release,release-react并release-cordova命令。公共密钥随移动应用程序一起提供。开发人员可以控制密钥的生成和管理。

    三、react-native-code-push

    Android与Ios只是说了配置及基础更新方式。具体js层代码描述、API,都在Js中具体说明。

    Android

    npm install react-native-code-push —save OR yarn add react-native-code-push

    安装库

    npm install react-native-code-push --save
    # 或者
    yarn add react-native-code-push

    基本配置

    [官方网址效果最佳]https://github.com/microsoft/react-native-code-push/blob/master/docs/setup-android.md

    配置时需要注意自己项目的react-native版本号对应上,否则会出现很多问题。

    以下react-native版本:0.63的配置实例:

    1.android/settings.gradle中添加以下配置

    include ':app', ':react-native-code-push'
    project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')

    2.android/app/build.gradle中添加以下配置
    apply from: "../../node_modules/react-native/react.gradle"
    apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"

    3.MainApplication.java中添加以下配置
    // 1. Import the plugin class.
    import com.microsoft.codepush.react.CodePush;

    public class MainApplication extends Application implements ReactApplication {

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    ...

    // 2. Override the getJSBundleFile method in order to let
    // the CodePush runtime determine where to get the JS
    // bundle location from on each app start
    @Override
    protected String getJSBundleFile() {
    return CodePush.getJSBundleFile();
    }
    };
    }

    4.配置gradle版本号app/build.gradle从两位改为三位
    android {

    defaultConfig {
    versionName "1.0.0"
    }

    5.添加Deployment Key,将需要更新的值复制到res/values/strings.xml
    !github
    <resources>
    <string name="app_name">AppName</string>
    <string moduleConfig="true" name="CodePushDeploymentKey">DeploymentKey</string>
    </resources>

    6.编译!
    7.JS中引入
    import CodePush from 'react-native-code-push';

    打包(Android基础包)

    指令:

    ./gradlew assembleRelease

    GUI:
    双击-Gradle-AppName-app-Tasks-other-assembleRelease
    !github

    完成的包就在app/build/output/文件夹下。

    开启第一次更新(简单实例)

    1.修改需要改动的js代码(原生代码无法更新)
    2.打包
    使用上面说明的指令或者GUI方式两种都可以。这里推荐GUI方式,因为这里可以看到很多日志。
    !github
    3.上传更新包,这里分别使用release-reactrelease的方式来记录过程。

    • 3.1 code-push release-react
      此方式不需要多想,直接敲命令行:
      code-push release-react CodePushDemoAndroid android -t 1.0.0 -m --des "1.0.1版本更新测试"
      -t:需要更新的基础版本号
      -m:是否强制更新
      —des:当前更新描述
    • 3.2 code-push release
      此方式需要两个步骤,需要进行jsbundle打包,然后推送到服务器上。
      # jsbundle打包 assets文件夹需要手动创建,也可以自定义位置
      react-native bundle --entry-file index.js --platform android --dev false --bundle-output ./android/app/src/main/assets/index.android.bundle --assets-dest ./android/app/src/main/assets/
      # 推送到服务器上
      code-push release CodePushDemoAndroid ./android/app/src/main/assets 1.0.0 -m --des "1.0.1版本更新测试"
      第一步,将js与资源打包成bundle文件及资源文件。
      第二部,将指定的文件夹内资源推送至服务器
      1.0.0:需要更新的基础版本号
      -m:是否强制更新
      —des:当前更新描述
      注意,出了任何问题可以清空更新库(code-push deployment clear CodePushDemoAndroid Staging)然后再做上传文件进行更新。

    code-push release-react 还是 code-push release ?

    上面实例可以看出,前者提供了方便的套餐方式,过程不需要介入;而后者更将步骤显现的更清晰。

    Android-API

    [官方网址]https://github.com/microsoft/react-native-code-push/blob/master/docs/api-android.md

    Public Key:用于代码签名功能中的捆绑包验证。添加到app/src/main/res/values/strings/xml

    <string moduleConfig="true" name="CodePushPublicKey">your-public-key</string>

    Server Url:用于指定CodePush服务器网址。
    <string moduleConfig="true" name="CodePushServerUrl">https://yourcodepush.server.com</string>

    CodePush创建
    CodePush(String deploymentKey,Activity mainActivity)
    CodePush(String deploymentKey,Activity mainActivity,bool isDebugMode)
    CodePush(String deploymentKey,Context contextboolean isDebugMode,Integer publicKeyResourceDescriptor)
    CodePush(String deploymentKey,Context contextboolean isDebugMode,String serverUrl)

    isDebugMode: 是否置于调试模式
    publicKeyResourceDescriptor: 允许指定读取公共密钥内容所需的公共密钥资源描述符。
    serverUrl: 允许指定CodePush Server Url。默认值:”https://codepush.appcenter.ms/"被中指定的值覆盖serverUrl。

    其中还可以使用构建者模式CodePushBuilder

    static 函数

    getBundleUrl():返回index.android.bundle路径。
    getBundleUrl(String bundleName)
    CodePush.getJSBundleFile()
    CodePush.getJSBundleFile(String assetsBundleFileName):
    getPackageFolder():返回当前更新文件夹的路径。
    overrideAppVersion(String appVersionOverride):设置应用程序二进制接口的版本,否则默认指定为Play商店的版本versionName中build.gradle。

    IOS

    JS代码

    四、code-push-server

    上面所使用的推送库都是微软所在的外网下。可以通过code-push-server来快速部署一个局域网下的热更新服务。
    以下过程是在对codepush环境存在的情况下完成的。

    下载库

    npm install code-push-server -g

    还需要code-push-cli

    MySql

    功能需要用到mysql服务。根据环境来配置MySql(建议使用5.6)。此处忽略

    修改数据存储路径

    code-push-server文件夹下的config/config.js文件

    local: {
    // Binary files storage dir, Do not use tmpdir and it's public download dir.
    // 修改数据存储路径
    storageDir: process.env.STORAGE_DIR || "/Users/.../stroage",
    // Binary files download host address which Code Push Server listen to. the files storage in storageDir.
    // 修改为外网地址
    downloadUrl: process.env.LOCAL_DOWNLOAD_URL || "http://172.30.109.40:3000/download",
    // public static download spacename.
    public: '/download'
    },

    数据库初始化

    打开数据库服务,然后输入下面命令:

    code-push-server-db init --dbhost localhost --dbuser root --dbpassword '数据库root账户密码'

    此处配置的数据库信息,都对应在code-push-server文件夹下的config/config.js文件

    另外里面还有其他配置项:

    common里面的storageType,dataDir
    对应的storagetype中的配置
    如果使用的是local,就需要修改storageDir和downloadUrl,不修改的话他就会自己创建相应文件夹,可能遇到无法创建的问题。

    开启服务

    运行命令开启服务(注意数据库服务是否开启):

    code-push-server

    [web地址]http://127.0.0.1:3000
    初始化用户名:admin
    初始化密码:123456

    登陆后获取token,用于code-push登陆

    code-push配置

    登陆

    code-push login 127.0.0.1:3000

    数据完成后会提示输入token值,就是登陆web页面后获取的token值,复制即可。

    其他所有工作都使用code-push完成

    react-native配置

    修改CodePush的更新地址即可:YourCodePushServerUrl: http://外网地址:3000