Skip to content

feat(ios): add mobile shell and TestFlight workflow#22

Open
ScottShao wants to merge 3 commits into
BAWES-Universe:universefrom
ScottShao:feat/mobile-ios
Open

feat(ios): add mobile shell and TestFlight workflow#22
ScottShao wants to merge 3 commits into
BAWES-Universe:universefrom
ScottShao:feat/mobile-ios

Conversation

@ScottShao

Copy link
Copy Markdown

Closes #5
Related to #1
/claim #1

Summary

  • add the Capacitor iOS platform under mobile/ios/ with bundle id net.bawes.universe and iOS 15 deployment target
  • configure Info.plist for bawes://callback, camera + microphone permission strings, fullscreen mode, and landscape-only orientations
  • expand the iOS app icon catalog to include iPhone, iPad, and 1024px marketing icon sizes using the repo's existing Universe branding asset
  • add iOS Fastlane lanes in mobile/fastlane/ for certificate sync, signed build, TestFlight upload, and test execution
  • add .github/workflows/ios-build.yml to run iOS tests on PRs and drive TestFlight upload on non-PR runs when the required Apple secrets are configured
  • keep the diff inside the issue-owned paths: mobile/ios/, mobile/fastlane/, and .github/workflows/ios-build.yml

Acceptance criteria

  • Add iOS Capacitor platform under mobile/ios/
  • Set bundle identifier to net.bawes.universe
  • Keep deployment target at iOS 15.0
  • Add Universe app icons for the requested iPhone / iPad / marketing sizes
  • Add bawes:// custom URL scheme handling
  • Add camera + microphone permission strings
  • Add fullscreen + landscape-only configuration
  • Add Fastlane iOS certs, build, test, and beta lanes
  • Add .github/workflows/ios-build.yml
  • Upload a build to TestFlight
  • Verify auth deep-link login on a physical iPhone
  • Verify gameplay/touch controls on a physical iPhone

Verification

  • cd mobile && npm install --no-save --registry=https://registry.npmjs.org @capacitor/core@8.3.4 @capacitor/cli@8.3.4 @capacitor/ios@8.3.4 @capacitor/push-notifications@8.1.1 @capacitor/splash-screen@8.0.1 typescript@6.0.3
  • cd mobile && npx cap sync ios
  • cd mobile && plutil -lint ios/App/App/Info.plist
  • cd mobile/ios/App && xcodebuild -list -project App.xcodeproj -json
  • cd /tmp/bawes-universe-ios && ruby -c mobile/fastlane/Fastfile && ruby -c mobile/fastlane/Appfile
  • cd /tmp/bawes-universe-ios && sips -g pixelWidth -g pixelHeight mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-1024@1x.png
  • git diff --check

Environment limitations

  • bundle exec fastlane ios test / bundle exec fastlane ios beta were not executable locally because this host Ruby/Xcode toolchain cannot build Fastlane's native gems from the repo Gemfile
  • TestFlight upload requires APPLE_ID, APPLE_TEAM_ID, MATCH_PASSWORD, MATCH_GIT_BASIC_AUTHORIZATION, ASC_KEY_ID, ASC_ISSUER_ID, and ASC_KEY_CONTENT
  • device deep-link, gameplay, camera, and microphone checks require a physical iPhone and Apple signing credentials

Demo

Repo-hosted verification walkthrough GIF:

iOS verification walkthrough

@coderabbitai

coderabbitai Bot commented May 15, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@ScottShao has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 21 minutes and 5 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 23aba96d-345b-4c64-b502-f2ef7e8aba12

📥 Commits

Reviewing files that changed from the base of the PR and between e3106e7 and 4ed4d07.

⛔ Files ignored due to path filters (22)
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-1024@1x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20@1x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x-ipad.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29@1x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x-ipad.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40@1x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x-ipad.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76@1x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png is excluded by !**/*.png
  • mobile/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png is excluded by !**/*.png
  • mobile/ios/demo/verification-demo.gif is excluded by !**/*.gif
📒 Files selected for processing (22)
  • .github/workflows/ios-build.yml
  • mobile/fastlane/Appfile
  • mobile/fastlane/Fastfile
  • mobile/ios/.gitignore
  • mobile/ios/App/App.xcodeproj/project.pbxproj
  • mobile/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  • mobile/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
  • mobile/ios/App/App/AppDelegate.swift
  • mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json
  • mobile/ios/App/App/Assets.xcassets/Contents.json
  • mobile/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json
  • mobile/ios/App/App/Base.lproj/LaunchScreen.storyboard
  • mobile/ios/App/App/Base.lproj/Main.storyboard
  • mobile/ios/App/App/Info.plist
  • mobile/ios/App/CapApp-SPM/.gitignore
  • mobile/ios/App/CapApp-SPM/Package.swift
  • mobile/ios/App/CapApp-SPM/README.md
  • mobile/ios/App/CapApp-SPM/Sources/CapApp-SPM/CapApp-SPM.swift
  • mobile/ios/capacitor-cordova-ios-plugins/CordovaPluginsResources.podspec
  • mobile/ios/capacitor-cordova-ios-plugins/resources/.gitkeep
  • mobile/ios/capacitor-cordova-ios-plugins/sources/.gitkeep
  • mobile/ios/debug.xcconfig
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ScottShao

Copy link
Copy Markdown
Author

Pushed follow-up commit 3c4ec4d to harden the iOS workflow around the actual issue contract.

Change:

  • the beta job now skips the TestFlight upload path when the required Apple/TestFlight secrets are not configured, instead of failing the whole non-PR run

Why:

  • issue iOS app: build, signing, and TestFlight via Fastlane #5 explicitly scopes the workflow to drive TestFlight upload when the required Apple secrets are configured
  • this keeps ordinary non-PR runs green for maintainers who have not added those secrets yet, while preserving the same fastlane ios beta path when secrets are present

Re-verified locally:

  • YAML parse of .github/workflows/ios-build.yml
  • git diff --check

@ScottShao

Copy link
Copy Markdown
Author

Pushed follow-up commit 4ed4d07 to improve iOS media/runtime metadata before device validation.

Change:

  • added NSPhotoLibraryUsageDescription for image sharing flows
  • added UIBackgroundModes = [audio] so audio-capable sessions are not missing the standard background-mode metadata

Why:

  • this keeps the iOS shell closer to the real mobile usage expected by the broader app goal while staying inside the issue-owned iOS path

Re-verified locally:

  • plutil -lint mobile/ios/App/App/Info.plist
  • git diff --check

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

iOS app: build, signing, and TestFlight via Fastlane

1 participant