[ 卡卡 DAY 30 ] - React Native codepush iOS 热更新

第一次认识 React Native 就是因为热更新
所以怎麽可以不介绍大家一下呢~
AppCenter 热更新(codepush) 你听过吗?

热更新是什麽?

CodePush 为一个中央仓库,开发者可以推送更新 (JS, HTML, CSS and images),应用可以从客户端 SDK 里面查询更新。

安装 react-native-code-push

npm install --save react-native-code-push
cd ios
pod install
cd ..

安装 appcenter

先申请 appcenter 的帐号,且参照 getting start 的设定

https://ithelp.ithome.com.tw/upload/images/20211011/20142011VCAMxh9hCY.png

npm install -g appcenter-cli
appcenter -v
cd ios
pod install
cd ..
appcenter login
 <<输入网页的Authentication>>

App center 登入
他会跳出权限码,回到 cmd Access code from browser 填入 enter,即登入成功。

bundle 配置开启 AppDelegate.m 档案

#import <CodePush/CodePush.h>

修改 sourceURLForBridge:
主要是在 release 环境的时候读取 codepush 的 jsbundle

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG // 测试 debug
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  // 删掉这个
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];

  // 使用这个
  return [CodePush bundleURL];
#endif }

RN配置

於App.js引入

import codePush from "react-native-code-push";

class App extends Component {
  constructor(props) {
    super(props);
  }

  codePushStatusDidChange(status) {
    switch (status) {
      case codePush.SyncStatus.CHECKING_FOR_UPDATE:
        console.log('Checking for updates.');
        break;
      case codePush.SyncStatus.DOWNLOADING_PACKAGE:
        console.log('Downloading package.');
        break;
      case codePush.SyncStatus.INSTALLING_UPDATE:
        console.log('Installing update.');
        break;
      case codePush.SyncStatus.UP_TO_DATE:
        console.log('Up-to-date.');
        break;
      case codePush.SyncStatus.UPDATE_INSTALLED:
        console.log('Update installed.');
        break;
    }
  }

  codePushDownloadDidProgress(progress) {
    console.log(
      progress.receivedBytes + ' of ' + progress.totalBytes + ' received.'
    );
  }

  render() {
    const initRouteName = this.props.componentName || appRouter.HOME;
    return (  
   {..... code }
    );
  }
}


const CodePushOptions = {
  // 检查更新(ON_APP_START:启动APP/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,
  // 更新时的提示更新窗,iOS不支援
  rollbackRetryOptions: {
    delayInHours: 1, // rollback重试,1小时/次
    maxRetryAttempts: 24 // rollback重试,最多尝试24次
  }
};

App = codePush(CodePushOptions)(App);
export default App;

环境配置 custom build settings

这个步骤很重要唷!!!我也是研究了很久才成功...

This mechanism allows you to easily configure your builds to produce binaries, which are configured to synchronize with different CodePush deployments.

  1. 打开 xcode 此专案 Project navigator

  2. 选取专案 targets 的 info tab

https://ithelp.ithome.com.tw/upload/images/20211011/20142011qUdLigko3P.png

  1. 於 configurations 按 + 选取 "Duplicate Release Configuration"
  2. 把名字改成 Staging
  3. 於 Build Settings tab,在 toolbar 按 + 选取 Add User-Defined Setting
    把名字设定成 “Multi_Deployment_Config”
    • Release 设定 value:$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
    • Staging 设定 value: $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
  4. 选 Build Settings tab,在 toolbar 按 + 选取 Add User-Defined Setting
    把名字设定成 “CODEPUSH_KEY”,再将 value 设定成 appcenter codepush 的 key。
    https://ithelp.ithome.com.tw/upload/images/20211011/20142011T96cuPbHlz.png
  5. 於 iOS folder 的 Info.plist 将 CodePushDeploymentKey 输入 $(CODEPUSH_KEY),配置完成。

appcenter codepush 指令介绍及补充

appcenter codepush release-react
-a {专案名称}
-d {环境}
-t {版本号}
-- description {叙述}
-m: 强制更新

看现在版本状态

code-push deployment ls {专案名称}

看所有版本列表

code-push deployment h {专案名称} {环境}

Install metrics 中各个引数的意思

  • Active 成功安装并执行当前 release 的使用者的数量(当使用者开启你的 App 就会执行这个 release),这个数字会根据使用者成功 installed 这个 release 或者离开这个 release(installed 了别的更新包,或者解除安装了 App),总之有它就知道当前 release 的活跃使用者量
  • Total 成功 installed 这个 release 的使用者的数量,这个数量只会增不会减。
  • Pending 当前这个 release 被下载的数量,但是还没有被 installed,因此这一个数值会在 release 被下载时增长,在 installed 时降低。这个指标主要是适配於没有为更新配置立马安装(mandatory)。如果你为更新配置了立马安装但是还是有 pending,很有可能是你的 App 启动时没有呼叫 notifyApplicationReady。
  • Rollbacks 这个数字代表在客户端自动回滚的数量,理想状态下,它应该为 0,如果你释出了一个更新包,在 installing 中发生 crash,code-push 将会把它回滚到之前的一个更新包中。

https://ithelp.ithome.com.tw/upload/images/20211011/201420112CK6pzbA3S.png

达成30天铁人赛

一个月的时间学习了很多也认清了很多,总算完成30天的铁人赛噜!!!
希望这些文章大家都可以多多指教,倘若有误的地方也欢迎提出来~
我们都是从挫败中慢慢成长长大的小小工程师!
喜欢我的文章麻烦请订阅噜! :P
/images/emoticon/emoticon51.gif

参考:
app center
使用 React Native 用户端 SDK 开始
multi-deployment-testing-ios.md


<<:  Day30 小乌龟应用整合篇

>>:  Day30:终於要进去新手村了-结语

用Stack 制作Queue

记录学习内容。 以下内容和截图大多引用文章。 还不了解,内容可能有错误。 Queue 可以用 Sta...

C# 鸡础观念- 目录

[Day1]C# 鸡础观念- C#简介 [Day2]C# 鸡础观念- 与C#开发千里来相见 [Da...

Day11 - Bmo 眼睛嘴巴动起来

设定 BMO 初始化、更新要更新什麽、画出 BMO 的方法 class Bmo { constru...

CLOUDWAYS主机限时6折优惠码,只到2021/12/1

优惠码BFCM2021 优惠时间:只到2021/12/01 折扣内容:首四个月6折(适用於所有方案)...

从零开始学3D游戏开发:程序基础 Part.1 变数

终於看不见起点了,四周看起来还是有很多的参赛者在努力奔跑着,欢迎你一起陪着我们学习 Roblox 游...