当前位置: 首页 > news >正文

React Native 全栈开发实战班 - 打包发布之热更新

在完成 React Native 应用的开发与性能优化后,下一步就是将应用打包并发布到各大应用市场,如 Apple App Store 和 Google Play Store。本章节已经详细介绍了打包与发布的流程,包括 Android 和 iOS 平台的配置、打包步骤、签名配置以及发布到应用市场。


3. 版本更新机制

在应用发布后,持续的版本更新是保持应用稳定、功能完善和用户体验良好的关键。React Native 应用可以通过多种方式进行版本更新,包括:

  1. 全量更新(Full Update): 用户需要下载并安装整个应用的新版本。
  2. 增量更新(Delta Update): 只下载和安装应用中有变化的部分。
  3. 热更新(Code Push): 通过远程服务器动态更新应用的 JavaScript 代码和资源,而无需重新发布应用。

本章节将重点介绍如何使用 CodePush 实现 React Native 应用的热更新。


3.1 热更新概述

热更新(Hot Update) 是一种在不发布新版本应用的情况下,更新应用代码和资源的技术。热更新可以显著缩短更新周期,提高用户体验,并减少应用商店审核的等待时间。

热更新的优势:

  • 快速迭代: 可以快速发布新功能、修复 bug,无需等待应用商店审核。
  • 用户体验: 用户无需重新下载整个应用,即可获取最新更新。
  • 节省带宽: 只下载有变化的部分,减少用户流量消耗。

常见的热更新解决方案:

  • CodePush: 由 Microsoft 提供的免费开源热更新服务,支持 React Native 和 Cordova。
  • Expo Updates: Expo 提供的热更新服务,适用于使用 Expo 工具链的项目。
  • 自建热更新服务: 使用第三方 CDN 或自建服务器,实现自定义的热更新流程。

本章节将重点介绍如何使用 CodePush 实现 React Native 应用的热更新。


3.2 使用 CodePush 实现热更新

CodePush 是一个由 Microsoft 提供的免费开源热更新服务,支持 React Native 和 Cordova 应用。它通过云端服务器分发应用的更新包,实现动态更新。

3.2.1 安装 CodePush CLI

首先,需要安装 CodePush CLI 工具。

npm install -g code-push-cli
3.2.2 注册 CodePush 账号

使用 CodePush CLI 注册一个 CodePush 账号。

code-push register

按照提示完成注册。

3.2.3 登录 CodePush

使用 CodePush CLI 登录。

code-push login

按照提示完成登录。

3.2.4 安装 CodePush SDK

在 React Native 项目中安装 CodePush SDK。

npm install react-native-code-push

链接原生依赖(React Native 0.60 及以上版本自动链接):

cd ios
pod install
cd ..
3.2.5 配置 CodePush
  1. Android 配置:

    • android/app/build.gradle 文件中,添加 CodePush 依赖:

      dependencies {...implementation project(':react-native-code-push')...
      }
      
    • android/app/src/main/java/.../MainApplication.java 文件中,添加 CodePush 配置:

      import com.microsoft.codepush.react.CodePush;@Override
      protected String getJSBundleFile() {return CodePush.getJSBundleFile();
      }@Override
      protected List<ReactPackage> getPackages() {return Arrays.<ReactPackage>asList(new MainReactPackage(),new CodePush(getResources().getString(R.string.reactNativeCodePush_androidDeploymentKey), getApplicationContext(), BuildConfig.DEBUG),...);
      }
      
    • android/app/src/main/res/values/strings.xml 文件中,添加 CodePush deployment key:

      <string name="reactNativeCodePush_androidDeploymentKey">YOUR_ANDROID_DEPLOYMENT_KEY</string>
      
  2. iOS 配置:

    • 在 Xcode 中,打开项目,添加 CodePush 依赖:

      • 打开 AppDelegate.m 文件,添加 CodePush 配置:

        #import <CodePush/CodePush.h>- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
        {return [CodePush bundleURL];
        }
        
      • Info.plist 文件中,添加 CodePush deployment key:

        <key>CodePushDeploymentKey</key>
        <string>YOUR_IOS_DEPLOYMENT_KEY</string>
        
