RN下CodePush配置与简单使用

在此简单记录下CodePush的使用,以备以后使用。

环境版本

react-native:0.61
react-native-code-push:6.2.0

CodePush安装

CodePush官方使用详情

  1. 安装App Center CLI
// 打开终端,直接输入以下代码,安装App Center CLI
npm install -g appcenter-cli
  1. 登录现有的CodePush帐户或创建新的App Center帐户
appcenter login

此命令将启动一个浏览器窗口,要求您使用GitHub或Microsoft帐户进行身份验证。它将生成一个访问密钥,您必须将其复制/粘贴到CLI中(它将提示您输入密码)。

  • 其他相关命令
// 退出登录
appcenter logout
// 查看账户信息
appcenter profile list
  1. 在App Center创建应用
// appDisplayName:创建的应用名称
// operatingSystem:iOS或者Android操作系统
appcenter apps create -d <appDisplayName> -o <operatingSystem>  -p React-Native

// 针对iOS和Android单独创建应用 --
// 1、创建iOS应用
appcenter apps create -d MyApp-iOS -o iOS -p React-Native
// 2、创建Android应用
appcenter apps create -d MyApp-Android -o Android -p React-Native
  • 其他相关命令
// 查询账号下的所有应用
appcenter apps list
  1. 给应用配置环境(开发、生产)
// ownerName:用户名称
// appName:创建的应用名称

// 配置开发环境
appcenter codepush deployment add -a <ownerName>/<appName> Staging
// 配置生产环境
appcenter codepush deployment add -a <ownerName>/<appName> Productionn
  • 其他相关命令
// ownerName:用户名称
// appName:创建的应用名称

// 删除应用的开发环境
appcenter codepush deployment remove -a <ownerName>/<appName> Staging
// 删除应用的生产环境
appcenter codepush deployment remove -a <ownerName>/<appName> Production
// appName:应用名称
// 查看该应用下的所有配置环境
code-push deployment ls <appName> -k

以上是在App Center配置相关内容的所有命令
除了使用指令来创建配置应用外,还可以直接去App Center进行配置查看

AppCenter可视化操作

AppCenter官方地址

  1. 点击右上角Add new按钮选择Add new app创建新应用,然后根据提示框进行填写内容。
    注意:此处填写,还是 建议将iOS和Android分开创建,方便后期管理。
  2. 点击创建好的应用,进入配置界面(此处以“Test-iOS”作为例子)。点击左侧菜单栏,选择Distribute,选择CodePush
    2.jpeg
  3. 配置开发环境。点击Create standard deployments按钮后,将自动给该应用创建好StagingProduction两种环境。
  4. 查看、修改、删除配置环境。点击右上角🔧按钮,可以查看当前应用的两种配置环境。点击配置环境后的...可以修改和删除对应的环境。

App Center的基本使用就这些,详细的其他使用方法,可以根据界面提示自我探索。

RN应用中配置CodePush

此处直接进行多环境配置

  1. 项目安装配置CodePush三方库
npm install --save react-native-code-push
  1. CodePush与组件绑定使用
import codePush from "react-native-code-push";

class MyApp extends Component {
  // ...
}

let codePushOptions = {
  // 何时检查更新(ON_APP_START:程序启动  ON_APP_RESUME:程序从后台进入前台  MANUAL:手动控制)
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME,
  // 何时安装(ON_NEXT_RESTART:下次程序启动  ON_NEXT_RESUME:下次程序从后台进入前台  ON_NEXT_SUSPEND:在后台更新  IMMEDIATE:立即更新,并启动程序)
  installMode: codePush.InstallMode.IMMEDIATE,
  // 表示重启程序之前,在后台呆的最短时间
  minimumBackgroundDuration: 0,
  // 强制更新,并启动
  mandatoryInstallMode: codePush.InstallMode.IMMEDIATE,
  // 更新时候的提示更新框
  updateDialog: {
    // 标题
    title: '发现新版本',

    // 确认按钮标题
    optionalInstallButtonLabel: '更新',
    // 忽略按钮标题
    optionalIgnoreButtonLabel: '忽略',
    // 非强制更新情况下,提示框内容
    optionalUpdateMessage: '有新内容,是否需要更新?',

    // 强制更新按钮标题
    mandatoryContinueButtonLabel: '立即更新',
    // 强制更新情况下,提示框内容
    mandatoryUpdateMessage: '有新内容,请立即更新',

    // 是否将版本描述添加在提示框中
    appendReleaseDescription: true,
    // 添加的描述前缀
    descriptionPrefix: '更新内容:',
  }
};

