From 1e3457523490db1f7cf7c0217b4cb0893143f98d Mon Sep 17 00:00:00 2001 From: oratis Date: Thu, 2 Jul 2026 00:34:42 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(ios):=20MARKETING=5FVERSION=200.1.0=20?= =?UTF-8?q?=E2=86=92=201.0=20(must=20be=20>=3D=20app's=20App=20Store=20ver?= =?UTF-8?q?sion)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The App Store Connect record for Lisa Pocket is at version 1.0 (PREPARE_FOR_SUBMISSION), with builds under the 1.0 train. project.yml still carried a stale "0.1.0", so testflight.sh archives declared CFBundleShortVersionString 0.1.0 — LOWER than 1.0. App Store Connect silently rejects a too-low marketing version at ingestion: the upload reports "EXPORT SUCCEEDED" but no build ever appears in TestFlight (no 0.1.0 train is even created). Together with the build-number fix in this branch, this is the second half of "why don't my uploads show up." Bump to 1.0 so archives attach to the existing train by default. Co-Authored-By: Claude Opus 4.8 (1M context) --- packaging/ios-companion/project.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packaging/ios-companion/project.yml b/packaging/ios-companion/project.yml index 56b0a68..ebfb5a4 100644 --- a/packaging/ios-companion/project.yml +++ b/packaging/ios-companion/project.yml @@ -11,7 +11,10 @@ options: settings: base: SWIFT_VERSION: "5.0" - MARKETING_VERSION: "0.1.0" + # Must be >= the app's App Store version (currently 1.0, PREPARE_FOR_SUBMISSION). + # A lower CFBundleShortVersionString (this was "0.1.0") is silently REJECTED by + # App Store Connect at ingestion — upload "succeeds" but no build ever appears. + MARKETING_VERSION: "1.0" CURRENT_PROJECT_VERSION: "1" TARGETED_DEVICE_FAMILY: "1,2" # Automatic signing for device archives (testflight.sh): Xcode picks the From f54114787d3b0405428f89eefaf5fded3c0b837e Mon Sep 17 00:00:00 2001 From: oratis Date: Thu, 2 Jul 2026 00:40:09 +0800 Subject: [PATCH 2/2] fix(ios): stamp CFBundleVersion into the generated Info.plists (override was a no-op) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit xcodegen writes a LITERAL CFBundleVersion ("1") into Sources/Info.plist and Widgets/Info.plist, so `xcodebuild archive … CURRENT_PROJECT_VERSION=$BUILD_NUMBER` never changed the shipped build number — every archive was build "1". App Store Connect kept rejecting them as "Redundant Binary Upload" (and the earlier ones under the wrong 0.1.0 train vanished outright). After `xcodegen generate`, plutil-replace CFBundleVersion in both the app and the widget extension (they must match, or embedded-binary validation fails) with $BUILD_NUMBER. Verified locally: post-generate both read "1"; post-patch both read the timestamp and are equal. Third of three TestFlight-upload fixes in this branch (build# < 2^32, marketing version >= app version, and now the build# actually reaching the binary). Co-Authored-By: Claude Opus 4.8 (1M context) --- packaging/ios-companion/testflight.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packaging/ios-companion/testflight.sh b/packaging/ios-companion/testflight.sh index 81cb711..063a418 100755 --- a/packaging/ios-companion/testflight.sh +++ b/packaging/ios-companion/testflight.sh @@ -70,6 +70,16 @@ if [ -f Sources/LisaPocket.entitlements ]; then plutil -replace aps-environment -string production Sources/LisaPocket.entitlements fi +# xcodegen bakes a LITERAL CFBundleVersion ("1") into the generated Info.plists, +# so `xcodebuild ... CURRENT_PROJECT_VERSION=$BUILD_NUMBER` never reaches the +# binary — every archive shipped build "1" and App Store Connect rejected the +# duplicates ("Redundant Binary Upload … build number 1/8"). Patch the plists +# directly. The app extension MUST carry the same version or embedded-binary +# validation fails. +echo "==> set CFBundleVersion=$BUILD_NUMBER (app + widget)" +plutil -replace CFBundleVersion -string "$BUILD_NUMBER" Sources/Info.plist +[ -f Widgets/Info.plist ] && plutil -replace CFBundleVersion -string "$BUILD_NUMBER" Widgets/Info.plist + AUTH=(-allowProvisioningUpdates -authenticationKeyPath "$ASC_KEY_PATH" -authenticationKeyID "$ASC_KEY_ID"