I'm trying to work out why Channel Sounding won't start on my device, and I'd be grateful for any pointers on what condition I haven't satisfied.
What I see
On an iPhone 17 Pro Max running iOS 27.0 beta (24A5390f), queried after the central manager reaches .poweredOn as the documentation requires:
if #available(iOS 27.0, *) {
print(CBCentralManager.supports(.channelSounding)) // false
print(NISession.deviceCapabilities.supportsBluetoothChannelSounding) // true
}
No accessory or connection is involved — both are local queries.
Because supports(.channelSounding) is false, the Core Bluetooth path fails with CBError code 13 ("Channel Sounding is not supported by the local or remote device"). I also tried calling startChannelSoundingSession(:) anyway, past my own capability check, against a connected peer; the same code 13 comes back from peripheral(:didCompleteChannelSoundingSession:), so it isn't merely an advisory check.
The Nearby Interaction path gets further — its capability check passes, so session.run(_:) is called with NINearbyAccessoryConfiguration(bluetoothChannelSoundingIdentifier:previousBluetoothIdentifier:) against a paired, connected reflector — and then invalidates with NIErrorCodeSessionFailed (-5887). Same result with isCameraAssistanceEnabled set to both true and false.
Apple's own "Measuring Distance Between Devices Using Channel Sounding" sample behaves identically on this device, so it isn't my code.
What I've ruled out
Querying before .poweredOn — the value is read in centralManagerDidUpdateState when the state is .poweredOn.
Hardware — this is an iPhone 17 Pro Max, and Nearby Interaction's own capability check reports the hardware as capable.
The Language & Region setting — changing it makes no difference.
Beta staleness — updated across two betas, no change.
The reflector — it implements the Ranging Service GATT server and the reflector role, and ranges successfully against another unit of its own model.
What I'm unsure about
The header comment for CBCentralManagerFeatureChannelSounding reads:
The hardware and region supports channel sounding
That's the only mention of "region" I can find in any Channel Sounding documentation — WWDC26 session 369 lists the N1 chip and the accessory-side requirements, but nothing about region, and there's no API to query that condition. My device is a South Korea market unit operating in South Korea, so I'm wondering whether that's what I'm hitting, but I have no way to confirm it.
I'd also be glad to be told I'm simply wrong about something more mundane.
Questions
What conditions cause supports(.channelSounding) to return false on a device that has the N1 chip? Is region genuinely one of them, and if so, is it determined by the market the device was sold in, its current location, or something else?
Should NISession.deviceCapabilities.supportsBluetoothChannelSounding be expected to agree with the Core Bluetooth check, or does it intentionally report hardware capability only? If the latter, is there a supported way to check Channel Sounding availability before running a session?
For anyone with Channel Sounding working: which path are you using — Core Bluetooth's startChannelSoundingSession(_:), or NISession with NINearbyAccessoryConfiguration? And does supports(.channelSounding) return true for you?
Question 3 is mostly to help me tell whether this is specific to my device.
Thanks — happy to share more logs or a minimal reproducer if it's useful.
4
0
225