拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

react-native-code-push 完全指南:为 React Native 应用接入 CodePush 动态更新

react-native-code-push 完全指南:为 React Native 应用接入 CodePush 动态更新 移动开发【免费下载链接】react-native-code-pushReact Native module for CodePush项目地址https://gitcode.com/gh_mirrors/re/react-native-code-push点击查看免费下载本指南以仓库根目录 README.md 为主体脉络系统讲解react-native-code-push当前版本 9.0.1见 package.json的安装接入、codePush高阶组件与sync同步 API 的用法、release-react发版流程、多 Deployment 测试与动态 Deployment 分配并结合 CodePush.js、docs 目录及 Android/iOS 原生源码给出实现级佐证。读完本文你将能独立完成 CodePush 插件的端到端集成掌握静默更新、主动更新、强制更新、灰度发布与回滚重试等完整实战方案。前提说明本仓库对应的 App Center CodePush 服务已于 2025 年 3 月 31 日随 App Center 退役而停止服务仓库现已归档且官方明确提示 React Native 0.76 起的新架构New Architecture不受支持需要 opt-out 后才能继续使用。本文内容以仓库中记录的插件能力为准用于理解其工作机制与历史实现。一、工作原理CodePush 如何实现“Web 式”热更新React Native 应用本质上由 JavaScript 文件与配套图片资源组成它们经 metro bundler 打包后随平台二进制.ipa/.apk一起分发。一旦发版任何 JS 层改动修 Bug、加功能或图片资源替换都必须重新编译并重新提审整个安装包。CodePush 插件的核心思路是让JS bundle 与图片资源与 CodePush 服务器上发布的更新保持同步客户端在启动时向服务器查询当前 Deployment 是否有新版本若有则下载增量更新包并安装使应用同时具备原生应用的离线体验和“Web 级”的即时发布敏捷性。需要特别注意的是任何触碰原生代码的改动如修改AppDelegate.m/MainActivity.java、新增原生插件都无法通过 CodePush 分发必须走应用商店更新流程。1.1 客户端查询与下载的核心调用链从 JS 侧源码 CodePush.js 可以还原完整的更新检查链路checkForUpdateCodePush.js#L11首先通过getConfiguration()从原生侧获取三要素deploymentKey部署密钥、appVersion如 1.0.1、当前已安装更新的 packageHash用于只向服务器请求“针对当前 deployment 与版本、且确实与已装更新不同”的更新若显式传入deploymentKey则覆盖原生配置的默认 key——这正是后文“动态 Deployment 分配”的底层实现CodePush.js#L29通过AcquisitionSdk来自code-push/script/acquisition-sdk调用queryUpdateWithCurrentPackage向服务器发起查询当服务器返回更新时封装为RemotePackage并标记failedInstall是否曾被回滚过CodePush.js#L86随后可调用download与install完成安装。checkForUpdate返回null的四种情形源码注释 CodePush.js#L56-L72服务器无更新更新要求更新的二进制版本不兼容更新 hash 与当前运行更新相同更新 hash 与二进制内置版本相同Android 特有。1.2 客户端自动回滚机制为保证用户始终运行可用版本插件会保留上一份更新的副本若你误推了包含崩溃的更新客户端能够自动回滚到上一个可用版本。这一能力在 Android 原生侧由 CodePushUpdateManager.java 实现——其中rollbackPackage()CodePushUpdateManager.java#L338负责回滚getPackageFolderPathCodePushUpdateManager.java#L104则以 packageHash 作为目录名管理各版本更新包。与客户端回滚配合的还有服务端回滚appcenter codepush rollback用于在问题版本被识别后阻止更多用户安装。源码细节notifyApplicationReady在 CodePush.js#L164 中被设计为模块级单例仅调用一次并在安装更新后向服务器上报DeploymentSucceeded/DeploymentFailed状态CodePush.js#L199-L203失败上报失败时还会保存状态并在 App 恢复时重试CodePush.js#L215-L228。二、支持的平台与 RN 版本兼容矩阵官方声明的支持平台iOS7Android4.1要求 TLS 1.2 兼容设备WindowsUWP由于 React Native 各版本之间存在破坏性变更插件需要与特定 RN 版本配套使用。README 给出的完整兼容矩阵如下React Native 版本支持的 CodePush 版本0.14不支持v0.14v1.3引入 Android 支持v0.15-v0.18v1.4-v1.6引入 iOS 资源支持v0.19-v0.28v1.7-v1.17引入 Android 资源支持v0.29-v0.30v1.13-v1.17RN 重构原生宿主代码v0.31-v0.33v1.14.6-v1.17RN 重构原生宿主代码v0.34-v0.35v1.15-v1.17RN 重构原生宿主代码v0.36-v0.39v1.16-v1.17RN 重构 resume 处理器v0.40-v0.42v1.17RN 重构 iOS 头文件v0.43-v0.44v2.0RN 重构 uimanager 依赖v0.45v3.0RN 重构 instance manager 代码v0.46v4.0RN 重构 js bundle 加载代码v0.46-v0.53v5.1RN 移除未用的 JS 模块注册v0.54-v0.55v5.3Android Gradle Plugin 3.x 集成v0.56-v0.58v5.4RN 升级 Android 工具链版本v0.59v5.6RN 重构 js bundle 加载代码v0.60-v0.61v6.0RN 迁移到 Autolinkingv0.62-v0.64v6.2RN 移除 LiveReloadv0.65-v0.70v7.0RN 更新 iPhone 目标版本v0.71v8.0RN 迁移到 react-native-gradle-plugin警告低于v5.7.0的react-native-code-push版本已停止工作。排查编译错误时第一件事就是核对上表确认 RN 版本与插件版本是否匹配详见下文调试章节。2.1 支持通过 CodePush 更新的资源组件使用 React Native 资源系统即require(./foo.png)语法时以下核心组件及其属性支持通过 CodePush 更新引用的图片与视频组件属性ImagesourceMapView.Marker需 react-native-maps 0.3.2imageProgressViewIOSprogressImage、trackImageTabBarIOS.Itemicon、selectedIconToolbarAndroidReact Native 0.21.0actions[].icon、logo、overflowIconVideosource以下组件因其依赖静态图片/视频即{ uri: foo }语法暂不支持通过 CodePush 更新资源组件属性SliderIOSmaximumTrackImage、minimumTrackImage、thumbImage、trackImageVideosourceVideo组件仅在 source 属性使用require时有效例如Video source{require(./foo.mp4)} /三、快速开始安装插件完成 CodePush 账号与应用的注册配置后README 指向 App Center 的通用“getting started”流程在应用根目录执行npm install --save react-native-code-push与所有 React Native 插件一样iOS 与 Android 的集成步骤不同请按目标平台分别执行。如果同时面向双平台建议为每个平台创建独立的 CodePush 应用使用不同的 deployment key否则会出现“发布了 iOS 更新Android 端也收到并导致崩溃”的典型问题。本指南假定你使用react-native init初始化项目若使用create-react-native-app请先运行npm run eject得到与react-native init等价的项目结构。平台安装配置文档仓库内路径iOS 安装配置Android 安装配置Windows 安装配置3.1 iOS 集成要点RN 0.60执行cd ios pod install cd ..安装 CocoaPods 依赖在AppDelegate.m顶部引入#import CodePush/CodePush.h将生产环境加载 JS bundle 的代码由[[NSBundle mainBundle] URLForResource:main withExtension:jsbundle]替换为[CodePush bundleURL]setup-ios.md。bundleURL假定 bundle 名为main.jsbundle自定义文件名时改用bundleURLForResource:或bundleURLForResource:withExtension:建议用DEBUG宏在生产与调试间切换保留调试期的 Chrome DevTools 与 Live Reload- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:index]; #else return [CodePush bundleURL]; #endif }在Info.plist添加名为CodePushDeploymentKey的条目值填入目标 deployment 的 key用appcenter codepush deployment list -a ownerName/appName -k获取-k用于显示 key。注意 deployment 的“友好名称”如 Staging不能用作 key它仅供 CLI 管理使用。iOS 侧还支持通过NSAppTransportSecurity配置 HTTPS 例外域涉及codepush.appcenter.ms、codepush.blob.core.windows.net、codepushupdates.azureedge.net以及通过Info.plist中的CodePushPublicKey配置代码签名公钥setup-ios.md。3.2 Android 集成要点RN 0.60在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)在android/app/build.gradle末尾应用仓库自带的构建任务定义负责在打包时注入 bundle 哈希等元数据apply from: ../../node_modules/react-native-code-push/android/codepush.gradle修改MainApplicationRN 0.73 用 Kotlin 的MainApplication.kt 0.72 用MainApplication.java导入com.microsoft.codepush.react.CodePush并覆写getJSBundleFile()返回CodePush.getJSBundleFile()让 CodePush 运行时决定每次启动时 JS bundle 的加载位置在res/values/strings.xml添加部署密钥resources string nameapp_nameAppName/string string moduleConfigtrue nameCodePushDeploymentKeyDeploymentKey/string /resourcesAndroid 侧同样支持CodePushPublicKey字符串资源做代码签名验证可通过CodePush构造器或CodePushBuilder传入资源描述符见 setup-android.md。旧版 RN 0.60的 RNPM / 手动接入方式、后台 React 实例ReactInstanceHolder以及 WIX React Native Navigation 1.x/2.x 的特殊接入方式均记录在 setup-android.md 中。四、插件使用从高阶组件到sync全链路完成原生接入后剩下的就是通过 JS 代码控制两条策略何时以及多频繁地检查更新——例如启动时、点击设置页按钮时、按固定周期轮询更新可用时如何呈现给用户——静默下载、弹窗确认、立即重启等。4.1 方式一用codePush高阶组件包装根组件类组件import codePush from react-native-code-push; class MyApp extends Component { } MyApp codePush(MyApp);函数式组件import codePush from react-native-code-push; let MyApp: () React$Node () { } MyApp codePush(MyApp);从源码看codePushifyCodePush.js#L514会在内部创建一个CodePushComponent包装类在componentDidMount中根据checkFrequency决定是仅调用notifyAppReady还是直接调用syncCodePush.js#L541-L570并自动桥接根组件上定义的codePushStatusDidChange、codePushDownloadDidProgress、codePushOnBinaryVersionMismatch三个生命周期钩子。4.2 方式二ES7 装饰器语法import codePush from react-native-code-push; codePush class MyApp extends Component { }函数式组件写法const MyApp: () React$Node () { } export default codePush(MyApp);注Babel 6.x 默认不支持装饰器需安装并启用babel-preset-react-native-stage-0。默认行为CodePush 在每次应用启动时检查更新若有更新则静默下载并在下次重启时安装无论是由用户还是 OS 触发将打扰降到最低若更新被标记为mandatory强制则立即安装确保用户尽快获得该版本。4.3 更快发现更新App 恢复前台时同步let codePushOptions { checkFrequency: codePush.CheckFrequency.ON_APP_RESUME }; class MyApp extends Component { } MyApp codePush(codePushOptions)(MyApp);函数式组件写法相同仅将MyApp codePush(codePushOptions)(MyApp);应用于函数组件。4.4 完全手动控制sync与CheckFrequency.MANUAL若希望在按钮点击、定时器等任意时机手动触发检查可设置checkFrequency: codePush.CheckFrequency.MANUAL关闭自动检查再按需调用codePush.sync()let codePushOptions { checkFrequency: codePush.CheckFrequency.MANUAL }; class MyApp extends Component { onButtonPress() { codePush.sync({ updateDialog: true, installMode: codePush.InstallMode.IMMEDIATE }); } render() { return ( View TouchableOpacity onPress{this.onButtonPress} TextCheck for updates/Text /TouchableOpacity /View ) } } MyApp codePush(codePushOptions)(MyApp);sync是官方推荐的集成方式单次调用即可完成“检查 → 下载 → 安装”全流程其内部实现见 syncInternal——先调用notifyApplicationReady()再checkForUpdate按updateDialog是否启用决定走弹窗确认流程还是直接doDownloadAndInstall()并根据isMandatory选择mandatoryInstallMode或installModeCodePush.js#L426。sync还内置了并发保护同一时刻只允许一个同步流程运行重复调用会得到SyncStatus.SYNC_IN_PROGRESSCodePush.js#L311。sync的两个内建模式静默模式默认自动下载更新下次重启时生效用户全程无感知主动模式更新可用时先弹窗征求用户同意下载后立即应用强制更新会提示但用户无法忽略。典型SyncOptions组合示例// 用不同的 deployment key 覆盖原生配置 codePush.sync({ deploymentKey: KEY }); // 静默下载但下次从后台恢复且后台时长超过 5 分钟时再安装 codePush.sync({ installMode: codePush.InstallMode.ON_NEXT_RESUME, minimumBackgroundDuration: 60 * 5 }); // 可选更新下次重启安装强制更新则在下次恢复时安装 codePush.sync({ mandatoryInstallMode: codePush.InstallMode.ON_NEXT_RESUME }); // 自定义更新弹窗标题 codePush.sync({ updateDialog: { title: An update is available! } }); // 弹窗中追加 release description 作为更新日志 codePush.sync({ updateDialog: { appendReleaseDescription: true, descriptionPrefix: \n\nChange log:\n }, installMode: codePush.InstallMode.IMMEDIATE });sync还接受三个可选回调用于订阅同步管道生命周期以驱动自定义 UIcodePush.sync({ updateDialog: true }, (status) { switch (status) { case codePush.SyncStatus.DOWNLOADING_PACKAGE: // 显示“下载中”弹窗 break; case codePush.SyncStatus.INSTALLING_UPDATE: // 隐藏“下载中”弹窗 break; } }, ({ receivedBytes, totalBytes, }) { /* 更新下载进度条 */ } );sync返回PromiseSyncStatus取值包括UP_TO_DATE(0)、UPDATE_INSTALLED(1)、UPDATE_IGNORED(2)、SYNC_IN_PROGRESS(4) 等完整枚举定义见 CodePush.js#L627。4.5 CodePushOptions 完整参数参数类型默认值说明checkFrequencycodePush.CheckFrequencyON_APP_START何时检查更新ON_APP_START(0) /ON_APP_RESUME(1) /MANUAL(2)deploymentKeyString原生配置覆盖Info.plist(iOS) 与MainActivity.java(Android) 中的默认 key用于动态切换 deploymentinstallModecodePush.InstallModeON_NEXT_RESTART可选更新的安装时机mandatoryInstallModecodePush.InstallModeIMMEDIATE强制更新的安装时机minimumBackgroundDurationNumber0配合ON_NEXT_RESUME/ON_NEXT_SUSPENDApp 需在后台停留的最小秒数超过才重启应用updateDialogUpdateDialogOptionsnull为null时不弹窗任意真值启用默认文案弹窗传对象可覆盖默认文案rollbackRetryOptionsRollbackRetryOptionsnull回滚重试机制对曾回滚的更新包按条件重装InstallMode 枚举源码定义见 CodePush.js#L619IMMEDIATE(0)安装后立即重启适合调试与弹窗确认场景也用于强制更新ON_NEXT_RESTART(1)安装后不强制重启下次自然重启时无缝生效是静默更新的默认模式ON_NEXT_RESUME(2)下次从后台恢复时重启生效不打断当前会话ON_NEXT_SUSPEND(3)在后台期间重启但仅在后台停留超过minimumBackgroundDuration秒后执行避免丢失用户上下文。UpdateDialogOptions 默认文案源码常量 CodePush.js#L652title默认Update available、optionalUpdateMessage默认An update is available. Would you like to install it?、optionalInstallButtonLabel默认Install、optionalIgnoreButtonLabel默认Ignore、mandatoryUpdateMessage默认An update is available that must be installed.、mandatoryContinueButtonLabel默认Continue、appendReleaseDescription默认false、descriptionPrefix默认 Description: 。RollbackRetryOptions 默认值CodePush.js#L662delayInHours默认24回滚后至少等待的小时数、maxRetryAttempts默认1最大重试次数不能小于 1。其校验逻辑在 CodePush.js#L269-L294 中实现重试条件为“距最近一次回滚超过delayInHours且回滚次数不超过maxRetryAttempts”。4.6 事件钩子跟踪同步过程根组件可定义以下生命周期钩子接收同步事件class MyApp extends Component{} { 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.); } } MyApp codePush(MyApp);DownloadProgress对象包含totalBytes本次变更文件的总字节数与receivedBytes已下载字节数。4.7 其他模块级 APIcodePush.checkForUpdate(deploymentKey, handleBinaryVersionMismatchCallback)只查不装返回PromiseRemotePackagenull表示无更新可能原因deployment 无发布、更新目标二进制版本不匹配、已是最新、更新被禁用、处于活跃灰度但设备不在放量范围内codePush.getUpdateMetadata(updateState)/getCurrentPackage()已弃用读取已安装更新的元数据UpdateState取值RUNNING(0) /PENDING(1) /LATEST(2)可用于实现“Whats New”弹窗或判断是否存在待应用更新codePush.notifyAppReady()手动更新流程必须调用否则插件会认为更新失败并在下次重启时回滚使用sync时无需手动调用sync会自动调用codePush.restartApp(onlyIfUpdateIsPending)立即重启传true仅在存在待应用更新时重启codePush.disallowRestart()/codePush.allowRestart()临时禁止/恢复程序化重启适用于引导流程Onboarding等不允许中断的场景——期间安装的更新会排队直到调用allowRestart才“冲刷”执行codePush.clearUpdates()清除已下载的全部 CodePush 更新适用于切换到可能比当前包更旧的 deployment 的场景其他场景官方不建议手动调用。以上 API 的完整签名、返回类型与使用示例详见 JavaScript API 文档原生侧另见 Objective-C APIiOS 与 Java APIAndroid。五、商店合规性Google Play 与 App Store 的规则边界5.1 Google PlayGoogle Play《设备与网络滥用》政策第三段规定除 Google Play 更新机制外任何方式更新源码都受限制。但该限制不适用于运行在虚拟机中、对 Android API 访问受限的代码如 WebView 或浏览器中的 JavaScript。CodePush 只更新 JS bundle、不触碰原生代码因此完全符合该政策。5.2 App StoreApple Developer Program License Agreement 3.3.2 条款2015 年起明确允许通过 OTA 方式更新 JavaScript 与资源且最新版本条款更宽泛解释性代码可被下载到应用内前提是 (a) 不改变应用提交时向 App Store 声明的主要用途(b) 不创建其他代码或应用的商店/店面(c) 不绕过系统的签名、沙箱或其他安全特性。只要推送的更新不显著偏离应用在 App Store 审核时的原始意图CodePush 即是完全合规的方案。另外为符合 App Store 审核指南“不得强制用户评分、评论、下载其他应用等”条款官方建议App Store 分发的应用在调用sync时不要启用updateDialogupdateDialog本身不会强制用户下载新版本但展示时需知晓该条款。六、发布更新release-react命令应用配置完成并分发后当 JS 或资源发生变更即可通过 App Center CLI 的release-react命令发布它会自动打包 JS 与资源文件并上传到 CodePush 服务器。前置条件先执行appcenter login登录 App Center。最简形式只需一个参数ownerName / appNameappcenter codepush release-react -a ownerName/appName appcenter codepush release-react -a ownerName/MyApp-iOS appcenter codepush release-react -a ownerName/MyApp-Androidrelease-react提供了大量合理默认值如自动生成 release bundle、假定 iOS 入口文件为index.ios.js或index.js且全部可通过参数定制# 发布强制更新并附带更新日志 appcenter codepush release-react -a ownerName/MyApp-iOS -m --description Modified the header color # 为使用非标准入口文件名的应用发布更新并捕获 react-native bundle 生成的 sourcemap appcenter codepush release-react -a ownerName/MyApp-iOS --entry-file MyApp.js --sourcemap-output ../maps/MyApp.map # 将开发版 Android 构建仅发布给 1/4 的用户灰度 appcenter codepush release-react -a ownerName/MyApp-Android --rollout 25 --development true # 发布面向所有 1.1.* 二进制版本用户的更新而非 build.gradle 中的精确版本名 appcenter codepush release-react -a ownerName/MyApp-Android --target-binary-version ~1.1.0CodePush 客户端支持差分更新虽然每次发布都上传完整 JS bundle 与资源但终端用户只会下载实际变化的文件服务端自动完成优化。重要提示CodePush 更新必须在非 Debug 模式下测试。Debug 模式下 React Native 始终加载 packager 生成的 JS bundleCodePush 下载的 bundle 不会生效。七、多 Deployment 测试Staging 与 ProductionCodePush 应用创建时会自动生成Staging和Production两个 deployment。为有效测试发布必须善用它们——绝不要向终端用户发布未经自己验证的更新。推荐工作流用appcenter codepush release-react发布更新到Stagingdeployment运行 staging/beta 构建同步服务器更新并验证功能用appcenter codepush promote将已验证的版本从Staging提升到Production运行生产构建再次同步并验证。更稳妥的做法是在第 3 步做分阶段灰度例如只让 20% 用户可用appcenter codepush promote -a ownerName/appName -s Staging -d Production -r 20观察一段时间确认无崩溃报告或用户反馈后再扩大到全量appcenter codepush patch -a ownerName/appName Production -r 100各平台的具体构建配置示例与 demo 项目见 Android 多 Deployment 测试 与 iOS 多 Deployment 测试。八、动态 Deployment 分配运行时重定向用户多 Deployment 工作流将 deployment 分配静态嵌入二进制staging 构建只会从 staging 同步。若想执行 A/B 测试或向特定用户提供抢先体验可以在运行时动态决定用户同步的 deployment——只需在调用codePush时指定目标 deployment key即可覆盖Info.plistiOS或MainActivity.javaAndroid中的默认 key源码实现见 CodePush.js#L29// 假设 userProfile 是组件接收的 prop包含当前用户应使用的 deployment key codePush.sync({ deploymentKey: userProfile.CODEPUSH_KEY });实践中确定“当前用户该用哪个 key”通常有两种方案暴露用户可见的切换机制如设置页提供“beta 访问”开关。适合不介意预发布更新隐私、且存在愿意自行尝鲜可能含 Bug的资深用户的场景类似 Chrome 渠道缺点是把决定权交给用户无法透明地进行 A/B 测试在服务端用户档案中标注 deployment 元数据默认使用二进制内置 key用户认证后由服务器决定是否将其“重定向”到其他 deployment从而增量地把特定用户/群体放入不同 deployment还可将服务端响应存入本地存储作为新的默认值。key 的存储方式完全取决于你的认证方案Auth0、Firebase、自建 DB REST API 等。也可实现混合方案用户可切换 服务器可覆盖形成“deployment 解析层级”应用开箱即用可自更新、用户可获抢先体验、同时保留 A/B 测试能力。由于官方推荐用Staging做预发布测试它并不适合直接充当 A/B 测试分组因此建议充分利用自定义 deployment# 1) 创建存放特定应用变体版本的 deployment appcenter codepush deployment add -a ownerName/appName test-variant-one # 2) 将新版本发布到该自定义 deployment appcenter codepush release-react -a ownerName/appName -d test-variant-one注意deployment 的“Install Metrics”统计的总用户数会考虑“切换”行为——例如Production当前报告 1 个总用户若该用户被动态切到Staging则Production报告 0、Staging报告 1从而准确追踪发布采用率。九、调试与故障排查sync方法内置了大量诊断日志排查问题的第一选择是查看应用输出日志它足以判断应用配置是否正确如能否找到 deployment key、能否连通服务器、是否发现可用更新、更新是否成功下载/安装。最简单的查看方式是为每条命令添加--debug标志输出流会被过滤为仅 CodePush 消息。也可以用平台工具查看Chrome DevTools Console、Xcode ConsoleiOS、OS X Console、ADB logcatAndroid查找以[CodePush]前缀开头的消息——该前缀由 logging.js 中的日志函数统一添加logging.js#L3。注意iOS Release 构建默认禁用 React Native 日志。若需在 Release 构建中查看需修改AppDelegate.m添加#import React/RCTLog.hRN 0.40 用#import RCTLog.h并在application:didFinishLaunchingWithOptions顶部加入RCTSetLogThreshold(RCTLogLevelInfo);。常见问题对照表问题 / 症状可能解决方案编译错误核对 RN 版本兼容矩阵 中 RN 与 CodePush 版本的匹配关系iOS 模拟器中调用sync/checkForUpdate时网络超时或挂起通过Simulator - Reset Content and Settings..重置模拟器后重新运行调用sync/checkForUpdate时服务器返回404核对Info.plist(iOS)、build.gradle(Android) 或传给sync/checkForUpdate的 deployment key 是否正确可用appcenter codepush deployment list ownerName/appName --displayKeys查看正确 key更新未被发现核对运行中应用的版本如 1.0.0与发布更新时指定的版本是否一致且发布与同步的必须是同一 deployment重启后更新未生效若未在启动时调用sync如根组件componentDidMount必须显式调用notifyApplicationReady否则插件会判定更新失败并回滚发布 iOS 更新后 Android 端也收到并崩溃确保两个平台使用不同的 deployment key发布了新更新但改动未生效确认运行模式非 Debug——Debug 下 React Native 始终加载 packager 生成的 JS bundleCodePush 的 bundle 不生效iOS 模拟器找不到 JS bundle默认 RN 在模拟器下不生成 JS bundle使用[CodePush bundleURL]时可能得到nil十、持续集成 / 交付CI/CD除手动发布外建立可重复、可持续的发布流水线同样重要。README 记录的 CodePush 相关 CI 集成包括Visual Studio Team ServicesVSTS扩展同时提供 HockeyApp 与 Google Play 发布扩展可构成完整的移动端 CD 方案与Travis CI插件。核心思路是把release-react/promote等命令编排进构建管道形成稳定的敏捷发布节奏。十一、TypeScript 消费本模块随 NPM 包发布*.d.ts类型定义文件见 package.json 中typings: typings/react-native-code-push.d.ts源码见 typings/react-native-code-push.d.ts可直接import获得编辑器智能提示与编译期类型检查。需要注意若tsconfig.json中将target或module设为es6必须同时将moduleResolution设为node否则 TypeScript 编译器不会在node_modules中查找类型定义报错形如error TS2307: Cannot find module react-native-code-push。十二、示例应用与延伸阅读仓库提供了可直接参考的官方示例工程 Examples/CodePushDemoAppiOS/Android 双平台 demo含App.js、原生接入与 Podfile与 Examples/CodePushDemoAppCppWindows C demoRecipes目录还收录了 UpdateOnStart.ios.js启动时更新与 UpdateButton.ios.js按钮触发更新两个迷你配方适合快速对照。仓库还附带自动化测试框架 code-push-plugin-testing-framework 与覆盖sync、checkForUpdate、多场景安装回滚的测试脚本test/template/scenarios可用于验证插件各行为路径。最后再次强调本仓库的存档状态App Center 已于 2025 年 3 月 31 日退役CodePush 随之停止服务本仓库被归档同时 React Native 0.76 起的新架构不支持该插件需 opt-out 后使用。本文内容忠实记录该插件的设计机制与历史用法供理解其架构与迁移参考。赞分享移动开发【免费下载链接】react-native-code-pushReact Native module for CodePush项目地址https://gitcode.com/gh_mirrors/re/react-native-code-push点击查看免费下载相关推荐3分钟掌握无损歌词下载网易云QQ音乐LRC文件终极指南3分钟掌握无损歌词下载网易云QQ音乐LRC文件终极指南 还在为找不到高质量音乐歌词而烦恼云音乐歌词获取处理工具让你轻松从网易云音乐和QQ音乐下载精准LRC歌桌面应用音视频react-native-code-push Windows 集成指南React Native Windows 项目的 CodePush 安装与配置react native code push Windows 集成指南React Native Windows 项目的 CodePush 安装与配置 导读 本移动开发深入理解lisong/code-push-server在React Native热更新中的应用深入理解lisong/code push server在React Native热更新中的应用 前言 在移动应用开发中热更新 Hot Update 是一项非常上一篇OmX 0.7.6 发版解读Team 可靠性加固、角色路由与 MCP Team 运行时抽取下一篇深入解析 Joplin 同步目标快照与笔记库格式以 folder 元数据文件为切入点创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表