Repository navigation
Conversation
Adds an RFCOMM backend for macOS so the CLI and GUI work there. A small Objective-C shim (compiled via the cc crate in build.rs) wraps IOBluetooth: listing connected paired devices, resolving SDP service UUIDs to RFCOMM channel ids, and opening/reading/writing channels. Notes on IOBluetooth behaviour that shaped the design: - On current macOS versions, IOBluetooth is backed by CoreBluetooth and delivers every RFCOMM delegate event on the main thread's run loop, regardless of which thread opened the channel. openRFCOMMChannelSync fails when called from a thread without a run loop, so the shim uses openRFCOMMChannelAsync and waits for rfcommChannelOpenComplete:status:. - The CLI therefore runs its tokio runtime on a secondary thread while the main thread spins a run loop (run_with_main_run_loop). The GUI already has one via winit. - IOBluetooth flattens single element SDP sequences, so ServiceClassIDList may be a bare UUID rather than an array. - The system sqlite on macOS is too old for the migrations, so rusqlite is built with the bundled feature like on Windows and Android. Tested with a Soundcore R50i (A3949): listing settings, reading battery and firmware info, and changing the equalizer preset.
Adds packaging/macos/build.sh and a `just build-gui-app` recipe that wrap the gui binary in build-output/OpenSCQ30.app, mirroring the Windows installer setup. The bundle gets an icns generated from the existing icon, an Info.plist with the workspace version and a Bluetooth usage description, and an ad-hoc code signature so Gatekeeper allows running it locally.
|
Also duplicates some functionality from #372. |
Author
SeanathanVT
added a commit
to SeanathanVT/OpenSCQ30
that referenced
this pull request
Sep 17, 2026
…igning The .app bundle had no LSMinimumSystemVersion/CFBundleSupportedPlatforms and was never signed, which Launch Services was misidentifying as an iOS app instead of a native macOS one. Adds both plist keys and an ad-hoc codesign step in build.sh after bundle assembly. Ad-hoc signing fixes the local build/Kind issue but isn't notarization: downloaded zips still need right-click -> Open, docs updated to reflect that. afrijaldz's competing macOS PR (Oppzippy#376) independently landed the same fix. Co-Authored-By: Afrijal Dzuhri <[email protected]> Co-Authored-By: Claude Sonnet 5 <[email protected]>
Owner
|
Closing in favor of #372 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds packaging for a macOS app bundle, mirroring the Windows installer setup:
packaging/macos/build.sh— wrapsbuild-output/openscq30-guiintobuild-output/OpenSCQ30.app: generates an.icnsfrom the existing icon withsips/iconutil, fills inInfo.plistwith the workspace version, and applies an ad-hoc code signature so Gatekeeper allows running a locally built app.packaging/macos/Info.plist— template (@VERSION@placeholder), includesNSBluetoothAlwaysUsageDescription.just build-gui-apprecipe ([macos]), analogous tobuild-gui-installeron Windows. The gui must be built first (just build-gui).docs/build-macos.md.Not included: signing with a Developer ID / notarization and a CI job to publish the bundle in releases. Both need secrets/decisions on your side, so I left them out; happy to add a CI job if you'd like one.
Testing
just build-gui && just build-gui-appon macOS 15 (Apple Silicon) produces a workingOpenSCQ30.appthat launches from Finder/Spotlight and connects to a Soundcore R50i.plutil -lintpasses on the generatedInfo.plist.