3.2.6 发布更新
  1. 构建发布版本:

    npm run build:android
    npm run build:ios
    
  2. 发布更新包:

    code-push release-react <appName> <platform> -d <deploymentName> --des "更新描述"
    
    • <appName>: CodePush 应用名称。
    • <platform>: 平台名称,androidios
    • <deploymentName>: 部署环境,StagingProduction

    示例:

    code-push release-react MyApp-Android android -d Production --des "修复bug,优化性能"
    code-push release-react MyApp-iOS ios -d Production --des "修复bug,优化性能"
    
  3. 查看更新历史:

    code-push deployment history <appName> <deploymentName>
    

    示例:

    code-push deployment history MyApp-Android Production
    code-push deployment history MyApp-iOS Production
    
3.2.7 强制更新

可以通过设置 mandatory 参数,强制用户更新应用。

示例:

code-push release-react MyApp-Android android -d Production --des "强制更新版本" --mandatory true
3.2.8 检查更新

在应用代码中,可以通过 CodePush API 检查更新并应用更新。

示例:

import React from 'react';
import { View, Text, StyleSheet, Button } from 'react-native';
import codePush from 'react-native-code-push';const MyApp = () => {const onCheckUpdate = () => {codePush.sync({updateDialog: {appendReleaseDescription: true,descriptionPrefix: '\n\n更新内容:\n',},mandatoryInstallMode: codePush.InstallMode.IMMEDIATE,});};return (<View style={styles.container}><Text style={styles.text}>欢迎使用 MyApp</Text><Button title="检查更新" onPress={onCheckUpdate} /></View>);
};

作者简介

前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

温馨提示:可搜老码小张公号联系导师

相关文章:

React Native 全栈开发实战班 - 打包发布之热更新

在完成 React Native 应用的开发与性能优化后&#xff0c;下一步就是将应用打包并发布到各大应用市场&#xff0c;如 Apple App Store 和 Google Play Store。本章节已经详细介绍了打包与发布的流程&#xff0c;包括 Android 和 iOS 平台的配置、打包步骤、签名配置以及发布到应…...

2024年11月16日 星期六 重新整理Go技术

今日格言 坚持每天进步一点点~ 一个人也可以是一个团队~ 学习全栈开发, 做自己喜欢的产品~~ 简介 大家好, 我是张大鹏, 今天是2024年11月16日星期六, 很高兴在这里给大家分享技术. 今天又是休息的一天, 做了很多的思考, 整理了自己掌握的技术, 比如Java, Python, Golang,…...

力扣第 55 题 跳跃游戏

力扣第 55 题 跳跃游戏&#xff08;Jump Game&#xff09;。题目要求判断一个非负整数数组中&#xff0c;是否能够从第一个位置跳跃到最后一个位置。每个元素表示从当前位置最多可以跳跃的步数。 解题思路 我们可以用 贪心算法 来解决这个问题。贪心的核心思想是始终维护当前…...

