From d5ac292d363a05fe747b6a9a32a79be99d57a2a7 Mon Sep 17 00:00:00 2001 From: zarzet <42882290+zarzet@users.noreply.github.com> Date: Sat, 19 Sep 2026 12:10:25 +0700 Subject: [PATCH] fix(ios): keep release feed bundle identity in sync Use com.zarz.spotiflac for the app and matching test targets. Read the bundle identifier from the built IPA when updating apps.json so the release feed matches the distributed application. Validation: Xcode project plist lint and binary IPA bundle identifier extraction passed. --- .github/workflows/release.yml | 16 +++++++++++++++- apps.json | 2 +- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a03ead06..dbe81f55 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -449,6 +449,19 @@ jobs: fi IPA_SIZE=$(stat -c%s "$IPA_FILE" 2>/dev/null || stat -f%z "$IPA_FILE") + BUNDLE_ID=$(python3 - "$IPA_FILE" <<'PY' + import plistlib + import sys + import zipfile + + with zipfile.ZipFile(sys.argv[1]) as ipa: + info_path = next(name for name in ipa.namelist() + if name.startswith("Payload/") + and name.count("/") == 2 + and name.endswith(".app/Info.plist")) + print(plistlib.loads(ipa.read(info_path))["CFBundleIdentifier"]) + PY + ) if [ ! -f apps.json ]; then echo "WARNING: apps.json not found on main, skipping" @@ -456,10 +469,11 @@ jobs: fi jq --arg ver "$VERSION_NUM" \ + --arg bundle "$BUNDLE_ID" \ --arg date "$DATE" \ --arg url "https://github.com/${REPOSITORY}/releases/download/${VERSION}/SpotiFLAC-${VERSION}-ios-unsigned.ipa" \ --argjson size "$IPA_SIZE" \ - '.apps[0].version = $ver | .apps[0].versionDate = $date | .apps[0].downloadURL = $url | .apps[0].size = $size' \ + '.apps[0].bundleIdentifier = $bundle | .apps[0].version = $ver | .apps[0].versionDate = $date | .apps[0].downloadURL = $url | .apps[0].size = $size' \ apps.json > apps.json.tmp && mv apps.json.tmp apps.json echo "Updated apps.json:" diff --git a/apps.json b/apps.json index 1b993bac..b89446ed 100644 --- a/apps.json +++ b/apps.json @@ -5,7 +5,7 @@ "apps": [ { "name": "SpotiFLAC Mobile", - "bundleIdentifier": "com.zarz.spotiflacAndroid", + "bundleIdentifier": "com.zarz.spotiflac", "developerName": "zarzet", "version": "4.9.6", "versionDate": "2026-09-07", diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4632f304..1b81b7d8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -499,7 +499,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflacAndroid; + PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflac; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -516,7 +516,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflacAndroid.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflac.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -534,7 +534,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflacAndroid.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflac.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -550,7 +550,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflacAndroid.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflac.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -681,7 +681,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflacAndroid; + PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflac; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -703,7 +703,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflacAndroid; + PRODUCT_BUNDLE_IDENTIFIER = com.zarz.spotiflac; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0;