This page is the short command reference for local verification, build-number
management, and App Store Connect/TestFlight uploads. Platform-specific signing
details live in docs/ios_testflight_signing.md and
docs/macos_testflight_signing.md.
Use docs/ios_release.md and docs/macos_release.md for the full release
runbooks.
Run static analysis:
flutter analyzeRun all Flutter tests:
flutter test -r expandedRun only the release gate tests:
flutter test test/release/cloudkit_release_gate_test.dart -r expandedRun the CloudKit/release preflight without the production confirmation gate:
./tool/check_cloudkit_release_ready.shRun the iOS-only App Store Connect release surface check:
./tool/check_cloudkit_release_ready.sh --distribution ios_app_storeRun the macOS App Store release surface check:
./tool/check_cloudkit_release_ready.sh --distribution app_storeFor the fastest physical-device debug loop, run a Debug build directly on the iPhone. This stays attached to Flutter, so hot reload and hot restart are available:
./tool/ios_dev_install.shForce USB/attached discovery:
./tool/ios_dev_install.sh --attachedInstall the build without keeping a Flutter debug session attached:
./tool/ios_dev_install.sh --install-onlyWireless deploy works after the iPhone has been paired for network debugging in Xcode:
./tool/ios_dev_install.sh --wirelessIf more than one physical iOS device is visible, pass the Flutter device id or name:
./tool/ios_dev_install.sh --device 00008110-0000000000000000First-time setup is still Apple/Xcode controlled: connect the iPhone by USB,
unlock it, trust the Mac, enable Developer Mode if iOS asks, then open
Xcode > Window > Devices and Simulators and enable "Connect via network" for
wireless runs. If the wireless device disappears, fall back to --attached
first and re-check the Xcode device pairing.
Preview the next iOS build number without changing files:
./tool/bump_build_number.sh --platform ios --dry-runIncrement the iOS build number before a manual Xcode archive:
./tool/bump_build_number.sh --platform iosPreview or increment the macOS build number:
./tool/bump_build_number.sh --platform macos --dry-run
./tool/bump_build_number.sh --platform macosSet a specific platform build number:
./tool/bump_build_number.sh --platform ios --set 42
./tool/bump_build_number.sh --platform macos --set 42The script updates the platform-specific Xcode settings in
ios/Runner/Configs/AppInfo.xcconfig or
macos/Runner/Configs/AppInfo.xcconfig. iOS reads
SERLINK_IOS_BUILD_NUMBER; macOS reads SERLINK_MACOS_BUILD_NUMBER.
pubspec.yaml still provides the shared app version name.
Check local iOS signing assets when using locally installed distribution certificates and profiles:
./tool/check_ios_testflight_signing.shUpload a new iOS TestFlight build using Xcode-managed automatic signing:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_ios_testflight.sh --bump-build-number -allowProvisioningUpdatesUpload iOS using an already-bumped build number:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_ios_testflight.sh -allowProvisioningUpdatesUpload iOS with a specific build number:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_ios_testflight.sh --build-number 42 -allowProvisioningUpdatesFor CI, pass App Store Connect API key authentication through to xcodebuild:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_ios_testflight.sh \
--bump-build-number \
-allowProvisioningUpdates \
-authenticationKeyPath /path/to/AuthKey.p8 \
-authenticationKeyID KEY_ID \
-authenticationKeyIssuerID ISSUER_IDCheck local macOS signing assets when using locally installed distribution certificates and profiles:
./tool/check_macos_testflight_signing.shUpload a new macOS TestFlight build using Xcode-managed automatic signing:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_macos_testflight.sh --bump-build-number -allowProvisioningUpdatesUpload macOS using an already-bumped build number:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_macos_testflight.sh -allowProvisioningUpdatesUpload macOS with a specific build number:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_macos_testflight.sh --build-number 42 -allowProvisioningUpdatesFor CI, pass App Store Connect API key authentication through to xcodebuild:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_macos_testflight.sh \
--bump-build-number \
-allowProvisioningUpdates \
-authenticationKeyPath /path/to/AuthKey.p8 \
-authenticationKeyID KEY_ID \
-authenticationKeyIssuerID ISSUER_IDBuild the direct distribution app with Developer ID signing settings:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/build_macos_direct.shThis produces the direct channel app build. Package the resulting app into a DMG and notarize it before distributing outside the Mac App Store.
Apple rejects App Store/TestFlight uploads when the large app icon contains an alpha channel. Check the 1024px icons before upload:
sips -g hasAlpha \
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png \
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.pngBoth outputs should be hasAlpha: no.
Do not commit .p8 API keys, certificate exports, provisioning profiles, or
Apple account credentials.
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 is an explicit local
confirmation that the CloudKit Development schema for
iCloud.com.alkinum.serlink has already been deployed to Production in
CloudKit Console.