您的位置:首页 > Web前端 > React

React-Native Android集成Code-Push 热更新

2016-11-29 16:42 661 查看

React-Native Android集成Code-Push 热更新

开篇题外话,作为Android原生,对React-Native的态度不算太友好,做出来的应用有些性能是真的卡….卡….卡,所以有的人说只会JS就可以做移动端个人是不敢苟同,在性能爆炸的地方还是得原生来做,进行混合开发。 OK,我们看看React-Native的好处:

1、缩短开发周期,一套JS代码完成逻辑

2、热更新部署,适合电商类活动

一般的APK,打包一次,遇到更新就要到Appstore或者各大应用商店更新。对于初创团队,自身没有时间自行研发热更新的情况大多采用第三方的热更新,微软的Code-Push很好的为我们提供了支持。

下面我们看看如何集成Code-Push.

Code-Push主要特点

支持JS代码与图片资源更新

只能全量更新,暂时不支持增量更新

支持dev, Production, Staging三个环境

安装 CodePush CLI

在终端输入:npm install -g code-push-cli

PS.

npm为NodeJS的包管理器,如果没安装NodeJS请先安装。


若提示权限不够如下图:



加上sudo即可:

sudo  npm install -g code-push-cli


安装完毕以后提示输入:
code-push -v
确认是否安装成功



创建Code-Push账号

在终端输入:code-push register,会打开注册页面让你选择授权账号。




完成相应注册后将会获得一个key,复制到终端即可登录(code-push login)。



PS.
code-push logout后再code-push login 也会跳转到网页获得一个key,复制后到终端即可登录成功。

账号相关命令:

code-push login 登陆

code-push logout 注销

code-push access-key ls 列出登陆的token

code-push access-key rm <accessKye> 删除某个 access-key


CodePush服务器注册app

在终端输入:code-push app add appName

PS.相关命令

code-push app add 在账号里面添加一个新的app

code-push app remove 或者 rm 在账号里移除一个app

code-push app rename 重命名一个存在app

code-push app list 或则 ls 列出账号下面的所有app

code-push app transfer 把app的所有权转移到另外一个账号


集成CodePush SDK

Android:

参考地址

Andorid有 RNPMManual两种更继承方式。这里采用

Manual方式。

1、在 主项目/android/settings.gradle文件下添加如下内容:

include ':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

文件下添加如下依赖:

...
dependencies {
...
compile project(':react-native-code-push')
}


3、在主项目/android/app/build.gradle文件下添加如下依赖:

apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"


4、终端运行
code-push deployment ls appName
获取密钥。

创建部署

在终端输入:code-push deployment add appName deploymentName

查看列出所有部署:code-push deployment ls appName

PS.

code-push deployment rename appName 重命名

code-push deployment rm appName 删除部署

code-push deployment ls appName 列出应用的部署情况

code-push deployment ls appName -k 查看部署的key

code-push deployment history appName deploymentNmae


5、将获取的密钥配置在MainApplication下。

public class MainApplication extends BaseApplication implements ReactApplication {

private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
protected boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}

@Nullable
@Override
protected String getJSBundleFile() {
//            return super.getJSBundleFile();
return CodePush.getJSBundleFile();
}

@Override
protected List<ReactPackage> getPackages() {

return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new WSPackage(),//内部moudle

new CodePush("Your-deployment-key", MainApplication.this, BuildConfig.DEBUG)
);

}
};

@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
}


至此,我们Code-Push集成完毕?那么你就大错特错了,Code-push的版本号需要1.0.0的格式所以我们还需要修改版本号的格式。

defaultConfig {
//     versionName  "1.0.0"
versionName  rootProject.ext.android.versionName
}


这里我自定义了文件使用了路径 ,可参考 android使用Gradle统一配置依赖版本

配置。

Andorid Code-Push的SDK集成到此告一段落。

接下来在JS端进行配置。

JS端集成Code-Push

加载 CodePush模块:

import codePush from 'react-native-code-push'


隐式更新:
codePush.sync();


显示更新:

//显式更新
codePush.sync(
{
updateDialog: updateDialogOptions,
mandatoryInstallMode:codePush.InstallMode.IMMEDIATE,
deploymentKey: 'Your-deployment-key'
},
(status)=>{
if (status == codePush.SyncStatus.INSTALLING_UPDATE) {

}
}
);


把打包JS生成index.android.bundle

第一步: 在 工程目录里面新增 bundles文件:mkdir bundles

第二步: 在终端输入:react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试。

eg:

Android:react-native bundle --platform android --entry-file index.android.js --bundle-output ./bundles/index.android.bundle --assets-dest ./bundles --dev false

PS.
[注意文件目录,保证文件目录正确,该命令需在工程目录下面运行,否则不能打包。]


发布更新

终端输入 code-push release 应用名称 Bundles所在目录 对应的应用版本 --deploymentName: 更新环境 --description: 更新描述 --mandatory: 是否强制更新

eg:
code-push release 玩彩 ./bundles/ 1.0.0 --deploymentName Production --description "新功能足球更新" --mandatory true

PS.版本号必须和应用的版本号保持一致。如1.0.0则只有1.0.0的版本会收到更新提示。


若发布成功:



至此,我们的Code-Push集成完毕,可以愉快的进行热更新部署了。

附上一些常用的更新命令:

回滚版本

在终端输入:code-push rollback appName deploymentName --targetRelease, -r 指定回归到哪个标签,默认是回滚到上一个更新 string

eg:
code-push rollback appName Production
code-push rollback appName Production --targetRelease v4


促进更新

在终端输入:code-push promote appName sourceDeploymentName destDeploymentName –description, –des 描述 string –disabled, -x 该促进更新,客户端是否可以获得更新 boolean –mandatory, -m 是否强制更新 boolean –rollout, -r 此促进更新推送用户的百分比 string

eg:

code-push promote appName Staging Production "appName" 中"Staging" 部署的最新更新发布到"Production" 部署中

code-push promote appName Staging Production –des "Production rollout" -r 25 "appName" 中"Staging" 部署的最新更新发布到"Production" 部署中, 并且只推送25%的用户


修改更新

在终端输入:code-push patch appName deploymentName --label, -l 指定标签版本更新,默认最新版本 string --description, --des 描述 string --disabled, -x 该修改更新,客户端是否可以获得更新 boolean --mandatory, -m 是否强制更新 boolean --rollout, -r 此更新推送用户的百分比,此值仅可以从先前的值增加。 string

eg:

code-push patch appName Production --des "Updated description" -r 50 修改"MyApp"的"Production"部署中最新更新的描述 ,并且更新推送范围为50%

code-push patch appName Production -l v3 --des "Updated description for v3" 修改"MyApp"的"Production"部署中标签为v3的更新的描述


查看历史版本情况:

code-push deployment history appName deploymentName
eg:

code-push deployment history appName Production


查看当前版本情况:

code-push deployment history appName deploymentName

eg:
code-push deployment ls appName


查看部署对应的key:

code-push deployment ls appName -k 查看部署的key,这个key将会在app中存储使用

eg:
code-push deployment ls appName -k


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息