Build local do Lado a Lado para iOS usando xcodebuild — gera IPA sem usar o EAS cloud.
Faz o build local do Lado a Lado para iOS usando xcodebuild, produzindo um IPA pronto para envio ao TestFlight.
xcode-select)gem install cocoapods)iPhone Distribution: Filipe Pacheco (3C5K4JRZHX) (fingerprint D438217E2D1F4CF73491DA06BA75D0F1AF4F32AF)~/Library/MobileDevice/Provisioning Profiles/xcodebuild -downloadPlatform iOS se necessário)Quando o usuário invocar /local-build:
expo prebuild para gerar/atualizar a pasta ios/:cd /Users/fipacheco/lado-a-lado && unset NODE_OPTIONS && npx expo prebuild --platform ios --clean
cd /Users/fipacheco/lado-a-lado/ios && unset NODE_OPTIONS && pod install
buildNumber no app.json antes de arquivar — a App Store Connect rejeita builds com versão igual ou inferior à última enviada. Ler o valor atual, incrementar o último componente e salvar:node -e "
const fs = require('fs');
const path = '/Users/fipacheco/lado-a-lado/app.json';
const json = JSON.parse(fs.readFileSync(path, 'utf8'));
const current = json.expo.ios.buildNumber;
const parts = current.split('.');
parts[parts.length - 1] = String(Number(parts[parts.length - 1]) + 1);
json.expo.ios.buildNumber = parts.join('.');
fs.writeFileSync(path, JSON.stringify(json, null, 2) + '\n');
console.log('buildNumber:', current, '->', json.expo.ios.buildNumber);
"
security cms -D -i "$HOME/Library/MobileDevice/Provisioning Profiles/c84f35bb-d964-4178-b4c0-b78dbc855d01.mobileprovision" | grep -A1 "<key>UUID" | grep "<string>" | sed 's/.*<string>\(.*\)<\/string>.*/\1/'
O profile correto é o mais recente:
*[expo] com.ladoalado.app AppStorecom UUID8a29fc14-d295-4dcc-9709-d8e18ab6094a.
cd /Users/fipacheco/lado-a-lado && xcodebuild \
-workspace ios/ladoalado.xcworkspace \
-scheme LadoaLado \
-configuration Release \
-destination 'generic/platform=iOS' \
CODE_SIGN_IDENTITY="iPhone Distribution" \
DEVELOPMENT_TEAM="3C5K4JRZHX" \
CODE_SIGN_STYLE="Manual" \
PROVISIONING_PROFILE="8a29fc14-d295-4dcc-9709-d8e18ab6094a" \
archive -archivePath /tmp/ladoalado.xcarchive
xcodebuild -exportArchive \
-archivePath /tmp/ladoalado.xcarchive \
-exportOptionsPlist /tmp/ExportOptions.plist \
-exportPath /tmp/ladoalado-export
O arquivo /tmp/ExportOptions.plist deve conter:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store-connect</string>
<key>teamID</key>
<string>3C5K4JRZHX</string>
<key>signingStyle</key>
<string>manual</string>
<key>provisioningProfiles</key>
<dict>
<key>com.ladoalado.app</key>
<string>8a29fc14-d295-4dcc-9709-d8e18ab6094a</string>
</dict>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<true/>
<key>destination</key>
<string>export</string>
</dict>
</plist>
/tmp/ladoalado-export/LadoaLado.ipa e abrir a pasta:open /tmp/ladoalado-export/
app.json (novo buildNumber):cd /Users/fipacheco/lado-a-lado
NEW_BUILD=$(node -e "const j=require('./app.json');console.log(j.expo.ios.buildNumber)")
git checkout -b "chore/bump-build-number-${NEW_BUILD}"
git add app.json
git commit -m "chore: bump iOS buildNumber para ${NEW_BUILD}"
git push -u origin "chore/bump-build-number-${NEW_BUILD}"
gh pr create \
--title "chore: bump iOS buildNumber para ${NEW_BUILD}" \
--body "Atualiza o \`buildNumber\` do \`app.json\` após build local de produção."
unset NODE_OPTIONS é obrigatório antes de expo prebuild e pod install. O VS Code injeta --require .../bootloader.js na variável NODE_OPTIONS, o que corrompe o require.resolve nos podspecs do React Native e faz o pod install falhar.LadoaLado (com L maiúsculo), não ladoalado.8a29fc14-d295-4dcc-9709-d8e18ab6094a é o mais recente (criado em 2026-03-22). Se expirar ou for renovado, obter o novo UUID com security cms -D -i "$HOME/Library/MobileDevice/Provisioning Profiles/<arquivo>.mobileprovision".xcrun altool --upload-app --type ios --file /tmp/ladoalado-export/LadoaLado.ipa --username <apple-id> --password <app-specific-password>.expo prebuild --clean se apenas quiser recompilar sem regenerar o projeto nativo — omita o passo 1 nesse caso.