diff --git a/.github/workflows/build-ios.yml b/.github/workflows/build-ios.yml index 7f1a2936..fd922c7e 100644 --- a/.github/workflows/build-ios.yml +++ b/.github/workflows/build-ios.yml @@ -22,7 +22,7 @@ on: default: "0" outputs: version: - description: "Independent iOS version and build date." + description: "iOS artifact version; combined releases match the desktop tag." value: ${{ jobs.build.outputs.version }} pull_request: paths: @@ -122,22 +122,29 @@ jobs: echo "CROSSDESK_RELEASE_BUILD=YES" >> "${GITHUB_ENV}" fi - - name: Read independent iOS version + - name: Resolve iOS version id: ios_version shell: bash run: | - IOS_VERSION_BASE="$(xcodebuild \ - -project apps/ios/CrossDeskMobile.xcodeproj \ - -scheme CrossDeskMobile \ - -configuration Release \ - -destination 'generic/platform=iOS' \ - -showBuildSettings CODE_SIGNING_ALLOWED=NO | \ - awk '$1 == "MARKETING_VERSION" && $2 == "=" { print $3 }')" + if [[ "${CROSSDESK_SOURCE_TAG}" == v* ]]; then + # Combined releases share the desktop version, including the date + # and optional hotfix suffix in the artifact filename. + IOS_VERSION_BASE="${VERSION_NUM#v}" + IOS_VERSION_BASE="${IOS_VERSION_BASE%%-*}" + else + IOS_VERSION_BASE="$(xcodebuild \ + -project apps/ios/CrossDeskMobile.xcodeproj \ + -scheme CrossDeskMobile \ + -configuration Release \ + -destination 'generic/platform=iOS' \ + -showBuildSettings CODE_SIGNING_ALLOWED=NO | \ + awk '$1 == "MARKETING_VERSION" && $2 == "=" { print $3 }')" + VERSION_NUM="v${IOS_VERSION_BASE}-${VERSION_NUM##*-}" + fi if [[ ! "${IOS_VERSION_BASE}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Invalid iOS marketing version: ${IOS_VERSION_BASE}" >&2 exit 1 fi - VERSION_NUM="v${IOS_VERSION_BASE}-${VERSION_NUM##*-}" if [[ "${CROSSDESK_SOURCE_TAG}" == ios-v* && "${CROSSDESK_SOURCE_TAG#ios-}" != "${VERSION_NUM}" ]]; then echo "iOS source tag does not match the app version: ${CROSSDESK_SOURCE_TAG} vs ${VERSION_NUM}" >&2 exit 1 @@ -200,6 +207,7 @@ jobs: CODE_SIGNING_ALLOWED=NO \ CODE_SIGNING_REQUIRED=NO \ COMPILER_INDEX_STORE_ENABLE=NO \ + MARKETING_VERSION="${IOS_VERSION_BASE}" \ IPHONEOS_DEPLOYMENT_TARGET="${IOS_DEPLOYMENT_TARGET}" \ build diff --git a/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj b/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj index d7cb6bcf..59c154cf 100644 --- a/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj +++ b/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj @@ -353,7 +353,7 @@ ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 8DNC3SZ86S; ENABLE_BITCODE = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -366,7 +366,7 @@ ); INFOPLIST_FILE = CrossDeskMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MARKETING_VERSION = 0.0.1; + MARKETING_VERSION = 1.6.1; OTHER_LDFLAGS = ( "$(inherited)", "$(PROJECT_DIR)/Vendor/$(PLATFORM_NAME)/$(CONFIGURATION)/libCrossDeskMiniRTC.a", @@ -403,7 +403,7 @@ ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 8DNC3SZ86S; ENABLE_BITCODE = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -416,7 +416,7 @@ ); INFOPLIST_FILE = CrossDeskMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MARKETING_VERSION = 0.0.1; + MARKETING_VERSION = 1.6.1; OTHER_LDFLAGS = ( "$(inherited)", "$(PROJECT_DIR)/Vendor/$(PLATFORM_NAME)/$(CONFIGURATION)/libCrossDeskMiniRTC.a", diff --git a/apps/ios/README.md b/apps/ios/README.md index 5ca0ca93..967df534 100644 --- a/apps/ios/README.md +++ b/apps/ios/README.md @@ -52,8 +52,9 @@ For an existing checkout, run `git submodule update --init --recursive` from the repository root. All remaining commands below use that root directory. For a released app, select the tag shown in **Settings → About and open-source licenses** when cloning: `git clone --branch --recurse-submodules -https://github.com/kunkundi/crossdesk.git`. The iOS marketing version is independent -of the repository tag; use the source tag or commit recorded in the app. +https://github.com/kunkundi/crossdesk.git`. Combined releases share the desktop +tag's numeric version. Use the source tag or commit recorded in the app to +identify its exact source. Install [Xmake](https://xmake.io/guide/quick-start.html) 3.1.1 or newer, CMake, and a current Python 3 with setuptools/wheel. Pin the package repository @@ -143,10 +144,14 @@ The workflow builds with the minimum supported Xmake version (3.1.1) and retains the pinned Xcode/SDK, dependency cache, license catalog validation, unsigned arm64 Release build, and app-bundle verification. Unit tests run locally as needed. It uploads -`crossdesk-ios-arm64-unsigned-v-.zip`, +`crossdesk-ios-arm64-unsigned-v-.zip`, including the app, source metadata, third-party source catalog, rights notice -and any generated dSYM. The version comes from the iOS target; dated repository -tags provide the build date, otherwise the date uses the Asia/Shanghai timezone. +and any generated dSYM. For combined `v*` releases, the ZIP uses the same version, +date and optional hotfix suffix as the desktop packages, and the app's +`MARKETING_VERSION` is set to the tag's numeric version during the build. +Branch builds and independent `ios-v*` releases use the iOS target's +`MARKETING_VERSION`. Dated tags provide the build date; otherwise the date uses +the Asia/Shanghai timezone. The main workflow collects this same ZIP for GitHub Releases and the download server. Standalone `Build iOS` runs only upload the build artifact.