From 932abb0a841b522ebaa5b81921119a61b6a80b21 Mon Sep 17 00:00:00 2001 From: joshavant <830519+joshavant@users.noreply.github.com> Date: Fri, 25 Sep 2026 02:39:53 -0500 Subject: [PATCH] docs(ios): adopt Apple-specific App Review notes Replace the review walkthrough with the supplied Apple review notes and update documentation, Fastlane, and PDF tooling to use the new Markdown filename. --- ...IEW-NOTES.md => APP-REVIEW-NOTES-APPLE.md} | 38 ++++++++++++++----- apps/ios/README.md | 2 +- apps/ios/fastlane/Fastfile | 2 +- apps/ios/fastlane/metadata/README.md | 2 +- package.json | 2 +- scripts/ios-app-review-notes-pdf.swift | 2 +- 6 files changed, 33 insertions(+), 15 deletions(-) rename apps/ios/{APP-REVIEW-NOTES.md => APP-REVIEW-NOTES-APPLE.md} (90%) diff --git a/apps/ios/APP-REVIEW-NOTES.md b/apps/ios/APP-REVIEW-NOTES-APPLE.md similarity index 90% rename from apps/ios/APP-REVIEW-NOTES.md rename to apps/ios/APP-REVIEW-NOTES-APPLE.md index 732a1e8414f5..56868b38e002 100644 --- a/apps/ios/APP-REVIEW-NOTES.md +++ b/apps/ios/APP-REVIEW-NOTES-APPLE.md @@ -70,11 +70,8 @@ Run the approval demo. Expected result: the iPhone shows `Exec approval required` for a harmless `printf` command that prints `OpenClaw App Review approval demo complete`. Tap `Allow Once`, then `Dismiss` if the completed approval remains open. -The chat then replies: - -```text -The approval demo completed. -``` +The chat then confirms that the command completed. The exact confirmation +wording may vary. ## Talk @@ -91,8 +88,8 @@ I'm testing OpenClaw on an iPhone connected to a test Gateway. Summarize that in ``` Expected result: the assistant speaks a one-sentence summary of the setup just -described, and its response appears in chat. Exact wording may vary. Tap the -waveform button again to stop. +described, and its response appears in chat. Exact wording may vary. Tap the stop +button at the same position to stop. ## Talk + Background Audio @@ -119,7 +116,7 @@ Name one animal. Expected result: the assistant names an animal aloud while OpenClaw remains in the background. Reopen OpenClaw and confirm that response appears in chat and -Talk is still active, then tap the waveform button to stop. +Talk is still active, then tap the stop button. ## Gateway Status @@ -139,7 +136,7 @@ Talk is still active, then tap the waveform button to stop. 2. Lock the iPhone while Talk is active. 3. Confirm an `OpenClaw` Live Activity appears on the Lock Screen. On iPhones with Dynamic Island, the activity can also appear there. -4. Reopen OpenClaw and tap the waveform button to stop. +4. Reopen OpenClaw and tap the stop button. Connection status can also appear as a Live Activity. To exercise that path, open `Settings` → `Gateway`, tap `Reconnect`, and immediately return to the @@ -164,7 +161,7 @@ Expected result: the iPhone Lock Screen receives a visible `OpenClaw` notification with this body: ```text -OpenClaw App Review push notification demo +OpenClaw App Review notification demo ``` Tap the notification and unlock the iPhone if prompted. If the chat is not @@ -227,6 +224,27 @@ offer an action to open iOS Settings. Enabling camera access, Health summaries, Always location, Voice Wake, or the hosted push relay can also present an OpenClaw consent dialog explaining that feature's access. +### Device capability demo + +Keep OpenClaw open. In `Home`, send: + +```text +Start device capability demo. +``` + +The demo reads device status, captures a front-camera photo, and creates clearly +named `OpenClaw App Review Contact`, `OpenClaw App Review Event`, and +`OpenClaw App Review Reminder` fixtures. If it requests permission recovery, use +`Settings` → `Permissions` to grant Camera, Contacts, Calendars (Full Access), +and Reminders, then return to `Home` and send: + +```text +Continue device capability demo. +``` + +Expected result: all ten required checks pass. Location can remain off and is +reported as an optional skip. Limited Contacts access worked in validation. + ### Optional Apple Health summary Apple Health Summaries is off by default. Under `Settings` → `This iPhone`, turn diff --git a/apps/ios/README.md b/apps/ios/README.md index e43026462fb6..fc6ad28c6a20 100644 --- a/apps/ios/README.md +++ b/apps/ios/README.md @@ -120,7 +120,7 @@ Release behavior: - App Store release uses manual `Apple Distribution` signing with profile names pinned in `apps/ios/Config/AppStoreSigning.json`. - Fastlane owns one-time Developer Portal setup, encrypted `match` signing sync to the repo/branch pinned in `apps/ios/Config/AppStoreSigning.json`, and release handling. - App Store release also switches the app to `OpenClawPushMode=appStore`, which derives relay transport, official distribution, the canonical production relay, production APNs, production relay profile, `appleStrict` proof, and the App-Attest-capable entitlement file. -- `pnpm ios:release:upload` generates App Store screenshots, archives and validates the IPA, uploads release notes and the rendered `apps/ios/APP-REVIEW-NOTES.md` attachment, uploads the IPA, and waits for Apple processing. +- `pnpm ios:release:upload` generates App Store screenshots, archives and validates the IPA, uploads release notes and the rendered `apps/ios/APP-REVIEW-NOTES-APPLE.md` attachment, uploads the IPA, and waits for Apple processing. - Agent-driven App Store uploads must use `pnpm ios:release:upload` as the only release path. If that command fails, stop and fix the failing screenshot, metadata, archive, validation, or upload step before trying again. - Do not treat `pnpm ios:release:archive`, `asc builds upload`, `asc release stage`, `asc publish appstore`, direct Fastlane lanes, or App Store Connect mutation commands as fallback upload paths after `pnpm ios:release:upload` fails. - The release archive is validated before upload by inspecting the exported IPA's signed entitlements, embedded App Store profile, and push mode. The upload fails if the IPA is not an App Store production relay build. diff --git a/apps/ios/fastlane/Fastfile b/apps/ios/fastlane/Fastfile index 169af99ad148..e865d0457cbc 100644 --- a/apps/ios/fastlane/Fastfile +++ b/apps/ios/fastlane/Fastfile @@ -867,7 +867,7 @@ def release_notes_metadata_path(release_version:, app_store_revision:) end def app_review_notes_markdown_path - File.join(ios_root, "APP-REVIEW-NOTES.md") + File.join(ios_root, "APP-REVIEW-NOTES-APPLE.md") end def app_review_notes_pdf_path diff --git a/apps/ios/fastlane/metadata/README.md b/apps/ios/fastlane/metadata/README.md index 15237fe14d71..958f82809d50 100644 --- a/apps/ios/fastlane/metadata/README.md +++ b/apps/ios/fastlane/metadata/README.md @@ -47,7 +47,7 @@ Or set `APP_STORE_CONNECT_API_KEY_PATH`. - Locale files live under `metadata//`, for example `metadata/en-US/` and `metadata/sv-SE/`. Each locale directory should use the public metadata filenames consumed by the `ios metadata` lane. - Release notes are generated from `apps/ios/CHANGELOG.md` into temporary Fastlane metadata during upload; use the `scripts/mobile-release-version.ts` prepare/plan/finalize flow to prepare the exact encoded section and the other four mobile release outputs. - Do not check in `release_notes.txt` under locale metadata directories; the lane strips copied release-note files and writes the current generated en-US release notes when requested. -- `apps/ios/APP-REVIEW-NOTES.md` is rendered to `apps/ios/build/app-review/APP-REVIEW-NOTES.pdf` and uploaded as the App Review attachment when metadata is uploaded. +- `apps/ios/APP-REVIEW-NOTES-APPLE.md` is rendered to `apps/ios/build/app-review/APP-REVIEW-NOTES.pdf` and uploaded as the App Review attachment when metadata is uploaded. - Production release notes require the exact encoded App Store heading, such as `## 2026.7.21`; they do not fall back to the gateway or `## Unreleased` section. - Generated App Store release notes begin with the associated gateway version. - The release upload flow uploads release notes, screenshots, and the App Review PDF attachment before the IPA, and never submits for App Review. diff --git a/package.json b/package.json index 29b58a30196d..8a1cc55733e2 100644 --- a/package.json +++ b/package.json @@ -1822,7 +1822,7 @@ "gen:browser-inspect-script:swift": "node --import ./scripts/tsx.mjs scripts/generate-browser-inspect-script-swift.mts --write", "gen:host-env-policy:swift": "node --import ./scripts/tsx.mjs scripts/generate-host-env-security-policy-swift.mts --write", "ghsa:patch": "node --import ./scripts/tsx.mjs scripts/ghsa-patch.mts", - "ios:app-review-notes:pdf": "xcrun swift scripts/ios-app-review-notes-pdf.swift apps/ios/APP-REVIEW-NOTES.md apps/ios/build/app-review/APP-REVIEW-NOTES.pdf", + "ios:app-review-notes:pdf": "xcrun swift scripts/ios-app-review-notes-pdf.swift apps/ios/APP-REVIEW-NOTES-APPLE.md apps/ios/build/app-review/APP-REVIEW-NOTES.pdf", "ios:build": "/bin/bash -c 'export PATH=\"$PATH:/opt/homebrew/bin:/usr/local/bin\"; ./scripts/ios-configure-signing.sh && ./scripts/ios-write-version-xcconfig.sh && node scripts/ios-write-swift-filelist.mjs && cd apps/ios && xcodegen generate && xcodebuild -project OpenClaw.xcodeproj -scheme OpenClaw -destination \"${IOS_DEST:-generic/platform=iOS Simulator}\" -configuration Debug build'", "ios:filelist:gen": "node scripts/ios-write-swift-filelist.mjs", "ios:gen": "/bin/bash -c 'export PATH=\"$PATH:/opt/homebrew/bin:/usr/local/bin\"; ./scripts/ios-configure-signing.sh && ./scripts/ios-write-version-xcconfig.sh && node scripts/ios-write-swift-filelist.mjs && cd apps/ios && xcodegen generate'", diff --git a/scripts/ios-app-review-notes-pdf.swift b/scripts/ios-app-review-notes-pdf.swift index 3d809cee8925..3db76954df54 100644 --- a/scripts/ios-app-review-notes-pdf.swift +++ b/scripts/ios-app-review-notes-pdf.swift @@ -238,7 +238,7 @@ func markdownToHTML(_ markdown: String) -> String { let arguments = CommandLine.arguments guard arguments.count == 3 else { - fail("Usage: scripts/ios-app-review-notes-pdf.swift ") + fail("Usage: scripts/ios-app-review-notes-pdf.swift ") } let sourceURL = absoluteFileURL(arguments[1])