ReactNative集成CodePush实现热部署(iOS和Android)

一.CodePush简介

CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务。CodePush 是提供给 React Native 和 Cordova 开发者直接部署移动应用更新给用户设备的云服务。CodePush 作为一个中央仓库,开发者可以推送更新 (JS, HTML, CSS and images),应用可以从客户端 SDK 里面查询更新。CodePush 可以让应用有更多的可确定性,也可以让你直接接触用户群。在修复一些小问题和添加新特性的时候,不需要经过二进制打包,可以直接推送代码进行实时更新。

二.安装与注册CodePush

前提:OSX系统,安装了Node.js

使用CodePush之前首先要安装CodePush客户端,终端输入:

npm install -g code-push-cli

安装完毕,查看当前CodePush版本:

code-push -v

这里写图片描述

三.创建CodePush账号

1)终端输入,会打开注册页面让你选择授权账号。你可以通过,Github,或者微软账号授权,授权通过之后,CodePush会告诉你“access key”,复制此key到终端即可完成注册。

code-push register

2)登录CodePush

code-push login

四.在CodePush上注册你的APP(本文以RNDoctor为例)

为了让CodePush知道我们的APP,我们需要注册APP,终端输入,就可完成注册了,注册成功会返回你两个Deployment Key,一个是Production,一个是Staging,之后会用上

code-push app add <yourAppName>

PS:例如我的项目是RNDoctor code-push app add RNDoctor

五.集成CodePush SDK

iOS端

—–原生端的配置—–
1)项目中安装CodePush插件,在你的RN项目的根目录下执行下面命令,安装成功后可以在node_modules文件下找到react-native-code-push

npm install --save react-native-code-push

2)在node_modules/react-native-code-push/ios 目录下找到CodePush.xcodeproj,然后直接拖入iOS项目的Libraries中

这里写图片描述

这里写图片描述

5)在Build Settings的Header Search Paths那一项中加入$(SRCROOT)/../node_modules/react-native-code-push 并点击后面的上下箭头换成recursive

这里写图片描述

6)在项目的AppDelegate.m里面引入
#import "CodePush.h"
7)把didFinishLaunchingWithOptions里面的代码换成

NSURL *jsCodeLocation; 
[[RCTBundleURLProvider sharedSettings] setDefaults];
//debug 是从本地服务器 release 从codepush服务器
#ifdef DEBUG
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@”index.ios” fallbackResource:nil];
#else
jsCodeLocation = [CodePush bundleURL];
#endif
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@”RNDoctor”
initialProperties:nil
launchOptions:launchOptions];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;

8)终端输入code-push deployment ls RNDoctor –k查看你的APP deployment Key,查出Staging的值,在info.plist文件中添加CodePushDeploymentKey并且把Staging的值填入。 并把版本号改成1.0.0

这里写图片描述

—–RN的配置—–
9)在index.ios.js文件中引入
import codePush from "react-native-code-push";
10)在componentDidMount调用sync方法,当你的App启动的时候会在后台更新(当然还有其他的更新策略,这里就不讲了)
componentDidMount(){
    codePush.sync();
  }
至此配置完成,接着你需要把你的APP发布到CodePush服务器上面,才能从CodePush实现热更新
运行时,把项目改成release

这里写图片描述

Android端

1)项目中安装codepush插件(如果iOS端安装了,就忽略这步)

npm install --save react-native-code-push

2)安装RNPM插件,终端运行

npm i -g rnpm

rnpm link react-native-code-push

4) 在 android/app/build.gradle文件里面检查是否有如下代码,如果没有则加上(默认如果link上的话就会有)
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"  
5)获取deployment key ,复制staging

code-push deployment ls RNDoctor --k

6)添加配置。当APP启动时我们需要让app向CodePush咨询JS bundle的所在位置,这样CodePush就可以控制版本。更新 MainApplication.Java文件
package com.rndoctor;

import android.app.Application;
import android.util.Log;

import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;

import java.util.Arrays;
import java.util.List;
import com.microsoft.codepush.react.CodePush;//确定导入codepush,有时候link不上

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {

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

    @Override
    protected boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List getPackages() {
      return Arrays.asList(
          new MainReactPackage(),

          new CodePush("你的staging", MainApplication.this, BuildConfig.DEBUG)
      );
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
      return mReactNativeHost;
  }
}
7)在 android/app/build.gradle中有个 android.defaultConfig.versionName属性,我们需要把 应用版本改成 1.0.0(默认是1.0,但是codepush需要三位数)。
android{
    defaultConfig{
        versionName "1.0.0"
    }
}
至此Android CodePush SDK 集成完毕,但是还没完

注意:但是安卓需要生成已签名的APK安装到手机上才能实现热更新,参考生成已签名的APK

六.发布更新

发布更新分为两种:
  • 只更新项目的JS
  • 更新图片和JS

一、更新js

1)在RN项目的根目录下面创建bundles文件夹

2)将你修改的js文件(当前文件是index.ios.js)打包为二进制文件,放入指定的地方,我这里放入bundles里面。

react-native bundle --platform ios --entry-file index.ios.js --bundle-output ./bundles/main.jsbundle --dev false

3)将main.jsbundle二进制文件push到staging环境中

code-push release RNDoctor ./bundles 1.0.0

RNDoctor 项目的名字

./bundles 是bundles文件夹的东西都更新

1.0.0 是版本号

二、更新图片和js

2)打包,打包成功如下如

react-native bundle --platform ios --entry-file index.ios.js --bundle-output ./bundles/main.jsbundle --assets-dest ./bundles

这里写图片描述

3)发布和上面的更新js的发布一样,发布成功如下图

这里写图片描述

4) 终端输入如下命令可以查看,APP是否安装

code-push deployment history RNDoctor Staging

这里写图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值