crosscue

iOS Release QA Checklist

Status: Living. Android counterpart: android-release-checklist.md.

Run this once per public-facing iOS release (TestFlight external, App Store) on both an iPhone and an iPad. Takes ~15 minutes per device once the build is installed.

Prerequisites

Known issues to skip (these are already filed; don’t re-report)


Automated coverage (run this first)

Much of sections 1, 3, 4, 5, 6, 7 is now covered by the Flutter integration_test suite. Run it on a simulator before the manual pass:

scripts/run-ios-integration-tests.sh             # auto-picks/boots a simulator
scripts/run-ios-integration-tests.sh "iPhone 16" # or a name / UDID

It boots a simulator, runs every crosscue/integration_test/*_test.dart, and drops a final-frame screenshot per test into design/qa/ios-<git-sha>/. The same suite runs on demand in CI via the Integration tests (iOS) workflow (workflow_dispatch only — it’s costly, so it’s not part of the per-PR gate).

What the suite exercises today:

Still requires a human on a real device (OS-level, not automatable here): §2 import via the share sheet, §8 Dynamic Type, §9 iPad multitasking / rotation, §10 edge cases (Airplane Mode, calls), and true force-quit. A green suite means the manual pass below can focus on these.


1. Install & first launch

2. Import a puzzle

3. Solving — basic input

4. Solving — rebus

5. Persistence

6. Stats

7. Settings & privacy

8. Visual & accessibility

9. iPad-specific

Skip if testing on iPhone only.

10. Edge cases

11. Home-screen widget background refresh (#175)

Best-effort, not guaranteed. The home-screen widget’s “today” tile is kept current by a BGAppRefreshTask (and Android WorkManager). iOS decides when — or whether — it runs, based on how often the user opens the app; for low-engagement users it may fire rarely or not at all. This only affects the widget glance for someone who hasn’t opened the app in a day or two — the in-app on-open experience is always fresh (Crosshare auto-download + refresh). Don’t treat a stale tile after a long gap as a bug.

To force the iOS task during development (instead of waiting for the OS), pause in the debugger right after launch and run: e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"dev.tomhess.crosscue.refresh"]


Reporting bugs found during QA

For each bug:

  1. Take a screenshot or screen recording on the device
  2. Open a new GitHub issue at https://github.com/AtomicTrxn/crosscue/issues/new
  3. Include: device + iOS version, reproduction steps, expected vs. actual, the screenshot or recording

Block submitting for review if any item in sections 1-7 fails. Items in 8-10 are nice-to-have for v1.0 — file as enhancement issues rather than blockers.

After QA passes

  1. Mark this release’s QA pass complete in the release issue
  2. App Store Connect → submit the prepared build for review
  3. Monitor App Store Connect for review status; typical turnaround is 1-3 days