OPS: Catalyst#8309
Conversation
…ht labels present
There was a problem hiding this comment.
Pull request overview
This PR adds Mac Catalyst build support to BlueWallet, enabling the iOS app to be built and distributed as a native macOS application. The implementation includes a new GitHub Actions workflow for building Mac Catalyst binaries, fastlane lanes for build automation and TestFlight distribution, and Xcode project configuration changes to support automatic code signing.
Changes:
- Added GitHub Actions workflow for building Mac Catalyst apps triggered by PR labels (
mac-dmg,testflight) - Implemented fastlane lanes for building Mac Catalyst apps, creating DMGs with multilingual README files, and uploading to TestFlight
- Modified Xcode project to use automatic code signing instead of manual, removing SDK-specific provisioning profile configurations
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 13 comments.
| File | Description |
|---|---|
| .github/workflows/build-mac-catalyst.yml | New workflow for building Mac Catalyst apps, triggered by labels on PRs or manual dispatch, with conditional TestFlight upload |
| fastlane/Fastfile | Added build_catalyst_app_lane and upload_catalyst_to_testflight lanes, updated authentication skip logic to include new lanes |
| ios/BlueWallet.xcodeproj/project.pbxproj | Simplified code signing from Manual to Automatic, removed SDK-specific provisioning profiles, added empty input/output paths to CocoaPods phases |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| sh("codesign --verify --deep --strict '#{catalyst_app_path}'") | ||
| UI.success("App signed and verified") | ||
| else | ||
| # Ad-hoc sign so macOS doesn't treat the app as "damaged" | ||
| UI.message("Ad-hoc signing app to avoid Gatekeeper quarantine issues...") | ||
| sh("codesign --deep --force --sign - '#{catalyst_app_path}'") |
There was a problem hiding this comment.
The catalyst_app_path variable is used in shell commands without proper escaping. While it's already wrapped in single quotes, it would be safer to use proper escaping or avoid shell interpolation entirely.
| FileUtils.mkdir_p(dmg_staging) | ||
| FileUtils.cp_r(catalyst_app_path, dmg_staging) | ||
|
|
||
| sh("ln -s /Applications '#{dmg_staging}/Applications'") |
There was a problem hiding this comment.
The sh command uses an unescaped dmg_staging path which could cause issues if the path contains special characters. The path is already wrapped in single quotes, but for better safety, consider using proper escaping.
| UI.message("Added multilingual README with first-launch instructions to DMG") | ||
|
|
||
| FileUtils.rm_f(dmg_path) | ||
| sh("hdiutil create -volname 'BlueWallet' -srcfolder '#{dmg_staging}' -ov -format UDZO '#{dmg_path}'") |
There was a problem hiding this comment.
The sh command uses unescaped variables dmg_staging and dmg_path which could cause issues if the paths contain special characters. While they are wrapped in single quotes, for better safety consider using proper escaping.
There was a problem hiding this comment.
@copilot open a new pull request to apply changes based on this feedback
| - name: Upload to TestFlight | ||
| if: success() && steps.labels.outputs.upload_testflight == 'true' | ||
| run: bundle exec fastlane ios upload_catalyst_to_testflight | ||
| env: | ||
| APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }} | ||
| APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }} | ||
| APPLE_API_KEY_PATH: ${{ secrets.APPLE_API_KEY_PATH }} | ||
| APPLE_API_KEY_CONTENT: ${{ secrets.APPLE_API_KEY_CONTENT }} | ||
| CATALYST_TEAM_ID: ${{ secrets.CATALYST_TEAM_ID }} | ||
| TEAM_ID: ${{ secrets.TEAM_ID }} | ||
| BRANCH_NAME: ${{ github.head_ref || github.ref_name }} | ||
| LATEST_COMMIT_MESSAGE: ${{ github.event.pull_request.title || 'Manual build' }} | ||
|
|
There was a problem hiding this comment.
The step creates the appstore_api_key.json file, but the environment variables APPLE_API_KEY_ID, APPLE_API_ISSUER_ID, and APPLE_API_KEY_CONTENT are not being set. The upload_catalyst_to_testflight lane expects to find the API key file at ./appstore_api_key.json (as seen in line 722 of the Fastfile), but this step only sets APPLE_API_KEY_PATH which is not used.
Add a step before this to create the API key JSON file from the secret, similar to how it's done in .github/workflows/build-ios-release-pullrequest.yml:495.
There was a problem hiding this comment.
@copilot open a new pull request to apply changes based on this feedback
Co-authored-by: Copilot <[email protected]>
|
@copilot open a new pull request to apply changes based on the comments in this thread |
|
@marcosrdz I've opened a new pull request, #8322, to work on those changes. Once the pull request is ready, I'll request review from you. |
|
@marcosrdz I've opened a new pull request, #8323, to work on those changes. Once the pull request is ready, I'll request review from you. |
|
@marcosrdz I've opened a new pull request, #8324, to work on those changes. Once the pull request is ready, I'll request review from you. |
Co-authored-by: marcosrdz <[email protected]>
…astfile Co-authored-by: marcosrdz <[email protected]>
…escription Co-authored-by: marcosrdz <[email protected]>
Mac Catalyst BuildThe Mac Catalyst DMG is ready for download: Download BlueWallet-Mac-Catalyst.dmg
Built from |
|
Wake the fuck up samurai, we have PRs to merge [all PRs for @Overtorment] https://github.com/BlueWallet/BlueWallet/pulls/review-requested/Overtorment |
|
@cursor review pls |
|
Unbelievable. You, [subject name here], must be the pride of [subject hometown here]! |

Builds app for macOS, creates a DMG file with instructions on how to open the app due to it not being notarized in the process.
A future PR will notarize the build.