{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-369", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/369", "wordCount": 947, "segments": [{"start": 7.0, "text": "Hi! I'm Gretchen and I work on Core Bluetooth."}, {"start": 11.0, "text": "Today, I'm excited to introduce a way to find nearby Bluetooth accessories,"}, {"start": 16.0, "text": "using Channel Sounding."}, {"start": 19.0, "text": "First, I will give you some ideas for how you could use Channel Sounding,"}, {"start": 23.0, "text": "and how it works."}, {"start": 25.0, "text": "Then I will explain how to implement it in your app,"}, {"start": 28.0, "text": "using Core Bluetooth to get distance,"}, {"start": 32.0, "text": "or with Nearby Interaction to get distance and direction to your accessory."}, {"start": 38.0, "text": "Next,"}, {"start": 39.0, "text": "I will give you some tips for building hardware that supports Channel Sounding."}, {"start": 44.0, "text": "And I will end with some next steps."}, {"start": 47.0, "text": "Let's start with an overview."}, {"start": 51.0, "text": "Imagine I am hosting a party."}, {"start": 55.0, "text": "I am cooking inside using my oven,"}, {"start": 57.0, "text": "and I have a smoker going in the backyard."}, {"start": 61.0, "text": "I have Bluetooth thermometers in both places,"}, {"start": 64.0, "text": "to help me cook everything perfectly."}, {"start": 67.0, "text": "I get a notification,"}, {"start": 69.0, "text": "that one of my thermometers has reached the temperature I set."}, {"start": 73.0, "text": "When I open the app, it says the probe is 8 meters to my right."}, {"start": 79.0, "text": "That must be the smoker!"}, {"start": 81.0, "text": "With Channel Sounding, I won't mix up my temperature probes."}, {"start": 85.0, "text": "I can measure distance to each one!"}, {"start": 89.0, "text": "There are a couple ways to measure distance"}, {"start": 91.0, "text": "and direction to third-party accessories on iOS."}, {"start": 96.0, "text": "For the best accuracy,"}, {"start": 98.0, "text": "you can add an Ultra Wideband chipset to your accessory"}, {"start": 102.0, "text": "and use the Nearby Interaction framework in your app."}, {"start": 106.0, "text": "For more information on this,"}, {"start": 109.0, "text": "watch the video \"Explore Nearby Interaction with third-party accessories\"."}, {"start": 115.0, "text": "But if your accessory only has a Bluetooth chipset,"}, {"start": 118.0, "text": "then Bluetooth Channel Sounding is your best option."}, {"start": 122.0, "text": "You might have used RSSI in the past to estimate distance,"}, {"start": 127.0, "text": "but with Channel Sounding you can actually measure distance."}, {"start": 131.0, "text": "We encourage you to try Channel Sounding,"}, {"start": 133.0, "text": "where your app could benefit from better accuracy."}, {"start": 136.0, "text": "So, how exactly does Channel Sounding work?"}, {"start": 141.0, "text": "Let's say we have an iPhone that is paired and connected to a Bluetooth accessory."}, {"start": 147.0, "text": "In this scenario, the iPhone is called an initiator"}, {"start": 152.0, "text": "and the accessory is called a reflector."}, {"start": 155.0, "text": "The iPhone sends a signal, or tone, to the accessory,"}, {"start": 160.0, "text": "and the accessory reflects that tone back."}, {"start": 164.0, "text": "The iPhone measures how the signal changes in transit,"}, {"start": 168.0, "text": "from one side, to the other, and back."}, {"start": 173.0, "text": "By repeating this process across the channels of the 2.4GHz band,"}, {"start": 178.0, "text": "the iPhone observes the rate of change in these reflected tones,"}, {"start": 183.0, "text": "from one channel to the next,"}, {"start": 185.0, "text": "and uses that to estimate the distance between the initiator and reflector."}, {"start": 191.0, "text": "This process of measuring distance is called a procedure."}, {"start": 196.0, "text": "So, how do you perform Channel Sounding in your app?"}, {"start": 201.0, "text": "If you just need distance, you can use Core Bluetooth."}, {"start": 205.0, "text": "Before you begin,"}, {"start": 206.0, "text": "you'll want to ensure your accessory is paired and set up,"}, {"start": 209.0, "text": "using AccessorySetupKit, and connected through Core Bluetooth."}, {"start": 214.0, "text": "You can refer to the documentation for more on how this is done."}, {"start": 218.0, "text": "Now let's look at the code to measure distances."}, {"start": 223.0, "text": "First, check that Channel Sounding is supported on the local iOS device,"}, {"start": 227.0, "text": "using CBCentralManager.supportsFeatures method."}, {"start": 232.0, "text": "Once you have a connected CBPeripheral, call startChannelSoundingSession"}, {"start": 238.0, "text": "on the CBPeripheral object."}, {"start": 241.0, "text": "iOS will repeatedly perform Channel Sounding procedures."}, {"start": 246.0, "text": "When each procedure is completed,"}, {"start": 249.0, "text": "the delegate method peripheral didReceive results"}, {"start": 253.0, "text": "will be called with the measured distance in meters."}, {"start": 258.0, "text": "When you are ready to complete your Channel Sounding session,"}, {"start": 262.0, "text": "call cancelChannelSoundingSession."}, {"start": 266.0, "text": "When the session ends,"}, {"start": 267.0, "text": "the delegate method peripheral didCompleteChannelSoundingSession will be called."}, {"start": 274.0, "text": "Next,"}, {"start": 275.0, "text": "I'll tell you how to use Nearby Interaction"}, {"start": 277.0, "text": "to measure distance and direction."}, {"start": 281.0, "text": "Again,"}, {"start": 282.0, "text": "ensure your accessory has been paired and set up through AccessorySetupKit,"}, {"start": 286.0, "text": "and connected via CoreBluetooth."}, {"start": 288.0, "text": "Before creating a Channel Sounding session,"}, {"start": 291.0, "text": "check whether the local iOS device supports it,"}, {"start": 295.0, "text": "with the supportsBluetoothChannelSounding method."}, {"start": 300.0, "text": "Then create a configuration object,"}, {"start": 303.0, "text": "passing in the peripheral.identifier from CoreBluetooth"}, {"start": 306.0, "text": "as the bluetoothChannelSoundingIdentifier."}, {"start": 311.0, "text": "In order to get direction, CameraAssistance is required."}, {"start": 315.0, "text": "Be sure to enable this if you need it."}, {"start": 320.0, "text": "Finally, create your NISession,"}, {"start": 323.0, "text": "set the delegate,"}, {"start": 324.0, "text": "and run it with the new accessory configuration you just created."}, {"start": 329.0, "text": "If your app knows whether the accessory is moving or stationary,"}, {"start": 333.0, "text": "you can tell Nearby Interaction,"}, {"start": 335.0, "text": "and it will use that information to produce better direction estimates."}, {"start": 340.0, "text": "Call updateMotionState on your session with your accessory object.discoveryToken."}, {"start": 347.0, "text": "For example,"}, {"start": 349.0, "text": "if your accessory is a mounted tag on a wall, pass .stationary."}, {"start": 354.0, "text": "If it's attached to a moving object, pass .moving."}, {"start": 359.0, "text": "The delegate callback is identical to what you'd get with UWB."}, {"start": 364.0, "text": "You will receive NINearbyObjects updates with distance and direction."}, {"start": 371.0, "text": "Both the distance and the direction results"}, {"start": 373.0, "text": "benefit from the fusion of raw Bluetooth Channel Sounding measurements"}, {"start": 377.0, "text": "and camera inputs."}, {"start": 380.0, "text": "Remember that both, distance and direction, are optional."}, {"start": 385.0, "text": "Distance may be nil, if the Channel Sounding measurement failed."}, {"start": 391.0, "text": "iOS automatically filters outliers"}, {"start": 394.0, "text": "and smooths your results for a better user experience."}, {"start": 398.0, "text": "In iOS 27, use Channel Sounding when your app is in the foreground."}, {"start": 403.0, "text": "When your app moves to the background,"}, {"start": 405.0, "text": "your Channel Sounding session will be paused."}, {"start": 409.0, "text": "Also be aware,"}, {"start": 410.0, "text": "that iOS may reduce the frequency of Channel Sounding measurements,"}, {"start": 414.0, "text": "if other Bluetooth or Wi-Fi activity increases."}, {"start": 419.0, "text": "Channel Sounding is available on iPhones with the N1 chip."}, {"start": 425.0, "text": "Now I will explain how to make your accessories work well,"}, {"start": 429.0, "text": "with Channel Sounding on iOS."}, {"start": 432.0, "text": "Your accessory must support Bluetooth 6.3,"}, {"start": 436.0, "text": "and the inline PCT feature is required."}, {"start": 440.0, "text": "iOS uses phase based ranging,"}, {"start": 443.0, "text": "so your chipset must also support mode-0 and mode-2,"}, {"start": 447.0, "text": "as defined by the Bluetooth spec."}, {"start": 452.0, "text": "T_FCS is the interspace timing between tones."}, {"start": 456.0, "text": "Make sure your accessory supports T_FCS of at least 100µs."}, {"start": 462.0, "text": "Alright, you've heard all about Channel Sounding, but what's next?"}, {"start": 467.0, "text": "Try out the APIs with a compatible accessory."}, {"start": 471.0, "text": "Imagine how measuring distance would improve how people interact with your app."}, {"start": 476.0, "text": "Ask your questions on the Developer Forums"}, {"start": 479.0, "text": "and send us feedback using Feedback Assistant."}, {"start": 482.0, "text": "Thank you!"}]}