Golang | Leetcode Golang题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; func nearestPalindromic(n string) string {m : len(n)candidates : []int{int(math.Pow10(m-1)) - 1, int(math.Pow10(m)) 1}selfPrefix, _ : strconv.Atoi(n[:(m1)/2])for _, x : range []int{selfPrefix - 1, selfPrefix, selfPrefix …...

Spring Boot汽车资讯:科技与速度的交响

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…...

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…...

移动零

移动零 1、题目描述2、解答思路 1、题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 2、解答思路 已知数组后端若干元素为0&…...

C#编写的日志记录组件 - 开源研究系列文章

以前编写过一个日志记录组件的博文&#xff0c;这次发布一个修改过的完善版本。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 实现&#xff1b; 2) 使用&#xff1b; 后面的参数为级别设置&#xff0c;只有大于这个级别的才进行日志记录&#xff0c;限制了日志记录的…...

猎板PCB罗杰斯板材的应用案例

以下是几个猎板 PCB 与罗杰斯板材结合的具体案例&#xff1a; 案例一&#xff1a;5G 通信基站天线 PCB 在 5G 通信基站的天线系统中&#xff0c;对高频信号的传输和处理要求极高。猎板 PCB 采用罗杰斯板材&#xff0c;凭借其稳定的低介电常数&#xff08;如 RO4003C 板材&…...

使用esp32c3开发板通过wifi连网络web服务器

实验基本拓扑就是&#xff1a; esp32c3开发板通过Wifi模块连上局域网&#xff0c;局域网一台服务器通过FastAPI提供8000端口的web服务&#xff0c;在esp32c3开发板中烧录micropython固件&#xff0c;在python交互模式下&#xff0c;连上Wifi模块&#xff0c;并使用socket模块获…...

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展&#xff0c;传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式&#xff0c;即商家不需要自己储备商品库存&#xff0c;而是将订单直接转给供应商&#xff0c;由供应商直接进行发货。这种方式极大地降低了企业的运营成本…...

Windows docker下载minio出现“Using default tag: latestError response from daemon”

Windows docker下载minio出现 Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 此类情况&#xff0c;一般为镜像地址问题。 {"registry-mirrors": ["https://docker.re…...

工厂模式-简单工厂模式

1、简单工厂模式 在工厂类的静态方法中,根据要创建产品的type类型,通过if else来返回对应的对象 1.1定义产品抽象接口Product /*** @desc 产品抽象接口**/ public interface Product {void use(); } 1.2 定义具体的产品A和B /*** @desc 产品A**/ public class ProductA i…...

【linux】使用minicom调试串口

在Linux中使用minicom进行串口通信调试&#xff0c;你需要先确保已经安装了minicom。如果还没有安装&#xff0c;你可以使用包管理器进行安装&#xff0c;例如在Debian或Ubuntu系统上使用apt-get&#xff0c;在Red Hat或CentOS系统上使用yum或dnf。 安装完成后&#xff0c;你需…...

C# 异常处理、多个异常、自定义异常处理

C# 异常 异常是为处理异常的发生而设计的&#xff0c;这些特殊情况会改变程序执行的正常流程。 引发或引发异常。 在执行应用期间&#xff0c;许多事情可能出错。 磁盘可能已满&#xff0c;我们无法保存文件。 当我们的应用尝试连接到站点时&#xff0c;Internet 连接可能会断…...

【从零开始的LeetCode-算法】3210. 找出加密后的字符串

给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串&#xff1a; 对于字符串 s 中的每个字符 c&#xff0c;用字符串中 c 后面的第 k 个字符替换 c&#xff08;以循环方式&#xff09;。 返回加密后的字符串。 示例 1&#xff1a; 输入&#xff1a; s "dart&…...

redis linux 安装

下载解压 https://download.redis.io/releases/ tar -zvxf ----redis-7.4.1编译 进入目录下 # redis 依赖c yum install gcc-cmake可能会有问题&#xff0c;所以记得换源# 安装到 /usr/local/redis make PREFIX/usr/local/redis installcd src ./redis-serverredis.confi…...

springboot006基于SpringBoot的网上订餐系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

【QNX】QNX侧如何抓取日志?

🦋slog2info 是 QNX 实时操作系统中的一个实用工具,用于读取和解析 QNX 的系统日志(System Logger v2,简称 slog2)。 🦋slog2 是 QNX 提供的用于记录系统和应用程序日志信息的服务,它比传统的 syslog 服务更加强大和灵活,能够处理大量日志信息,并提供高级的过滤和检…...

深度学习:计算卷积神经网络中输出特征图尺寸的关键公式

计算卷积神经网络中输出特征图尺寸的关键公式 在设计卷积神经网络&#xff08;CNN&#xff09;时&#xff0c;准确计算每个卷积层的输出特征图尺寸是至关重要的。这不仅关系到网络的结构设计&#xff0c;也直接影响参数优化和整体性能。适当的计算可以确保网络层正确连接&…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...