This runbook covers the iOS App Store Connect and TestFlight release path for Serlink.
Related docs:
docs/development_release_commands.mdfor the short command referencedocs/ios_testflight_signing.mdfor certificates, profiles, and managed signingdocs/cloudkit_production_release.mdfor the CloudKit schema gate
- Bundle ID:
com.alkinum.serlink - CloudKit container:
iCloud.com.alkinum.serlink - CloudKit schema record:
SerlinkSyncObject - Distribution define:
SERLINK_DISTRIBUTION=app_store - Export options:
ios/Runner/ExportOptionsAppStore.plist - Xcode workspace:
ios/Runner.xcworkspace
Start from an up-to-date checkout and refresh Flutter and CocoaPods dependencies:
flutter pub get
cd ios && pod install && cd ..Run pod install again if Xcode reports:
The sandbox is not in sync with the Podfile.lock.
Run local verification:
flutter analyze
flutter test -r expanded
flutter test test/release/cloudkit_release_gate_test.dart -r expanded
./tool/check_cloudkit_release_ready.sh --distribution ios_app_storeConfirm the CloudKit Development schema has already been deployed to Production, then run the production gate:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/check_cloudkit_release_ready.sh \
--distribution ios_app_store \
--require-schema-productionCheck that the App Store icon does not contain an alpha channel:
sips -g hasAlpha \
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.pngThe output should include hasAlpha: no.
Preview the next iOS build number:
./tool/bump_build_number.sh --platform ios --dry-runIncrement the iOS build number before a manual archive:
./tool/bump_build_number.sh --platform iosSet a specific build number:
./tool/bump_build_number.sh --platform ios --set 42The script updates SERLINK_IOS_BUILD_NUMBER in
ios/Runner/Configs/AppInfo.xcconfig. iOS uses that value for
CFBundleVersion; macOS has its own independent build number.
Use this path when you want one command to check the release gate, bump the build number, archive, export, and upload to App Store Connect:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_ios_testflight.sh --bump-build-number -allowProvisioningUpdatesUse an already-bumped build number:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_ios_testflight.sh -allowProvisioningUpdatesSet a specific build number during upload:
SERLINK_CLOUDKIT_SCHEMA_PRODUCTION_CONFIRMED=1 \
./tool/upload_ios_testflight.sh --build-number 42 -allowProvisioningUpdates-allowProvisioningUpdates lets Xcode-managed automatic signing download or
create the needed App Store Connect signing assets. If you use manually
installed certificates and profiles, run ./tool/check_ios_testflight_signing.sh
first.
Use this path when you prefer to archive from Xcode:
- Run
./tool/bump_build_number.sh --platform ios. - Open
ios/Runner.xcworkspacein Xcode. - Select the
Runnerscheme. - Select
Any iOS DeviceorAny iOS Device (arm64). - Confirm Signing & Capabilities uses team
PB8H83VL3Z, bundle IDcom.alkinum.serlink, iCloud, CloudKit, andiCloud.com.alkinum.serlink. - Choose Product > Archive.
- In Organizer, select the new archive.
- Choose Distribute App > App Store Connect > Upload.
- Use automatic signing unless you intentionally prepared manual signing assets.
- Confirm the export uses CloudKit Production and upload the archive.
Wait for App Store Connect processing to finish before assigning the build. Then:
- Complete the export compliance and encryption questionnaire according to the current crypto review for this build.
- For internal TestFlight, add the processed build to an internal testing group.
- For external TestFlight or public beta, add the build to an external group and submit it for Beta App Review if App Store Connect requires it.
- For App Store review, create or open the iOS app version, attach the build, complete screenshots, description, privacy, pricing, availability, and review metadata, then submit the version for review.
The build will not appear in external or public beta groups until processing is complete and the build has been assigned to that testing group.
After the build is available in TestFlight:
- Install it on a physical iPhone signed in to an iCloud account.
- Create or unlock a vault.
- Add a host and identity.
- Enable CloudKit sync and confirm encrypted records appear in the Production CloudKit environment.
- Install the same build on a second Apple device with the same iCloud account and confirm the same data can be read.
- Edit and delete a record, then verify sync and tombstone behavior.