# Apple client (macOS + iOS) — placeholder Built in **M4** (see [`docs/roadmap.md`](../../docs/roadmap.md)). Swift + SwiftUI, consuming `libvoicecat` through the C ABI ([`core/include/voicecat.h`](../../core/include/voicecat.h)). Planned shape (see [`docs/architecture.md`](../../docs/architecture.md) §4 and [`docs/tech-stack.md`](../../docs/tech-stack.md) §2): - A Swift Package wrapping the core as an **XCFramework** (macOS + iOS device + simulator). - A module map exposing `voicecat.h` to Swift (Swift can also use C++ interop directly, but the C ABI is the stable contract). - SwiftUI app target for macOS and iOS. - **iOS audio:** app owns `AVAudioSession` (`.playAndRecord` / `.voiceChat`), mic permission, interruption/route handling, calling `vc_audio_*` hooks on the core. - **iOS screen/system audio (`SCREEN_AUDIO`):** a **ReplayKit Broadcast Upload Extension** capturing `RPSampleBufferType.audioApp`, linking a minimal core slice, sharing session state via an **App Group** ([`docs/voice.md`](../../docs/voice.md) §9). Nothing here yet — the core must reach M2 (working voice) before the GUI is worth building. ## Building the core for Apple platforms The CMake presets `apple-dev`, `apple-ios`, and `apple-ios-sim` produce static `libvoicecat.a` slices for the Swift Package / XCFramework. **`apple-dev` (macOS slice) is validated** — builds green on macOS 26.5 / Apple Silicon (Apple clang 21, vcpkg `arm64-osx` triplet) and produces a valid 1.9 MB arm64 static library with 167 exported C ABI symbols (correct visibility). The XCFramework creation path is also verified — `xcodebuild -create-xcframework` produces a valid `VoiceCatCore.xcframework` with the `.a` + `voicecat.h` headers, ready for a Swift Package binary target. **`apple-ios` and `apple-ios-sim` (iOS slices) are scaffolding** — not yet CI-validated. The vcpkg `arm64-ios` / `arm64-ios-sim` triplets for all 8 deps need verification. Prerequisites: `VCPKG_ROOT` set, Xcode + iOS SDK installed, and Homebrew `autoconf-archive` (needed by vcpkg's libsodium port — `brew install autoconf-archive`). ```bash # Prerequisites: VCPKG_ROOT set, Xcode + iOS SDK installed export VCPKG_ROOT=/path/to/vcpkg # macOS slice (arm64-osx on Apple Silicon, x64-osx on Intel) cmake --preset apple-dev && cmake --build --preset apple-dev # → build/apple-dev/lib/libvoicecat.a # iOS device slice cmake --preset apple-ios && cmake --build --preset apple-ios # → build/apple-ios/lib/libvoicecat.a # iOS simulator slice cmake --preset apple-ios-sim && cmake --build --preset apple-ios-sim # → build/apple-ios-sim/lib/libvoicecat.a ``` The three `.a` files are then stitched into an XCFramework: ```bash xcodebuild -create-xcframework \ -library build/apple-dev/lib/libvoicecat.a -headers core/include \ -library build/apple-ios/lib/libvoicecat.a -headers core/include \ -library build/apple-ios-sim/lib/libvoicecat.a -headers core/include \ -output build/VoiceCatCore.xcframework ``` The XCFramework is then consumed by the Swift Package as a binary target. The macOS-only XCFramework (single `apple-dev` slice) is verified to build now; the full 3-slice XCFramework (macOS + iOS device + iOS simulator) waits for the iOS presets to be validated. Actual `AVAudioSession` integration, `Info.plist` mic permission, ReplayKit extension, and SwiftUI UI work are tracked as follow-up tasks.