1、获取CodePush CLI
需要通过NodeJS-based CLI管理CodePush账户。在终端输入npm install -g code-push-cli就可以安装。
注:在OS X或者Linux,需要使用sudo作为前缀。
2、创建一个CodePush账户
发布和更新之前首先需要创建一个CodePush账户,创建账户只需要在终端输入code-push register命令,然后通过你的GitHub或者Microsoft帐户验证通过。
3、在服务端注册App
为了让服务器了解你的App,只需注册一个能够辨认的应用名。例如:code-push app add MyApp
4、在工程中引入CodePush(CodePush-ify your app)
将需要的CodePush客户端SDK引入到项目中,并且配置监听app部署的服务器更新,下面提供不同App的具体配置方法:
5、发布一个App更新
当项目的代码或者资源改变后,使用CLI命令把更新推送到移动终端,CLI命令必须是合适的命令(React Native或者Cordova),并且说明CodePush应用的名字和需要更新的终端类型(iOS或者Android)。
React Native
在CodePush CLI运行release-react命令,获取你的JavaScript和资源文件包并将这个更新发送到CodePush服务器。
例如:code-push release-react MyApp ios.
iOS安装方式
当你获得CodePush plugin 后,你需要将它引入到你的React Native应用,并且按照下边的步骤正确配置。
Plugin Installation (iOS)
为了给尽可能多的程序爱好者提供便利,CodePush plugin通过三种途径支持iOS安装:
1、RNPM -React Native Package Manager(RN包管理器)
RN包管理器是一个令人惊叹的工具,是我经历过的安装过程最简单的React Native plugin工具。如果你准备好或者想要试用React Native,我们推荐你用这种方式。
2、CocoaPods
如果你正在开发一个嵌入React Native的原生iOS应用,或者你只是比较喜欢食用CocoaPods,那么推荐使用绑定在我们插件中的Podspec(不会翻译后半句then we recommend using the Podspec file that we ship as part of our plugin.)。
3、“Manual” - (手动)
如果你不想依赖任何附加的工具或者一些额外的步骤(都是一些一次性的步骤),那么用手动的方式。
这里先介绍一下CocoaPods
设置iOS - CocoaPods引入插件
1、把CodePush插件依赖引入到你的Podfile,指向NPM安装路径
pod 'CodePush', :path => './node_modules/react-native-code-push'
CodePush依赖于复制一个SSZipArchive库,所以如果你的工程已经包含它(不管是直接导入还是间接依赖),你就可以在不包含CodePush的工程导入一个版本,通过使用Core子类描述:
pod 'CodePush', :path => './node_modules/react-native-code-push', :subspecs => ['Core']
注:上边的路径依赖于你app的Podfile做适当调整。
2、运行 pod install
注:CodePush .podspec 的文件依赖于 Pod中的 React,所以为了确定你可以在项目中正确使用React Native的版本,请确定在项目中正确设置这个 React的Podfile,参考这里。
插件配置(iOS)
如果你的Xcode工程已经设置CodePush插件,你需要配置app本地JS bundle的CodePush,确保它是和CodePush服务器发布的版本同步。按照下面的步骤来做:
1、打开AppDelegate.m文件,引入CodePush的头文件
#import "CodePush.h"
2、找到下面这行用来加载JS Bundle文件的代码:
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
3、替换成下面这行代码:
jsCodeLocation = [CodePush bundleURL];
这次修改是为了配置应用使用App最新的JS bundle 版本。第一次加载的时候,这里会和app编辑的文件相同,在通过CodePush推送更新后,会返回最新安装的更新。
注:bundleURL方法替换应用名为main.jsbundle的JS bundle。如果你使用的其它的文件名,只需要使用bundleURLForResource:方法(如果你使用的是.jsbundle扩展名)或者使用bundleURLForResource:withExtension:方法加载其它的扩展名。
一般来说,我们只是在发布版本中想要使用CodePush推送的JS Bundle,所以推荐使用DEBUG宏定义,根据是否在debugging来动态选择使用包文件或者是CodePush。这样就会比较简单的确保你的程序正确运行,方便debugging
NSURL *jsCodeLocation;
#ifdef DEBUG
jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
#else
jsCodeLocation = [CodePush bundleURL];
#endif
为了让CodePush运行的时候知道需要更新哪些应用,打开项目的Info.plist文件添加一个新的键CodePushDeploymentKey,值就是你配置的让app连接的服务(例如:部署FooBar应用的Staging的key)。可以运行code-push deployment ls FooBar -k命令来获得这个值(这里的 -k 必须保留,因为默认不显示),然后复制Deployment Key列的值,这个是就是想要依赖的服务(看下图)。注意,只是使用键名(例如:Staging)不回有作用。这个“友好”的名字只是CLI的管理习惯,不是注册到项目里的名字。
为了有效的在部署好的项目里使用Staging和Production,建议在使用CodePush前查看此文档multi-deployment testing
发布更新
发布更新之前,需要先把 js打包成 bundle,以下是anroid的做法:
第一步 在 工程目录里面新增 bundles文件:mkdir bundles
第二步 运行命令打包 react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试。
这是我的打包命名: react-native bundle --platform ios --entry-file index.ios.js --bundle-output ./bundles/main.jsbundle --dev yes
注意platform ios小些
参数说明:
input:项目目录(默认为当前目录)
entry:入口文件名称(默认为 index.js)
output:输出目录(默认为 ./build 目录)
bundle:默认输出文件名称与入口文件同名,也可指定文件名
common:是否打common包(默认为false)
平台可以选择 android 或者 iOS。
打包bundle结束后,就可以通过CodePush发布更新了。在控制台输入code-push release <应用名称><对应的应用版本>
--deploymentName 更新环境
--description 更新描述
--mandatory 是否强制更新
注意:CodePush默认是更新 staging 环境的,如果是staging,则不需要填写 deploymentName。如果有 mandatory 则会让客户端强制更新对应的应用版本(targetBinaryVersion)是指当前app的版本,而不是你填写的更新版本。譬如客户端版本是 1.0.0,如果我们需要更新客户端,那么targetBinaryVersion填的就是 1.0.0。(踩了坑,半夜调试到哭了- -)在控制台输入 code-push deployment historyStaging 可以看到版本更新的时间、描述等等属性。
我的打包发布新版本
react-native bundle --entry-file index.ios.js --bundle-output ios/main.jsbundle
code-push release 微财物 ./ios/main.jsbundle 1.1.1