CI never compiles anything Apple, so the iOS and macOS targets can break unnoticed
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 65/100
Research direction
Start with .github/workflows/ci.yml and compare its existing Flutter and Rust jobs; then read ./scripts/frb-generate.sh and the proposed Apple build command. Add a macOS CI job gated on the specified paths, and decide how it should handle tracked-file changes from Flutter and CocoaPods. Done when the iOS simulator build runs successfully in CI without signing secrets or leaving an unintended dirty tree.
Written by the indexing model from the issue text.
Description
Problem
.github/workflows/ci.yml runs the Rust job on ubuntu-latest, the Flutter analyze/test job on ubuntu-latest, and a web build. No job ever compiles the iOS or macOS target, and there are no other workflows that do.
So nothing verifies that the Apple targets still build, and nothing catches a platform-specific regression. Two concrete examples found this week, both of which a compile-and-lint job could plausibly have surfaced, and neither of which anything would catch if reintroduced:
ios/Runner/Runner.entitlementsexisted but was referenced nowhere inproject.pbxproj, so Xcode never read it (#399). If that setting is dropped again, CI stays green.ios/Runner/Info.plistcarried noNSCameraUsageDescriptionwhilemobile_scanneris a dependency, so the app was terminated by the OS on first camera access (#398).
Unlike the web target — which is guarded both statically (test/web/pages_bundle_test.dart) and at runtime (test/web/smoke/smoke.mjs) — Apple has no equivalent, not even a compile check.
Evidence that this has already cost something
Until last week, ios/Runner.xcodeproj/project.pbxproj contained no CocoaPods integration at all: no Pods group, no [CP] Check Pods Manifest.lock phase, no baseConfigurationReference. pod install writes all of that on its first run, so no one had ever built the iOS target. Neither ios/Podfile.lock nor macos/Podfile existed either.
The target does build (see the baseline in #118) — it simply built for the first time in a long while, and nothing would have told anyone if it had stopped.
Proposed scope
A macos-latest job in ci.yml, gated on paths that can affect it (ios/**, macos/**, rust/**, pubspec.yaml):
- install the pinned Flutter (
FLUTTER_VERSION) and Rust toolchains, addaarch64-apple-ios-sim - run
./scripts/frb-generate.sh(lib/src/rust/is gitignored and produced on the fly, as the existing jobs already handle) flutter build ios --simulator --no-codesign— no signing identity needed, so no secrets are required
A simulator build exercises the whole chain that actually breaks: CocoaPods resolution, the cargokit script phase that cross-compiles the Rust core, and the link into rust.framework. Cold, it takes about 3 minutes on a GitHub macOS runner.
Two things worth deciding when implementing it:
-
flutter build iosrewrites tracked files. It bumpsios/Podfilefromplatform :ios, '12.0'to'13.0'(printed asUpgrading Podfile), andpod installinjects its integration intoproject.pbxproj,contents.xcworkspacedataand theios/Flutter/*.xcconfigfiles. A naive job leaves a dirty tree. Either commit the13.0bump deliberately — it is the value the Runner target already declares — or have the job tolerate the diff. -
Whether to also add a macOS desktop build.
macos/is present and itsproject.pbxprojalready setsCODE_SIGN_ENTITLEMENTS, butmacos/Podfiledoes not exist yet, so that target has likely never been built either. Possibly a separate issue.
This is deliberately scoped to a compile gate. Running tests on a simulator, or building for a device, both need signing material and are a larger conversation — the point here is simply that today the Apple targets are entirely unguarded.
- Dominant language
- Dart
- Stars
- 11
- Forks
- 9
- Avg merge
- 13h 4m
- Merged PRs (30d)
- 259
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from MostroP2P/app
-
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
Maintainers usually reply within 1 day
-
Add-invoice screen stays on "Sent, waiting for the node" after a late acceptance on a sell orderOpenbug priority: medium
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
Maintainers usually reply within 1 day
-
area: ui
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
MostroP2P/app#341 · 1 comment ·
Maintainers usually reply within 1 day
Similar issues
-
[BUG][All] VLESS URIs with flow=xtls-rprx-vision-udp443 are silently dropped on subscription importOpen
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
area::timeline needs::triage regression
Difficulty 2/5 1-3 hours Newbie friendliness 80/100
linagora/twake-on-matrix#3450 ·
Maintainers usually reply within 3 days
-
Difficulty 2/5 Under an hour Newbie friendliness 72/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
genkit-ai/genkit-dart#637 ·
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
bggRGjQaUbCoE/PiliPlus#3235 ·
Maintainers usually reply within 1 day