





















@@ -4,8 +4,8 @@ This iOS app is super-alpha and internal-use only. The first public App Store re
4455## Distribution Status
667-- Public distribution: not available.
8-- Internal beta distribution: local archive + TestFlight upload via Fastlane.
7+- Public distribution: App Store Connect app created; production signing is configured through the App Store release Fastlane path.
8+- Internal TestFlight distribution: uses the same App Store distribution archive uploaded to App Store Connect.
99- Local/manual deploy from source via Xcode remains the default development path.
10101111## Super-Alpha Disclaimer
@@ -47,60 +47,69 @@ Shortcut command (same flow + open project):
4747pnpm ios:open
4848```
494950-## Local Beta Release Flow
50+## App Store Release Flow
51515252Prereqs:
53535454- Xcode 16+
5555- `pnpm`
5656- `xcodegen`
5757- `fastlane`
58-- Apple account signed into Xcode for automatic signing/provisioning
59-- App Store Connect API key set up in Keychain via `scripts/ios-asc-keychain-setup.sh` when auto-resolving a beta build number or uploading to TestFlight
58+- Apple account signed into Xcode for the canonical OpenClaw team (`FWJYW4S8P8`)
59+- Xcode account permissions to create Apple Distribution certificates, App IDs, and App Store provisioning profiles
60+- App Store Connect app already created for `ai.openclawfoundation.app`
61+- App Store Connect API key set up in Keychain via `scripts/ios-asc-keychain-setup.sh` when auto-resolving a build number or uploading to App Store Connect
60626163Release behavior:
62646365- Local development uses the canonical `ai.openclawfoundation.app*` bundle IDs when the OpenClaw team is available, and unique `ai.openclawfoundation.app.test.*` bundle IDs only for non-canonical fallback teams.
64-- Beta release uses canonical `ai.openclawfoundation.app*` bundle IDs through a temporary generated xcconfig in `apps/ios/build/BetaRelease.xcconfig`.
65-- Beta release also switches the app to `OpenClawPushTransport=relay`, `OpenClawPushDistribution=official`, and `OpenClawPushAPNsEnvironment=production`.
66+- App Store release uses canonical `ai.openclawfoundation.app*` bundle IDs through a temporary generated xcconfig in `apps/ios/build/AppStoreRelease.xcconfig`.
67+- App Store release uses automatic signing with `Apple Distribution` and `-allowProvisioningUpdates`, so Xcode can create missing distribution certificates/profiles for the canonical team when the signed-in account has permission.
68+- App Store release also switches the app to `OpenClawPushTransport=relay`, `OpenClawPushDistribution=official`, `OpenClawPushAPNsEnvironment=production`, and a production `aps-environment` entitlement.
6669- App Store screenshots use `pnpm ios:screenshots`, which drives Fastlane Snapshot through a deterministic connected screenshot fixture instead of a live gateway.
67-- The beta flow does not modify `apps/ios/.local-signing.xcconfig` or `apps/ios/LocalSigning.xcconfig`.
70+- The release flow does not modify `apps/ios/.local-signing.xcconfig` or `apps/ios/LocalSigning.xcconfig`.
6871- `apps/ios/version.json` is the pinned iOS release version source.
6972- `apps/ios/CHANGELOG.md` is the iOS-only changelog and release-note source.
7073- The pinned iOS version must use CalVer like `2026.4.10`.
7174- That pinned value becomes:
7275- `CFBundleShortVersionString = 2026.4.10`
73-- `CFBundleVersion = next TestFlight build number for 2026.4.10`
76+- `CFBundleVersion = next App Store Connect build number for 2026.4.10`
7477- Changing the root gateway version does not change the iOS app version until you explicitly pin from the gateway.
7578- See `apps/ios/VERSIONING.md` for the full workflow.
767977-Relay behavior for beta builds:
80+Relay behavior for App Store builds:
78817982- Beta builds default to `https://ios-push-relay.openclaw.ai`.
8083- Optional custom relay override: `OPENCLAW_PUSH_RELAY_BASE_URL=https://relay.example.com`
8184 This must be a plain `https://host[:port][/path]` base URL without whitespace, query params, fragments, or xcconfig metacharacters.
828586+Prepare the generated release xcconfig/project without archiving:
87+88+```bash
89+pnpm ios:release:prepare -- --build-number 7
90+```
91+8392Archive without upload:
84938594```bash
86-pnpm ios:beta:archive
95+pnpm ios:release:archive
8796```
889789-Archive and upload to TestFlight:
98+Archive and upload to App Store Connect:
909991100```bash
92-pnpm ios:beta
101+pnpm ios:release
93102```
9410395104If you need to force a specific build number:
9610597106```bash
98-pnpm ios:beta -- --build-number 7
107+pnpm ios:release -- --build-number 7
99108```
100109101110### Maintainer Quick Release Checklist
102111103-Use this when a clone is missing local iOS release setup and you want the shortest path to a TestFlight upload.
112+Use this when a clone is missing local iOS release setup and you want the shortest path to an App Store Connect upload.
1041131051141. Confirm Fastlane auth is set up:
106115@@ -120,38 +129,45 @@ scripts/ios-asc-keychain-setup.sh \
120129121130This should create `apps/ios/fastlane/.env` with the non-secret ASC variables while the private key stays in Keychain.
122131123-3. Optional: set a custom official/TestFlight relay URL for the build. If unset, the beta flow uses `https://ios-push-relay.openclaw.ai`.
132+3. Confirm the App Store Connect app and Apple Developer identifiers/capabilities exist for:
133+- `ai.openclawfoundation.app`
134+- `ai.openclawfoundation.app.share`
135+- `ai.openclawfoundation.app.activitywidget`
136+- `ai.openclawfoundation.app.watchkitapp`
137+- `ai.openclawfoundation.app.watchkitapp.extension`
138+139+4. Optional: set a custom official relay URL for the build. If unset, the release flow uses `https://ios-push-relay.openclaw.ai`.
124140125141```bash
126142export OPENCLAW_PUSH_RELAY_BASE_URL=https://relay.example.com
127143```
128144129-4. If you are starting a brand-new production release train, pin iOS to the current gateway version first:
145+5. If you are starting a brand-new production release train, pin iOS to the current gateway version first:
130146131147```bash
132148pnpm ios:version:pin -- --from-gateway
133149```
134150135-5. Upload the beta:
151+6. Upload the build:
136152137153```bash
138-pnpm ios:beta
154+pnpm ios:release
139155```
140156141-6. Expected behavior:
157+7. Expected behavior:
142158- Fastlane reads `apps/ios/version.json`
143159- verifies synced iOS versioning artifacts
144-- resolves the next TestFlight build number for that short version
145-- generates `apps/ios/build/BetaRelease.xcconfig`
160+- resolves the next App Store Connect build number for that short version
161+- generates `apps/ios/build/AppStoreRelease.xcconfig`
146162- archives `OpenClaw`
147-- uploads the IPA to TestFlight
163+- uploads the IPA to App Store Connect for TestFlight/App Review use
148164149-7. Expected outputs after a successful run:
150-- `apps/ios/build/beta/OpenClaw-<version>.ipa`
151-- `apps/ios/build/beta/OpenClaw-<version>.app.dSYM.zip`
152-- Fastlane log line like `Uploaded iOS beta: version=<version> short=<short> build=<build>`
165+8. Expected outputs after a successful run:
166+- `apps/ios/build/app-store/OpenClaw-<version>.ipa`
167+- `apps/ios/build/app-store/OpenClaw-<version>.app.dSYM.zip`
168+- Fastlane log line like `Uploaded iOS App Store build: version=<version> short=<short> build=<build>`
153169154-8. If this is a fresh clone on a maintainer machine that already works elsewhere, it is OK to copy the non-secret `apps/ios/fastlane/.env` from another trusted local clone on the same Mac. The Keychain-backed private key remains machine-local and is not stored in the repo.
170+9. If this is a fresh clone on a maintainer machine that already works elsewhere, it is OK to copy the non-secret `apps/ios/fastlane/.env` from another trusted local clone on the same Mac. The Keychain-backed private key remains machine-local and is not stored in the repo.
155171156172## iOS Versioning Workflow
157173@@ -177,7 +193,7 @@ Recommended flow:
1771931. Keep `apps/ios/version.json` pinned to the current train version.
1781942. Update `apps/ios/CHANGELOG.md`, usually under `## Unreleased` while iterating.
1791953. Run `pnpm ios:version:sync` after changelog changes.
180-4. Upload more TestFlight builds with `pnpm ios:beta`.
196+4. Upload more TestFlight builds with `pnpm ios:release`.
1811975. Let Fastlane bump only the numeric build number.
182198183199### Starting the next production release train
@@ -190,17 +206,17 @@ pnpm ios:version:pin -- --from-gateway
1902061912072. Update `apps/ios/CHANGELOG.md` for the new release as needed.
1922083. Run `pnpm ios:version:sync`.
193-4. Submit the first TestFlight build for that newly pinned version.
209+4. Submit the first App Store Connect build for that newly pinned version.
1942105. Keep iterating on that same version until the release candidate is ready.
195211196212See `apps/ios/VERSIONING.md` for the detailed spec.
197213198214## APNs Expectations For Local/Manual Builds
199215200216- The app calls `registerForRemoteNotifications()` at launch.
201-- `apps/ios/Sources/OpenClaw.entitlements` sets `aps-environment` to `development`.
217+- `apps/ios/Sources/OpenClaw.entitlements` derives `aps-environment` from the active build configuration/signing override.
202218- APNs token registration to gateway happens only after gateway connection (`push.apns.register`).
203-- Local/manual builds default to `OpenClawPushTransport=direct` and `OpenClawPushDistribution=local`.
219+- Local/manual builds default to `OpenClawPushTransport=direct`, `OpenClawPushDistribution=local`, and a development `aps-environment` entitlement.
204220- Your selected team/profile must support Push Notifications for the app bundle ID you are signing.
205221- If push capability or provisioning is wrong, APNs registration fails at runtime (check Xcode logs for `APNs registration failed`).
206222- The gateway host also needs direct APNs auth configured separately with `OPENCLAW_APNS_TEAM_ID`, `OPENCLAW_APNS_KEY_ID`, and either `OPENCLAW_APNS_PRIVATE_KEY_P8` or `OPENCLAW_APNS_PRIVATE_KEY_PATH`.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。