For pure playback domain/use-case tests, run:
swift test --package-path PlaytrCoreUse simulator/Xcode tests only for iOS integration coverage.
- Tap
Playin album view and confirm the full-screen Now Playing sheet appears. - Verify
Play/Pausetoggles playback from the sheet. - Verify
NextandPreviousswitch tracks. - Confirm progress/time updates while playback is active.
- Dismiss with
Xand confirm playback continues.
Use this loop for quick iteration on one test or one test class. It avoids rebuilding on every run and skips UI tests by default.
xcrun simctl shutdown all
xcrun simctl boot "iPhone 16"
xcrun simctl bootstatus "iPhone 16" -bxcodebuild \
-project Playtr/Playtr.xcodeproj \
-scheme Playtr \
-destination 'platform=iOS Simulator,name=iPhone 16,OS=18.5' \
-derivedDataPath /tmp/PlaytrDD-Fast \
build-for-testingxcodebuild \
-project Playtr/Playtr.xcodeproj \
-scheme Playtr \
-destination 'platform=iOS Simulator,name=iPhone 16,OS=18.5' \
-derivedDataPath /tmp/PlaytrDD-Fast \
test-without-building \
-only-testing:PlaytrTests/PlaytrTests/testAlbumPlaybackStateReducerTransitionsxcodebuild \
-project Playtr/Playtr.xcodeproj \
-scheme Playtr \
-destination 'platform=iOS Simulator,name=iPhone 16,OS=18.5' \
-derivedDataPath /tmp/PlaytrDD-Fast \
test-without-building \
-only-testing:PlaytrTests/PlaytrTestsxcodebuild \
-project Playtr/Playtr.xcodeproj \
-scheme Playtr \
-destination 'platform=iOS Simulator,name=iPhone 16,OS=18.5' \
-derivedDataPath /tmp/PlaytrDD-Fast \
testFor local iteration, disable expensive diagnostics in the active scheme's Test action:
- Address Sanitizer
- Thread Sanitizer
- Undefined Behavior Sanitizer
- Main Thread Checker (if not needed for your current change)
Re-enable them before broader QA or release validation.
This repo includes a minimal CI pipeline that builds Playtr and uploads to TestFlight from GitHub-hosted macOS runners. It does not depend on local Xcode provisioning access.
- Workflow:
.github/workflows/testflight.yml - Fastlane lane:
fastlane/Fastfile(beta) - Signing config:
fastlane/Matchfile - Ruby deps:
Gemfile
Add these in GitHub: Settings > Secrets and variables > Actions > New repository secret
ASC_ISSUER_ID: App Store Connect API key issuer IDASC_KEY_ID: App Store Connect API key IDASC_PRIVATE_KEY: full contents of the.p8key fileMATCH_PASSWORD: encryption password for thematchsigning repoMATCH_GIT_URL: private Git URL formatchcert/profile storage (for example, a private GitHub repo URL)MATCH_GIT_BASIC_AUTHORIZATION: base64 ofusername:tokenfor access to the private match repo
Create MATCH_GIT_BASIC_AUTHORIZATION with:
echo -n 'USERNAME:TOKEN' | base64Match defaults to branch main. If you need a different branch, set MATCH_GIT_BRANCH in the workflow environment.
- In App Store Connect, open Users and Access > Integrations > App Store Connect API.
- Create a key with access that allows TestFlight uploads and cert/profile management.
- Save:
Issuer IDKey ID- downloaded
.p8private key content (store asASC_PRIVATE_KEYsecret).
This pipeline uses fastlane match with a private Git repo as the source of truth for certificates and provisioning profiles.
One-time bootstrap:
- Create a private repo for match storage.
- Add all required secrets above.
- Run the workflow manually (
Actions > TestFlight Upload > Run workflow) with:
match_readonly = falseThis allows CI to create/import signing assets into the match repo if missing.
- After bootstrap succeeds, run with
match_readonly = true(default) for normal operation.
- Open GitHub Actions tab.
- Select TestFlight Upload.
- Click Run workflow.
- Optionally set
changelog.
The workflow also triggers on push to main.
- Confirm workflow run is green in GitHub Actions.
- In App Store Connect, open Apps > Playtr > TestFlight.
- Confirm a new build appears (processing may take a few minutes).