Как добавить CodePush в React Native проект (обновлено на 2025 год)

Опубликовано 12 июля 2025 AntonSeagull 3 min

В этом гайде мы рассмотрим настройку собственного CodePush-сервера и интеграцию его в ваш React Native проект.

Сервер для обновления

⚠️ App Center больше не работает — что делать?

Microsoft закрыл App Center CodePush и теперь, чтобы продолжить использовать обновления “по воздуху” (OTA) для React Native, необходимо развернуть свой собственный сервер CodePush.

Вы можете установить полноценный сервер CodePush, например Microsoft/code-push-server, но его настройка требует Node.js, MongoDB и Redis, что может быть избыточным для небольших проектов или обычного shared-хостинга.

✅ Простая альтернатива: codepush-php-server

Вместо этого я использую codepush-php-server — это легковесный сервер на PHP, который можно развернуть на любом стандартном хостинге с поддержкой PHP.

Скопируйте код проекта https://github.com/AntonSeagull/codepush-php-server на ваш VDS или хостинг.

Переименуйте файл конфигурации и установите свой ключ:

cp config.tmp.php config.php

Затем откройте config.php и измените upload_key на ваш секретный ключ:

$config = [
    'upload_key' => 'your-secret-key-here', // Замените на ваш ключ
    'dirs' => [
        'storage_path' => __DIR__ . '/storage',
        'codepush' => 'codepush',
        'capgo' => 'capgo',
    ]
];

Установите утилиту для загрузки сборок:

curl -sSL https://raw.githubusercontent.com/AntonSeagull/liveupdate-cli/main/install.sh | bash

В вашем проекте React Native выполните:

npm install react-native-code-push
или
yarn add react-native-code-push

iOS проект

⚠️ Важно: установите минимальную версию iOS 15.5 (перед pod install)

  1. Откройте файл ios/Podfile
  2. Найдите строку, начинающуюся с platform :ios,
  3. Измените её или добавьте, если её нет:

📌 Пример:

platform :ios, '15.5'

require Pod::Executable.execute_command('node', ['-p',
  'require.resolve(
    "react-native/scripts/react_native_pods.rb",
    {paths: [process.argv[1]]},
  )', __dir__]).strip

Сохраните файл, затем выполните в терминале:

cd ios
rm -rf Pods Podfile.lock
pod install

Обязательно откройте проект в Xcode и убедитесь, что в настройках таргета также установлено “Deployment Target” → iOS 15.5.

Добавьте Deployment Key и URL сервера в Info.plist

<key>CodePushDeploymentKey</key>
<string>ВАШ_DEPLOYMENT_KEY</string>

<key>CodePushServerURL</key>
<string>https://your-codepush-server.com</string>

CodePushDeploymentKey можно оставить пустым и устанавливать в коде приложения, например в зависимости от сборки или по другой логике.

Откройте Xcode проект

В проект создайте Codepush-Bridging-Header.h

#import <CodePush/CodePush.h>

В файл AppDelegate.swift замените

Bundle.main.url(forResource: "main", withExtension: "jsbundle")

на

 CodePush.bundleURL()

Укажите файл Codepush-Bridging-Header.h в настройках проекта

React Native

В директории проекта создайте codepush-config.ts

   import { Platform } from 'react-native';

const codePushConfig = {
    "android": {
        "dev": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "prod": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
    },
    "ios": {
        "dev": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "prod": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
    }
}

const buildType: 'prod' | 'dev' = 'prod';

export const getDeploymentKey = (): string | null => {
    if (Platform.OS == 'ios' || Platform.OS == 'android') {
        if (codePushConfig?.[Platform.OS]?.[buildType]) {
            return codePushConfig[Platform.OS][buildType];
        }
    }

    return null;
}; 

Ключи замените на свой. Если вы используете сервер CodePush то те что что создадите в нем, если используете codepush-php-server, то для создания новых ключей выполните команду

liveupdate-cli --keys

Вы получите новые ключи которые можете использовать

{
  "android": {
    "dev": "aetBMb000pNZN5aKu7gcQqOn6D4CRMsQ",
    "prod": "uCVQyJuMeqqH5KRHbqZbfgja68C9ZpWA"
  },
  "ios": {
    "dev": "gTUqGfbuIUXDB6hFRZqfGUPKXZkpClV0",
    "prod": "VRYPa4qX3zVRLjU7ruc5TbKhmn3yvuja"
  }
}

В коде приложения выполните запрос обновления, пример:

import CodePush from 'react-native-code-push';
...
  const deploymentKey = getDeploymentKey();

    if (!deploymentKey) return;
    CodePush.sync(
      {
        mandatoryInstallMode: CodePush.InstallMode.ON_NEXT_RESTART,
        installMode: CodePush.InstallMode.ON_NEXT_RESTART,

        deploymentKey: deploymentKey,

      });

Выпуск обновления

Если используете CodePush сервер то выполните инструкции по обновлению с документации. Если CodePush-php-server, то в директории проекта выполните команду:

liveupdate-cli
Choose platform (android/ios) [android]: ios
Choose environment (dev/prod) [prod]: 
Enter native app version (e.g. 1.0.0) []: 1.0.0
Enter deployment key for ios (prod environment): XXXXXX
✅ Using provided deployment key: XXXX
🔑 Deployment Key: XXXX
⚙️  Building react-native bundle...
                Welcome to Metro v0.82.3
              Fast - Scalable - Integrated


Writing bundle output to: build/main.jsbundle
Done writing bundle output
Copying 37 asset files
Done copying assets
📦 Package size: 1104919 bytes
✅ Build complete: liveupdates/XXXX-1.0.0-1752398153-215ceec0c0894ed1b6f3e4fb6d1a7a7d748300beebc0cd129db2dfb15d64594c-ios-1104919-update.zip
📦 Package hash: 215ceec0c0894ed1b6f3e4fb6d1a7a7d748300beebc0cd129db2dfb15d64594c
🏷  Label: 1752398153
Upload to Server? (y/N): y
✅ Upload complete.
Вопрос Ответ
Choose platform (android/ios) [android] Выбор платформы
Choose environment (dev/prod) dev или prod обновление
Enter native app version (e.g. 1.0.0) Номер версии приложения для обновления
Enter deployment key for ios (prod environment) Ключ обновления из codepush-config.ts

Все ранее веденные настройки сохранятся в файле build-config.json, который автоматически будет создан в директории проекта.

Вот блок, который можно добавить в конец статьи:

Где хранятся обновления

После загрузки сборки с помощью liveupdate-cli, архив автоматически сохраняется на сервере в директории:

/storage/codepush/ВАШDEPLOYMENT_KEY/Номерверсии/

📂 Например:

/storage/codepush/tHn6nf8tfCh2QqVyTmYaBTdfQjxG4ksvOXqog/3.1.4/

Каждое обновление сохраняется в отдельной подпапке, соответствующей версии приложения (version), которую вы указываете при сборке.

🧹 Если вам нужно вручную удалить старые или ошибочные обновления — просто удалите нужную папку с сервера через FTP, SFTP или файловый менеджер хостинга.

Статья помогла? Подарите мне чашку кофе ☕