CodePush iOS Setup

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的具体配置方法:

Cordova

React Native (iOS)

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的版本,请确定在项目中正确设置这个 ReactPodfile,参考这里

插件配置(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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容