iOS 27 introduces Bluetooth Channel Sounding support via Core Bluetooth and Nearby Interaction, enabling apps to measure real distance (and optionally direction) to paired Bluetooth accessories without requiring Ultra Wideband hardware.
• Replaces unreliable RSSI-based proximity guessing with true distance measurement across the 2.4GHz band, dramatically improving accuracy for accessory-finding use cases.
• Works with Bluetooth-only accessories (no UWB chip required), lowering the hardware bar for third-party accessory makers.
• Integrates with Nearby Interaction to add camera-fused direction estimates on top of distance, matching UWB-class UX on devices with the N1 chip.
Demonstrates starting a Core Bluetooth Channel Sounding session with a paired peripheral and reading real-time distance measurements via the delegate callback.
import SwiftUI
import CoreBluetooth
// MARK: - Channel Sounding Manager
class ChannelSoundingManager: NSObject, ObservableObject {
@Published var distanceMeters: Double? = nil
@Published var statusMessage: String = "Idle"
private var centralManager: CBCentralManager!
private var targetPeripheral: CBPeripheral?
override init() {
super.init()
centralManager = CBCentralManager(delegate: self, queue: .main)
}
func startSession(with peripheral: CBPeripheral) {
guard CBCentralManager.supportsFeatures(.channelSounding) else {
statusMessage = "Channel Sounding not supported on this device."
return
}
targetPeripheral = peripheral
peripheral.delegate = self
peripheral.startChannelSoundingSession()
statusMessage = "Session active — measuring distance…"
}
func stopSession() {
targetPeripheral?.cancelChannelSoundingSession()
}
}
// MARK: - CBCentralManagerDelegate
extension ChannelSoundingManager: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
statusMessage = central.state == .poweredOn ? "Bluetooth ready" : "Bluetooth unavailable"
}
}
// MARK: - CBPeripheralDelegate (Channel Sounding)
extension ChannelSoundingManager: CBPeripheralDelegate {
func peripheral(_ peripheral: CBPeripheral,
didReceive results: CBChannelSoundingResults) {
if let distance = results.distance {
distanceMeters = distance
statusMessage = String(format: "Distance: %.2f m", distance)
} else {
statusMessage = "Measurement unavailable"
}
}
func peripheral(_ peripheral: CBPeripheral,
didCompleteChannelSoundingSession error: Error?) {
statusMessage = error == nil ? "Session ended." : "Session error: \(error!.localizedDescription)"
distanceMeters = nil
}
}
// MARK: - SwiftUI View
struct ChannelSoundingView: View {
@StateObject private var manager = ChannelSoundingManager()
var body: some View {
VStack(spacing: 24) {
Text("Bluetooth Channel Sounding")
.font(.title2.bold())
if let dist = manager.distanceMeters {
Text(String(format: "%.2f m", dist))
.font(.system(size: 64, weight: .semibold, design: .rounded))
.foregroundStyle(.blue)
} else {
Text("--")
.font(.system(size: 64, weight: .light, design: .rounded))
.foregroundStyle(.secondary)
}
Text(manager.statusMessage)
.font(.subheadline)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
Button("Stop Session") { manager.stopSession() }
.buttonStyle(.borderedProminent)
.tint(.red)
}
.padding()
}
}
#Preview {
ChannelSoundingView()
}iOS 27 adds sectioned queries, codable model attributes, ResultsObserver for non-SwiftUI change observation, and HistoryObserver for reacting to persistent history changes in SwiftData.
USDKit is a new first-party Swift framework introduced in iOS/macOS 27 that brings native USD scene creation, composition, modification, and export capabilities to Apple platform apps, with deep RealityKit and Spatial Preview integration.
LiveCommunicationKit is the modern replacement for CXProvider that delivers rich, native conversation UIs integrated with the Lock Screen, Dynamic Island, Phone app Recents, and Siri. It provides a unified lifecycle model for audio and video conversations with a single delegate-driven action pipeline.
Channel Sounding sessions are paused when the app moves to the background. iOS may throttle measurement frequency under heavy Bluetooth/Wi-Fi load. Distance and direction are both Optional in NINearbyObject — always nil-check. CameraAssistance must be explicitly enabled to receive direction data when using Nearby Interaction.
Requires an iPhone with the Apple N1 chip. Accessory must support Bluetooth 6.3, inline PCT, mode-0 and mode-2 phase-based ranging, and T_FCS ≥ 100µs.
The NowPlaying framework introduces a first-class Swift API for surfacing app media in system-wide now-playing surfaces — Lock Screen, Control Center, Dynamic Island, StandBy, CarPlay, Apple Watch, and Apple TV — via a declarative MediaSessionRepresentable protocol. It also supports remote media sessions (for controlling external speakers/TVs) and Media Sharing Extensions for routing media to third-party devices.