Firma manual de los targets del Apple Watch para App Store

Los dos targets de watchOS seguían en firma automática y el export no tenía
sus perfiles, así que la build 88 nunca llegó a subirse. Ahora:

- PortfolioJournalWatch y PortfolioJournalWatchWidget en Release con
  CODE_SIGN_STYLE = Manual y sus perfiles App Store recién creados en el
  portal ("Portfolio Journal Watch App Store" / "... Watch Widget App Store").
- CODE_SIGN_IDENTITY con el nombre completo "Apple Distribution: Alexandre
  Vazquez" en los cinco targets embebidos, en vez del genérico.
- ExportOptions.plist y el script de release con los CINCO bundle ids en
  provisioningProfiles (faltaban los dos del reloj).
- El script valida con `altool --validate-app` antes de subir, para no gastar
  un número de build en un IPA que la App Store va a rechazar.

Con la firma totalmente manual y los perfiles instalados en local, el archive
ya no necesita -allowProvisioningUpdates ni la API key, así que esquiva el bug
del bearer token de xcodebuild.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F1u4K16xy7eQVtgsYNZ9Vn
This commit is contained in:
alexandrev-tibco
2026-09-18 23:02:04 +02:00
parent 12386673ff
commit 8daa80bb42
3 changed files with 59 additions and 9 deletions
+26 -2
View File
@@ -2,13 +2,37 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>destination</key>
<string>export</string>
<key>manageAppVersionAndBuildNumber</key>
<false/>
<key>method</key>
<string>app-store-connect</string>
<!-- Firma MANUAL obligatoria: el cloud signing con API key falla al exportar las
extensiones ("No profiles ... were found"). Los 5 targets embebidos se firman
con "Apple Distribution" + sus perfiles App Store instalados localmente. -->
<key>signingStyle</key>
<string>manual</string>
<key>signingCertificate</key>
<string>Apple Distribution</string>
<key>provisioningProfiles</key>
<dict>
<key>com.alexandrevazquez.PortfolioJournal</key>
<string>porfoliojournal</string>
<key>com.alexandrevazquez.PortfolioJournal.PortfolioJournalWidget</key>
<string>Portfolio Journalwidget</string>
<key>com.alexandrevazquez.PortfolioJournal.QuickUpdate</key>
<string>PortfolioJournal QuickUpdate AppStore</string>
<key>com.alexandrevazquez.PortfolioJournal.watchkitapp</key>
<string>Portfolio Journal Watch App Store</string>
<key>com.alexandrevazquez.PortfolioJournal.watchkitapp.widget</key>
<string>Portfolio Journal Watch Widget App Store</string>
</dict>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>2825Q76T7H</string>
<key>uploadSymbols</key>
<true/>
<key>signingStyle</key>
<string>automatic</string>
</dict>
</plist>
+9 -5
View File
@@ -730,7 +730,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = PortfolioJournal/PortfolioJournal.entitlements;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_IDENTITY = "Apple Distribution: Alexandre Vazquez";
CODE_SIGN_STYLE = Manual;
PROVISIONING_PROFILE_SPECIFIER = "porfoliojournal";
CURRENT_PROJECT_VERSION = 89;
@@ -923,7 +923,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_ENTITLEMENTS = PortfolioJournalWidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_IDENTITY = "Apple Distribution: Alexandre Vazquez";
CODE_SIGN_STYLE = Manual;
PROVISIONING_PROFILE_SPECIFIER = "Portfolio Journalwidget";
CURRENT_PROJECT_VERSION = 89;
@@ -1077,7 +1077,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = PortfolioJournalQuickUpdateExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_IDENTITY = "Apple Distribution: Alexandre Vazquez";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 89;
DEVELOPMENT_TEAM = 2825Q76T7H;
@@ -1146,7 +1146,9 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = PortfolioJournalWatch.entitlements;
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Apple Distribution: Alexandre Vazquez";
CODE_SIGN_STYLE = Manual;
PROVISIONING_PROFILE_SPECIFIER = "Portfolio Journal Watch App Store";
CURRENT_PROJECT_VERSION = 89;
DEVELOPMENT_TEAM = 2825Q76T7H;
ENABLE_PREVIEWS = YES;
@@ -1215,7 +1217,9 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = PortfolioJournalWatchWidget.entitlements;
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Apple Distribution: Alexandre Vazquez";
CODE_SIGN_STYLE = Manual;
PROVISIONING_PROFILE_SPECIFIER = "Portfolio Journal Watch Widget App Store";
CURRENT_PROJECT_VERSION = 89;
DEVELOPMENT_TEAM = 2825Q76T7H;
ENABLE_PREVIEWS = YES;
+24 -2
View File
@@ -101,8 +101,8 @@ create_export_options() {
<false/>
<key>method</key>
<string>app-store-connect</string>
<!-- Firma MANUAL obligatoria: el cloud signing con API key falla al exportar la
extensión QuickUpdate ("No profiles ... were found"). Los 3 targets se firman
<!-- Firma MANUAL obligatoria: el cloud signing con API key falla al exportar las
extensiones ("No profiles ... were found"). Los 5 targets embebidos se firman
con "Apple Distribution" + sus perfiles App Store instalados localmente. -->
<key>signingStyle</key>
<string>manual</string>
@@ -116,6 +116,10 @@ create_export_options() {
<string>Portfolio Journalwidget</string>
<key>com.alexandrevazquez.PortfolioJournal.QuickUpdate</key>
<string>PortfolioJournal QuickUpdate AppStore</string>
<key>com.alexandrevazquez.PortfolioJournal.watchkitapp</key>
<string>Portfolio Journal Watch App Store</string>
<key>com.alexandrevazquez.PortfolioJournal.watchkitapp.widget</key>
<string>Portfolio Journal Watch Widget App Store</string>
</dict>
<key>stripSwiftSymbols</key>
<true/>
@@ -158,6 +162,23 @@ export_ipa() {
-authenticationKeyIssuerID "$ISSUER_ID"
}
validate_ipa() {
local ipa
ipa="$(find "$EXPORT_PATH" -maxdepth 1 -name '*.ipa' -print -quit)"
[[ -n "$ipa" ]] || fail "No se encontro ningun .ipa en $EXPORT_PATH"
# Validar SIEMPRE antes de subir: pilla iconos ausentes, orientaciones de iPad
# incompletas e Info.plist mal formados sin gastar un numero de build.
echo "==> Validando $(basename "$ipa")"
API_PRIVATE_KEYS_DIR="$P8_DIR" \
xcrun altool \
--validate-app \
--type ios \
--file "$ipa" \
--apiKey "$KEY_ID" \
--apiIssuer "$ISSUER_ID"
}
upload_ipa() {
local ipa
ipa="$(find "$EXPORT_PATH" -maxdepth 1 -name '*.ipa' -print -quit)"
@@ -189,6 +210,7 @@ main() {
create_export_options
archive_app
export_ipa
validate_ipa
upload_ipa
echo "==> Proceso completado"