visionOS nearby SharePlay blocks local microphone capture

I created a minimal sample project that reproduces a microphone issue with nearby SharePlay / Window Sharing on Apple Vision Pro.

Sample project: https://github.com/JerryNee/mic-demo

Screen recording: https://youtu.be/aMj_A_leJWU

Issue

I first implemented SharePlay through FaceTime and found that local microphone capture was unavailable. That seemed understandable because FaceTime itself uses the microphone. I then moved the app to a nearby SharePlay / Window Sharing session specifically to avoid a FaceTime call, but local microphone capture still fails.

Local microphone capture works before starting nearby SharePlay. After starting a nearby SharePlay / Window Sharing session with GroupActivities, the same app fails at:

try audioEngine.start()

This does not require a FaceTime call. It happens with an in-room nearby SharePlay / Window Sharing session.

The screen recording also goes silent when the Share Window UI appears. I checked the MP4 audio track with ffmpeg silencedetect; audio becomes silent at about 00:00:22.60, matching the moment nearby sharing starts:

silence_start: 22.600612
silence_end: 55.051927 | silence_duration: 32.451315

Environment

  • Two nearby Apple Vision Pro devices
  • Xcode device list: visionOS 27.0 and visionOS 26.5
  • Xcode 27.0, build 27A5194q
  • Frameworks: GroupActivities, AVFoundation, Speech
  • Entitlement: com.apple.developer.group-session
  • Microphone and speech recognition permissions granted

Steps

  1. Run the sample on Apple Vision Pro.
  2. Tap Start Listening and speak. Transcription works.
  3. Tap Stop Listening.
  4. Tap Start Nearby Session.
  5. Share with another nearby Apple Vision Pro.
  6. Tap Start Listening again while the nearby session is active.
  7. audioEngine.start() fails. Ending the nearby session makes microphone capture work again.

Minimal microphone code

let recognizer = SFSpeechRecognizer()
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
request.shouldReportPartialResults = true

let session = AVAudioSession.sharedInstance()
try session.setCategory(.record, mode: .measurement, options: [.duckOthers])
try session.setActive(true)

let input = audioEngine.inputNode
let format = input.outputFormat(forBus: 0)
input.installTap(onBus: 0, bufferSize: 1024, format: format) { buffer, _ in
    request.append(buffer)
}

audioEngine.prepare()
try audioEngine.start()

Minimal nearby SharePlay code

struct MicDemoActivity: Codable, GroupActivity, Transferable {
    static let activityIdentifier = "com.example.mic-demo.nearby-mic-repro"

    static var transferRepresentation: some TransferRepresentation {
        CodableRepresentation(contentType: .micDemoActivity)
    }

    var metadata: GroupActivityMetadata {
        var metadata = GroupActivityMetadata()
        metadata.type = .generic
        metadata.title = "Mic Demo Nearby Session"
        return metadata
    }
}

for await session in MicDemoActivity.sessions() {
    session.join()
}

_ = try await MicDemoActivity().activate()

Questions

  1. Is local microphone capture expected to be unavailable during a nearby SharePlay / Window Sharing session?
  2. Is screen recording audio expected to become silent during nearby sharing?
  3. What is the recommended way to support nearby shared UI/state while still allowing local voice input?

Hey @nijianwei,

This is a known limitation. A SharePlay session can include both nearby and FaceTime participants. There's no supported way for you to enable the microphone in a SharePlay session with only nearby participants.

If you'd like us to consider adding the necessary functionality, please file an enhancement request using Feedback Assistant. Please include as much information as you can describing your use case. Once you file the request, please post the FB number here.

If you're not familiar with how to file enhancement requests, take a look at Bug Reporting: How and Why?

Looking forward to learning more about your use case,
Michael

visionOS nearby SharePlay blocks local microphone capture
 
 
Q