Как добавить 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)
- Откройте файл ios/Podfile
- Найдите строку, начинающуюся с platform :ios,
- Измените её или добавьте, если её нет:
📌 Пример:
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 или файловый менеджер хостинга.