Logitech Muse never appears under Settings > General > Spatial Accessory — spatial tracking permission never granted

I'm building a visionOS 26 app that uses SpatialTrackingSession with .accessory tracking and AnchoringComponent.AccessoryAnchoringSource to track a Logitech Muse, following the pattern from the WWDC25 "Explore spatial accessory input on visionOS" session (and matching two independently published implementations I found).

What works: The Muse pairs fine over Bluetooth, connects as a GCStylus (productCategory == .spatialStylus), GCStylusDidConnect fires, and button input (pressedDidChangeHandler) works correctly.

What doesn't: SpatialTrackingSession.run() always reports .accessory as unavailable, so AnchoringComponent.AccessoryAnchoringSource(device:) never succeeds. Checking Settings > General > Spatial Accessory on the device shows the Muse isn't listed there at all — not even a battery/status entry. Settings > Privacy & Security > Spatial Accessory also never lists our app.

What I've tried:

  • Forgetting the Muse in Bluetooth and re-pairing
  • Full power-cycle of both Bluetooth and the Muse itself
  • Confirmed NSAccessoryTrackingUsageDescription is set and the Accessory Tracking + Game Controllers (Spatial Gamepad) capabilities are enabled in Xcode
  • Confirmed via Apple's own docs, the WWDC session, and two developer write-ups that no special commissioning step beyond standard Bluetooth pairing should be needed

For comparison, XR Putt (which also uses the Muse) works fine and does show up with a green checkmark under Spatial Accessory permissions on the same headset.

Has anyone hit this specific "device never gets commissioned as a spatial accessory" issue, or knows what actually triggers that commissioning beyond generic Bluetooth pairing? Happy to share more logs/details.

Hi @positivevibemindset,

Sorry to hear you're experiencing issues tracking the Logitech Muse. Your setup sounds correct overall—the inclusion of the NSAccessoryTrackingUsageDescription being particularly important—so my only other lead given the symptoms you've described is that accessory tracking authorization is somehow not being requested by the app. Do you recall ever seeing a pop-up asking if you want to "Allow YourAppName to access the movement of your accessory?" when running the app? Additionally, could you tell me more about how/where you're calling SpatialTrackingSession.run(), as well as the specific error you're encountering when you run that?

In case it's helpful, here's a snippet that successfully tracks the Logitech Muse stylus when I run it on my device:

struct SpatialStylusTestView: View {
    let root = Entity()
    
    let session = SpatialTrackingSession()
    let configuration = SpatialTrackingSession.Configuration(tracking: [.accessory])
    
    var body: some View {
        RealityView { content in
            content.add(root)
            
            // Run the spatial tracking session.
            await session.run(configuration)
        }.task {
            do {
                // Setup tracking for styli that are already connected.
                for stylus in GCStylus.styli {
                    try await setupSpatialStylus(stylus: stylus)
                }
                // Setup tracking for new styli as they connect.
                for await notification in NotificationCenter.default.notifications(named: NSNotification.Name.GCStylusDidConnect) {
                    guard let controller = notification.object as? GCStylus,
                          controller.productCategory == GCProductCategorySpatialStylus else { continue }
                    try await setupSpatialStylus(stylus: controller)
                }
            } catch {
                print("Failed to setup spatial stylus: \(error)")
            }
        }
    }
    
    func setupSpatialStylus(stylus: GCStylus) async throws {
        // Get the anchoring source and location for the stylus.
        let source = try await AnchoringComponent.AccessoryAnchoringSource(device: stylus)
        guard let location = source.locationName(named: "aim") else {
            return
        }
      
        // Create the anchor entity.
        let stylusAnchor = AnchorEntity(.accessory(from: source, location: location),
                                        trackingMode: .predicted)
        
        // Attach a model component to visualize the anchor entity.
        stylusAnchor.components.set(ModelComponent(mesh: .generateSphere(radius: 0.01), materials: [SimpleMaterial()]))
        root.addChild(stylusAnchor)
    }
}

Could you try opening this view as an immersive space (in a project with an NSAccessoryTrackingUsageDescription plist entry) and let me know what happens? You'll know it's successful if you see a small white sphere anchored to the tip of the stylus.

Thanks!

Logitech Muse never appears under Settings > General > Spatial Accessory — spatial tracking permission never granted
 
 
Q