export default codePush(codePushOptions)(App);
iOS中配置环境

设置 iOS GitHub地址
配置iOS环境GitHub地址

  1. 打开AppDelegate.m文件,添加头文件
#import <CodePush/CodePush.h>
  1. 替换捆绑JS文件,只有在release状态下,才会调用CodePush服务器中的代码
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
  #if DEBUG
    return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
  #else
    return [CodePush bundleURL];
  #endif
}
  1. 添加Staging配置环境。用Xcode打开ios项目,选中项目,点击PROJECT下的项目名,点击菜单栏info,找到Configurations项点击+选择Duplicate "Release" Configuration进行添加
    4-3.jpeg

    注意:上图是已经添加过Staging配置环境的
  2. 配置多环境的秘钥。选择info旁边的Build Settings按钮,点击菜单栏中+按钮,选择Add User-Defined Setting进行添加
    4-4.jpeg
  3. 配置User-Defined,一共需要添加2项自定义配置。
  • 第一个配置,名称设置为CODEPUSH_KEY,将项目在CodePush中的Staging秘钥对应到Staging环境中,Production秘钥对应到Release环境中,Debug环境中置空。
  • 第二个配置,名称设置为CONFIGURATION_BUILD_DIRStaging环境中配置$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)ReleaseDebug环境中配置$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
    注意:第二个配置,需要先配置三个环境值,再设置名称,否则Xcode会闪退,因为CONFIGURATION_BUILD_DIR对应下的值不能为空
    4-5.png
  1. 配置Info.plist,打开项目的Info.plist添加一组值,名为CodePushDeploymentKey,值为$(CODEPUSH_KEY)
    4-6.png
  2. 执行pod install
  3. 运行项目。用Xcode打开项目,选择对应的环境运行,如果运行显示成功,则项目配置完成。
    注意:如果选择Staging运行报错,则可以先运行Release环境,等Release状态运行成功后,再切换为Staging来运行,目前不知道为什么会这样。
  4. 进行测试,进行更新。关闭运行的应用,此时相当于在模拟器上打包了一个对应环境的应用程序。打开终端,进入RN应用的根目录,输入以下命令进行更新提交。提交后,点击模拟器上安装的应用,进行查看热更新情况。
// ownerName:账户名称

// 提交Staging环境下的代码
appcenter codepush release-react -a <ownerName>/App-iOS  -d Staging
// 提交Production环境下的代码
appcenter codepush release-react -a <ownerName>/App-iOS -d Production
// 强制更新
appcenter codepush release-react -a <ownerName>/App-iOS -m
// 添加更新说明
appcenter codepush release-react -a <ownerName>/App-iOS --description "修改bug"
Android中配置环境

设置 Android GitHub地址
配置Android环境GitHub地址

  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')
  1. android/app/build.gradle文件中添加下列代码
  • 添加codepush.gradle
...
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
...
  • android { buildTypes {} }中,给配置环境添加CodePush的秘钥
android {
    ...
    buildTypes {
        debug {
            ...
            // 注意:不应该在Debug模式下测试CodePush更新功能,因为这会被RN的程序所覆盖
            resValue "string", "CodePushDeploymentKey", '""'
            ...
        }

        releaseStaging {
            ...
            // StagingKey是CodePush处申请的Staging状态的下的秘钥
            resValue "string", "CodePushDeploymentKey", '"StagingKey"'

            // Note: It is a good idea to provide matchingFallbacks for the new buildType you create to prevent build issues
            // Add the following line if not already there
            matchingFallbacks = ['release']
            ...
        }

        release {
            ...
            // ProductionKey是CodePush处申请的Production状态的下的秘钥
            resValue "string", "CodePushDeploymentKey", '"ProductionKey"'
            ...
        }
    }
    ...
}

补充:获取Android应用配置环境的key命令:code-push deployment ls <appName> -k

  1. 更新MainApplication.java文件
...
// 1. 导入插件
import com.microsoft.codepush.react.CodePush;

public class MainApplication extends Application implements ReactApplication {

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

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

推荐阅读更多精彩内容