Dois apps React Native mínimos configurados com o Pipa no Ar, updates OTA para React Native sem operar servidor, banco ou armazenamento. Os dois usam o SDK e a CLI oficiais do hot-updater, na versão 1.0.0-rc.24, com o preset @pipanoar/hot-updater.
A tela de cada app mostra a Versão do JavaScript, o id do bundle em uso, o canal e a versão do app. Você muda o JavaScript, publica, reabre o app e vê o update chegar.
| Pasta | O que é | Versões |
|---|---|---|
bare/ |
React Native sem Expo, criado com o template oficial (@react-native-community/cli) |
React Native 0.85.3, React 19.2.3 |
expo/ |
Expo com prebuild (o ios/ e o android/ são gerados) |
Expo SDK 56, React Native 0.85.3 |
Os dois usam @hot-updater/react-native, hot-updater e @hot-updater/bare ou @hot-updater/expo na versão 1.0.0-rc.24, e @pipanoar/hot-updater 0.1.
Documentação: https://docs.pipanoar.scuderiatech.com.br
- Node 22 ou mais novo.
- Para o app bare no iOS: Xcode, Ruby e CocoaPods. No Android: Android Studio com o SDK.
- Uma conta no painel. O plano Free serve.
Os apps vêm com valores de exemplo. Para receber updates, troque pelos do seu app:
- No painel, crie uma organização e um app. O appId (começa com
app_) fica na página Setup do app. - No app, abra API keys e crie uma chave.
- Cole os dois em
src/pipanoar.ts(o arquivo existe embare/e emexpo/):A API key só lê os updates deste app, então pode ir dentro do bundle. Oexport const PIPANOAR_APP_ID = "app_..."; export const PIPANOAR_API_KEY = "...";
hot-updater.config.tsusa o mesmo appId. - Na organização, abra Tokens de deploy, crie um token com escopo Deploy e deixe na variável de ambiente:
O token é secreto: nunca coloque no código nem no repositório.
export PIPANOAR_TOKEN=pn_...
cd bare
npm install
cd ios && bundle install && bundle exec pod install && cd ..Gere uma build de release e instale no aparelho ou no emulador. Updates OTA não rodam em builds de debug, que carregam o JavaScript do Metro.
npx react-native run-android --mode release
npx react-native run-ios --mode ReleasePublique um update:
- Em
src/DemoScreen.tsx, mudeJS_VERSION(por exemplo, de"1"para"2"). - Rode:
npm run deploy:android # ou deploy:ios - Feche e abra o app duas vezes: na primeira ele baixa o update, na segunda abre com ele. A tela mostra a versão nova e o id do bundle.
No painel, a release aparece em Releases e os números começam a chegar em Insights.
| Arquivo | O que faz |
|---|---|
App.tsx |
Envolve o app com HotUpdater.wrap(...), pipanoarClient(...) e o plugin insights() |
hot-updater.config.ts |
Build bare({ enableHermes: true }) e pipanoar({ appId }) para a CLI |
ios/PipaNoArExemplo/AppDelegate.swift |
Na release, bundleURL() devolve HotUpdater.bundleURL() |
android/app/src/main/java/com/pipanoarexemplo/MainApplication.kt |
Na release, getDefaultReactHost(...) recebe jsBundleFilePath = HotUpdater.getJSBundleFile(applicationContext) |
O npx hot-updater doctor confere se a parte nativa ficou certa.
O Expo Go não carrega bundles de fora, então não serve para testar updates. Use uma build de release gerada por você (ou pelo EAS).
cd expo
npm install
export PIPANOAR_TOKEN=pn_... # o plugin do hot-updater lê o hot-updater.config.ts no prebuild
npx expo prebuild
npm run android:release # ou ios:releaseO plugin @hot-updater/expo no app.json faz a parte nativa sozinho no npx expo prebuild. Para publicar, mude JS_VERSION em src/DemoScreen.tsx e rode:
npm run deploy:android # ou deploy:iosOs scripts de deploy do Expo passam -t com a version do app.json, porque sem o prebuild a CLI não acha a versão do app nos arquivos nativos.
O workflow .github/workflows/ci.yml roda em cada push e pull request:
- instala com
npm cie roda otsc --noEmitnos dois apps; - gera o bundle JavaScript sem Xcode nem Android SDK:
npx react-native bundleno bare enpx expo exportno Expo.
Ele também tem um job manual de deploy. Para usar no seu fork:
- Em Settings, Secrets and variables, Actions, crie os segredos:
PIPANOAR_TOKEN: token de deploy (obrigatório);PIPANOAR_APP_ID: appId do app (opcional). Se existir, o deploy confere se é o mesmo appId desrc/pipanoar.tse para se for diferente.
- Em Actions, CI, Run workflow, escolha o app (
bareouexpo) e o canal.
O job roda npx hot-updater deploy -p android no app escolhido. Mais detalhes em Deploy pelo CI.
- Guia rápido e guia do Expo.
- Releases e rollout: liberar para uma parte dos aparelhos e desativar uma release.
- Assinatura de bundles: o app só aceitar updates assinados.
- Num projeto seu,
npx @pipanoar/initinstala os pacotes, cria o config e envolve o app.
Minimal React Native apps (bare and Expo) wired to Pipa no Ar, a hosted over-the-air update service for React Native built on the official hot-updater SDK and CLI (1.0.0-rc.24).
- Create an app in the dashboard, then put its appId and an API key in
src/pipanoar.ts. - Create a deploy token and export it as
PIPANOAR_TOKEN. Never commit it. - Install a release build (
bare:npx react-native run-android --mode release;expo:npx expo prebuildthennpm run android:release). - Change
JS_VERSIONinsrc/DemoScreen.tsxand runnpm run deploy:android. Restart the app twice to see the update.
CI type-checks both apps and bundles the JavaScript without native toolchains. A manual job deploys an update using the PIPANOAR_TOKEN and PIPANOAR_APP_ID repository secrets. Docs (Portuguese): https://docs.pipanoar.scuderiatech.com.br
MIT, veja LICENSE. Built on hot-updater. Um produto ScuderiaTech.