Skip to content

Fix iOS app build#23

Merged
colemancda merged 8 commits into
masterfrom
feature/androidswiftui
Jul 22, 2026
Merged

Fix iOS app build#23
colemancda merged 8 commits into
masterfrom
feature/androidswiftui

Conversation

@colemancda

Copy link
Copy Markdown
Member

Follow-up to #22: gets the iOS app building and running from a clean checkout with no
workarounds
— no SwiftPM mirrors, no environment variables, no extra xcodebuild flags, and no
edits needed before pressing Run in Xcode.

Verified end to end: a clean swift build, swift test (44 pass), xcodebuild build,
xcodebuild archive, and the app launched in the simulator — the device list populates from
MockCentral, and all 13 bundled plugins install into Documents/Plugins/ on first launch and
appear in the Plugins tab.

Five fixes

1. Two regressions I introduced when removing Skip in #22, neither caught by swift build:

  • Darwin/BluetoothExplorer.xcconfig still #included the deleted Skip.env, so PRODUCT_NAME
    was empty and archiving failed with "Multiple commands produce .app". App identity (name,
    bundle id, version) is now declared in the xcconfig directly.
  • The Xcode project still ran Skip's "Run skip gradle" build phase. It had been suppressed by
    SKIP_ACTION = none, which I removed along with the rest of the Skip config — so simulator
    builds started shelling out to gradle and failing on the missing Skip.env. The phase is gone.

Both only appear through Xcode, which is why swift build passing in #22 did not catch them.

2. AndroidBluetooth is temporarily not declared. SwiftPM validates the whole package graph
even for .android-conditional dependencies, so its AndroidManifest bug (PureSwift/Android#40
moved that product to swift-android-native) broke Apple builds — a clean checkout could not
build at all without a local mirror. The Swift sources already guard their use with
#if os(Android), so nothing else changed. Restore it alongside PureSwift/AndroidBluetooth#4.

3. WasmKit now comes from a fork (MillerTechnologyPeru/WasmKit, one commit) that drops
.treatAllWarnings(as: .error). Upstream's setting collides with the -suppress-warnings Xcode
passes to package dependencies:

error: Conflicting options '-warnings-as-errors' and '-suppress-warnings' (in target 'WasmTypes')

I confirmed the override only reaches package targets from the command line — setting it in the
xcconfig or at project level does nothing — so opening the project in Xcode and pressing Run
failed
, and only a patched WasmKit fixes that. Worth upstreaming; a package arguably should not
impose its warning policy on consumers.

4. CI is simplified accordingly. With the fork in place the SWIFT_SUPPRESS_WARNINGS=NO
workaround is gone, and the Android job is dropped since the app no longer declares
AndroidBluetooth. Two jobs remain: Test, and iOS Archive, which asserts the archive
contains BluetoothExplorer.app with bundled .wasm plugins and uploads it as an artifact.

Reviewer notes

  • Android is deliberately parked. Documentation/AndroidSwiftUIMigration.md records what is needed
    to bring it back: the two PureSwift dependency PRs, an upstream fix for AndroidBluetooth's
    @JavaImplementation macro generating invalid code for swiftOnScanFailed(error:), and a
    replacement for Skip's gradle project.
  • The WasmKit fork is pinned by revision, so it cannot drift. Drop it once upstream fixes the
    setting.

@colemancda
colemancda merged commit 6bcf086 into master Jul 22, 2026
2 checks passed
@colemancda colemancda changed the title Get the iOS app building and running without workarounds Fix iOS app build Jul 22, 2026
@colemancda
colemancda deleted the feature/androidswiftui branch July 22, 2026 20:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant