Channel Sounding: supports(.channelSounding) is false on iPhone 17 Pro Max while Nearby Interaction reports the hardware as capable — what am I missing?

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.

FB : FB24167115

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.

As background context, channel sounding involves new radio usage techniques that were introduced in the Bluetooth 6.0 specifications. As sometimes happens, these differences can prevent the functionality from being certified on a given device or region, requiring us to disable that feature.

With that context, let me return to here:

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.

and here:

Because supports(.channelSounding) is false,

Our API docs tend to avoid describing exactly why they return "false" and that’s because it's very common for the circumstances or requirements to change, which makes it very hard to keep the documentation up to date and straightforward.

In any case, currently I'd expect channelSounding to return false if:

  • The device itself lacks the necessary hardware.

  • Regulatory issues mean that the feature is disabled.

__
Kevin Elliott
DTS Engineer, CoreOS/Hardware

I noticed this issue. The Nearby interaction result returns true(NISession.deviceCapabilities.supportsBluetoothChannelSounding), but we still get error NIErrorCodeSessionFailed (-5887). Is this also caused by regulatory constraints?

I noticed this issue. The Nearby interaction result returns true(NISession.deviceCapabilities.supportsBluetoothChannelSounding),

Please file a bug on this and post the bug number back here once it's filed.

but we still get error NIErrorCodeSessionFailed (-5887). Is this also caused by regulatory constraints?

Yes.

__
Kevin Elliott
DTS Engineer, CoreOS/Hardware

Channel Sounding: supports(.channelSounding) is false on iPhone 17 Pro Max while Nearby Interaction reports the hardware as capable — what am I missing?
 
 
Q