diff --git a/mobile/IOS_SETUP.md b/mobile/IOS_SETUP.md index 62eeea3..d7129ea 100644 --- a/mobile/IOS_SETUP.md +++ b/mobile/IOS_SETUP.md @@ -65,5 +65,27 @@ collect account info + usage for chat/calls). Then submit for review (or flip `s ### App Review note (Guideline 4.2 — "Minimum Functionality") Apple scrutinises apps that look like "just a website". Ours passes because it ships **real native capabilities** — push notifications, camera/microphone for calls, photo sharing. Make sure push (Step 5) -is live before the **public** submission, and in the reviewer notes mention the native video calling + -screen sharing so it's obvious this is more than a web view. TestFlight builds are fine without push. +is live before the **public** submission, and in the reviewer notes mention the **native video/voice +calling + push notifications**. Do **not** advertise "share your screen" as an iOS feature in the store +listing yet — see the follow-up below (you can still *view* a screen someone else shares). + +--- + +## Known iOS limitations & follow-ups (phase 2 — after TestFlight) + +### 1. Sharing YOUR iOS screen into a meeting → needs a ReplayKit Broadcast Upload Extension +- **Why:** the app's screen share uses the web `getDisplayMedia` API, which **iOS WebViews and Safari do + not support**. Apple only allows capturing the *device* screen via **ReplayKit**. +- **What works today on iOS:** *viewing* a screen another participant shares (it's just incoming video), + chat, voice/video calls, camera, photo sharing. +- **What's needed to broadcast the iOS screen:** a native **Broadcast Upload Extension** target that + captures frames via ReplayKit and feeds them into the LiveKit/WebRTC session, plus the **App Groups** + capability (to pass data between the app and the extension). This is native Swift work — NOT part of + the Capacitor wrapper — so it's tracked as a separate task, done after the app is on TestFlight. +- **Store impact:** don't claim iOS screen-sharing in the listing until this ships, or a reviewer may + test it and it will fail. + +### 2. Native mobile audio routing (speaker / earpiece / Bluetooth) — needs a Capacitor audio plugin +- Mobile **web** can't switch the audio output route (`setSinkId` is unimplemented on iOS/Android), so the + in-meeting speaker/earpiece/Bluetooth control is web-only where it works and hidden where it doesn't. +- True routing on iOS needs a small native plugin driving `AVAudioSession`. Phase-2 native task.