#WWDC19•

What’s New in Core Bluetooth•

Duy Phan, Bluetooth Engineer
Yilok Wong, Bluetooth Engineer
Meghna Lav, Bluetooth Engineer© 2019 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

•Introduction•

Low energy 2 Mbps•

Advertising extensions•

Core Bluetooth for BR/EDR•

Core Bluetooth dual-mode•

User privacy•

PacketLogger•

Summary•Introduction

Duy Phan, Bluetooth Engineer•Low Energy 2 Mbps

LE 2 Mbps

NEW

LE 2 Mbps

New feature in Bluetooth 5.0

NEWLE 2 Mbps

New feature in Bluetooth 5.0
Physical layer rate increased from 1 Mbps to 2 Mbps

NEW

LE 2 Mbps

NEW

New feature in Bluetooth 5.0

IntervalIntervalInterval

Physical layer rate increased from 1 Mbps to 2 Mbps

LE 2 Mbps

NEW

New feature in Bluetooth 5.0

2x

1x

2x

Interval

1xIntervalInterval

Physical layer rate increased from 1 Mbps to 2 Mbps

1x2x

LE 2 Mbps

New feature in Bluetooth 5.0
Physical layer rate increased from 1 Mbps to 2 Mbps
Faster and more power efficient connectionNEWLE 2 Mbps

New feature in Bluetooth 5.0
Physical layer rate increased from 1 Mbps to 2 Mbps
Faster and more power efficient connection
Transparent to the applicationNEWLE 2 Mbps

New feature in Bluetooth 5.0
Physical layer rate increased from 1 Mbps to 2 Mbps
Faster and more power efficient connection
Transparent to the application
Accessories must support LE 2 Mbps

NEW

LE 2 Mbps

New feature in Bluetooth 5.0
Physical layer rate increased from 1 Mbps to 2 Mbps
Faster and more power efficient connection
Transparent to the application
Accessories must support LE 2 Mbps
Available starting with iPhone 8, Apple TV 4K, and Apple Watch Series 4

NEW

LE 2 Mbps Throughput (kbps)

NEW

2.5

Write With Response
Write Without Response

37
48+Larger MTU

135+Extended Data Length197+LE L2CAP

394+15ms Interval+LE 2Mbps

0

70

140

210

280

350

420

490

560

630

700

LE 2 Mbps Throughput (kbps)

NEW

2.5

Write With Response
Write Without Response

37
48+Larger MTU

135+Extended Data Length197+LE L2CAP

394+15ms Interval

670+LE 2Mbps

0

70

140

210

280

350

420

490

560

630

700

•

Advertising Extensions

Advertising Extensions

NEW

ADV

ADV

ADV

31

31

31

1 MbpsAdvertising Extensions

NEW

ADV

ADV

ADV

31

31

31

ExtADVExtADVExtADV

1 Mbps

1 MbpsAdvertising Extensions

NEW

ADV

ADV

ADV

31

31

31

ExtADVExtADVExtADV

1 Mbps

1 Mbps

255

255

255

2 MbpsExtended Scan

NEW

Extended Scan

Scans for extended advertisements

NEW

Extended Scan

Scans for extended advertisements
Accessories must support extended advertisements with LE 2 Mbps

NEW

Extended Scan

Scans for extended advertisements
Accessories must support extended advertisements with LE 2 Mbps
Support extended advertisement payload up to 124 bytes

NEW

Extended Scan

Scans for extended advertisements
Accessories must support extended advertisements with LE 2 Mbps
Support extended advertisement payload up to 124 bytes
4 times the advertisement data that an accessory can send todayNEWExtended Scan

Scans for extended advertisements
Accessories must support extended advertisements with LE 2 Mbps
Support extended advertisement payload up to 124 bytes
4 times the advertisement data that an accessory can send today
Transparent to application

NEWExtended Scan

Scans for extended advertisements
Accessories must support extended advertisements with LE 2 Mbps
Support extended advertisement payload up to 124 bytes
4 times the advertisement data that an accessory can send today
Transparent to application
New API to query for platform supportclass func supports(_ features: CBCentralManager.Feature) -> Boolstatic var extendedScanAndConnect: CBCentralManager.Feature { get }NEWExtended Connections

NEWExtended Connections

Supports connections to connectable extended advertisements

NEW

Extended Connections

Supports connections to connectable extended advertisements
Improves existing connection exchange protocol

NEWLegacy Connections
Advertiser

ScannerNEW

Legacy Connections
Advertiser
ADV

ScannerNEW

Legacy Connections
Advertiser
ADV

Scanner
Conn_Indication

NEWLegacy Connections
Advertiser
ADV

X No ACK

Scanner
Conn_Indication

NEWLegacy Connections

NEW

Advertiser
ADV

X No ACK

Scanner
Conn_Indication
Wakes Host Processor

Extended Connections
Advertiser

Advertiser

ScannerExtended Connections
Advertiser
ExtADV

Advertiser

ScannerExtended Connections
Advertiser
ExtADV

Advertiser

ScannerConnection_Request

Extended Connections
Advertiser
ExtADV

Advertiser
Connection_Response

ScannerConnection_Request

Extended Connections
Advertiser
ExtADV

Advertiser
Connection_Response

Scanner

Wakes Host Processor
Connection_Request

Extended Connections
Advertiser
ExtADV

Advertiser
Connection_Response

Scanner

2 MbpsWakes Host Processor
Connection_Request

2 MbpsExtended Connections

Supports connections to peripheral connectable extended advertisements
Improves on connection protocol exchange
More robust and power efficient

NEWExtended Connections

Supports connections to peripheral connectable extended advertisements
Improves on connection protocol exchange
More robust and power efficient
Transparent to application

NEWExtended Connections

Supports connections to peripheral connectable extended advertisements
Improves on connection protocol exchange
More robust and power efficient
Transparent to application
Accessories must support connectable extended advertisements

NEW

Extended Connections

Supports connections to peripheral connectable extended advertisements
Improves on connection protocol exchange
More robust and power efficient
Transparent to application
Accessories must support connectable extended advertisements
New API to query for platform supportclass func supports(_ features: CBCentralManager.Feature) -> Boolstatic var extendedScanAndConnect: CBCentralManager.Feature { get }

NEW

•

Core Bluetooth for BR/EDR

Yilok Wong, Bluetooth Engineer

Core Bluetooth 2018
Core Bluetooth
GATT
Profiles
ATT
L2CAP

L2CAP

BR/EDR

Low Energy

Core Bluetooth 2018
Core Bluetooth
GATT
Profiles
ATT
L2CAP

L2CAP

BR/EDR

Low Energy

Core Bluetooth 2019

NEW

Core Bluetooth
GATT
Profiles
ATT
L2CAP
BR/EDR

Low Energy

Core Bluetooth BR/EDRNEWCore Bluetooth BR/EDR

Use Core Bluetooth with BR/EDR Bluetooth devices

NEWCore Bluetooth BR/EDR

Use Core Bluetooth with BR/EDR Bluetooth devices
Bluetooth SIG GATT protocol running over BR/EDRNEWCore Bluetooth BR/EDR

Use Core Bluetooth with BR/EDR Bluetooth devices
Bluetooth SIG GATT protocol running over BR/EDR
Same CBPeripheral APIs

NEW

Core Bluetooth BR/EDR

Use Core Bluetooth with BR/EDR Bluetooth devices
Bluetooth SIG GATT protocol running over BR/EDR
Same CBPeripheral APIs
New API in CBCentralManager

NEWCore Bluetooth BR/EDR

Use Core Bluetooth with BR/EDR Bluetooth devices
Bluetooth SIG GATT protocol running over BR/EDR
Same CBPeripheral APIs
New API in CBCentralManager
Available today with latest iOS, watchOS, and tvOS

NEW

Core Bluetooth BR/EDR

Use Core Bluetooth with BR/EDR Bluetooth devices
Bluetooth SIG GATT protocol running over BR/EDR
Same CBPeripheral APIs
New API in CBCentralManager
Available today with latest iOS, watchOS, and tvOS
Add support to your accessory

NEWRegistering for Connection EventsNEW

Registering for Connection Events

Connection registration by the Central• Register by Service• Register by Peripheral

NEWRegistering for Connection Events

Connection registration by the Central• Register by Service• Register by Peripheral
open class CBCentralManager : CBManager {open func registerForConnectionEvents(options:[CBConnectionEventMatchingOption:Any]?)}NEWRegistering for Connection Events

Connection registration by the Central• Register by Service• Register by Peripheral
open class CBCentralManager : CBManager {open func registerForConnectionEvents(options:[CBConnectionEventMatchingOption:Any]?)}
extension CBConnectionEventMatchingOption {public static let serviceUUIDs: CBConnectionEventMatchingOption
public static let peripheralUUIDs: CBConnectionEventMatchingOption}

NEWConnection EventNEWConnection Event

Delegate callback• Sent on matching connection• Sent after registration if a matching connection already establishedNEWConnection Event

Delegate callback• Sent on matching connection• Sent after registration if a matching connection already establishedoptional func centralManager(_ central: CBCentralManager, connectionEventDidOccur event:CBConnectionEvent, for peripheral: CBPeripheral)NEWIncoming Connection

Initialization

private var central: CBCentralManager!
central = CBCentralManager(delegate: self, queue: nil)

Registration

let matchingOptions =[CBConnectionEventMatchingOption.serviceUUIDs :[myServiceUUID]]
central.registerForConnectionEvents(options:matchingOptions)DiscoverDiscoverInquiry Scan

Inquiry Response

DiscoverInquiry Scan

Inquiry ResponseConnect/PairConnect/PairConnect/Pair

BR/EDR Connected and PairedDelegate Callback

Delegate Callback// Connection Event
func centralManager(_ central: CBCentralManager,connectionEventDidOccur event: CBConnectionEvent,for peripheral: CBPeripheral) {}Delegate Callback// Connection Event
func centralManager(_ central: CBCentralManager,connectionEventDidOccur event: CBConnectionEvent,for peripheral: CBPeripheral) {// Handle connection event}

// Initialization
private var cbManager: CBCentralManager!
cbManager = CBCentralManager(delegate: self, queue: nil)// Registering for Gatt Connection events
let matchingOptions = [CBConnectionEventMatchingOption.serviceUUIDs : [myServiceUUID]]()cbManager.registerForConnectionEvents(options: matchingOptions)// Delegate callback
func centralManager(_ central: CBCentralManager, connectionEventDidOccur event:CBConnectionEvent, for peripheral: CBPeripheral) {switch event {case .peerConnected:// We are interested in this peripheral, clear registration
cbManager.connect(peripheral, options: nil)cbManager.registerForConnectionEvents(options: nil)default:// Not interested}

// Initialization
private var cbManager: CBCentralManager!
cbManager = CBCentralManager(delegate: self, queue: nil)// Registering for Gatt Connection events
let matchingOptions = [CBConnectionEventMatchingOption.serviceUUIDs : [myServiceUUID]]()cbManager.registerForConnectionEvents(options: matchingOptions)// Delegate callback
func centralManager(_ central: CBCentralManager, connectionEventDidOccur event:CBConnectionEvent, for peripheral: CBPeripheral) {switch event {case .peerConnected:// We are interested in this peripheral, clear registration
cbManager.connect(peripheral, options: nil)cbManager.registerForConnectionEvents(options: nil)default:// Not interested}

// Initialization
private var cbManager: CBCentralManager!
cbManager = CBCentralManager(delegate: self, queue: nil)// Registering for Gatt Connection events
let matchingOptions = [CBConnectionEventMatchingOption.serviceUUIDs : [myServiceUUID]]()cbManager.registerForConnectionEvents(options: matchingOptions)// Delegate callback
func centralManager(_ central: CBCentralManager, connectionEventDidOccur event:CBConnectionEvent, for peripheral: CBPeripheral) {switch event {case .peerConnected:// We are interested in this peripheral, clear registration
cbManager.connect(peripheral, options: nil)cbManager.registerForConnectionEvents(options: nil)default:// Not interested}

// Initialization
private var cbManager: CBCentralManager!
cbManager = CBCentralManager(delegate: self, queue: nil)// Registering for Gatt Connection events
let matchingOptions = [CBConnectionEventMatchingOption.serviceUUIDs : [myServiceUUID]]()cbManager.registerForConnectionEvents(options: matchingOptions)// Delegate callback
func centralManager(_ central: CBCentralManager, connectionEventDidOccur event:CBConnectionEvent, for peripheral: CBPeripheral) {switch event {case .peerConnected:// We are interested in this peripheral, clear registration
cbManager.connect(peripheral, options: nil)cbManager.registerForConnectionEvents(options: nil)default:// Not interested}

// Initialization
private var cbManager: CBCentralManager!
cbManager = CBCentralManager(delegate: self, queue: nil)// Registering for Gatt Connection events
let matchingOptions = [CBConnectionEventMatchingOption.serviceUUIDs : [myServiceUUID]]()cbManager.registerForConnectionEvents(options: matchingOptions)// Delegate callback
func centralManager(_ central: CBCentralManager, connectionEventDidOccur event:CBConnectionEvent, for peripheral: CBPeripheral) {switch event {case .peerConnected:// We are interested in this peripheral, clear registration
cbManager.connect(peripheral, options: nil)cbManager.registerForConnectionEvents(options: nil)default:// Not interested}

Outgoing Connection

Connecting Out

Connecting Out

private var central: CBCentralManager?
central = CBCentralManager(delegate: self, queue: nil)Connecting Out

private var central: CBCentralManager?
central = CBCentralManager(delegate: self, queue: nil)
central?.connect(myPeripheral, options: nil)

BR/EDR Page

BR/EDR Page

Page

Page Scan

ConnectedConnected

optional func centralManager(_ central:
CBCentralManager, didConnect peripheral: CBPeripheral){// Handle connection}

BR/EDR Connected and Paired•Core Bluetooth Dual-ModeImproving Dual-Mode PairingImproving Dual-Mode Pairing

Cross Transport Key Derivation

NEW

Cross Transport Key Derivation

Bluetooth 4.2 SIG Specification

NEW

Cross Transport Key Derivation

Bluetooth 4.2 SIG Specification
Single pairing process

NEWCross Transport Key Derivation

Bluetooth 4.2 SIG Specification
Single pairing process
Same CBPeripheral identifierNEW

Cross Transport Key Derivation

Bluetooth 4.2 SIG Specification
Single pairing process
Same CBPeripheral identifier
Transparent to the application

NEW

Cross Transport Key Derivation

Bluetooth 4.2 SIG Specification
Single pairing process
Same CBPeripheral identifier
Transparent to the application

NEW

Cross Transport Key Derivation

NEW

Cross Transport Key Derivation

NEW

Cross Transport Key Derivation

NEW

Instead of Inquiry

Inquiry Scan

Inquiry ResponseLow Energy Scan

Scan

AdvertiseCTKD — Pairing

CTKD — Pairing

LE Connected

CTKD — Pairing

LE ConnectedKey Derivation

LE Connected and Paired

Key Derivation

LE Connected and Paired

Key Derivation

LE Connected and Paired

CTKD — BR/EDR Connected

LE Connected and Paired

BR/EDR Connection Request

CTKD — BR/EDR Connected

LE Connected and Paired

BR/EDR Connected and PairedImproving Dual-Mode Connections

Improving Dual-Mode Connections

LE Connected and PairedImproving Dual-Mode Connections

LE Connected and Paired
BR/EDR Connected and Paired

BridgingNEW

Bridging

Low Energy proximity triggers BR/EDR connectionNEWBridging

Low Energy proximity triggers BR/EDR connection
Works on devices supporting CTKDNEWBridging

Low Energy proximity triggers BR/EDR connection
Works on devices supporting CTKD
public let CBConnectPeripheralOptionEnableTransportBridgingKey: StringNEWBridging

Low Energy proximity triggers BR/EDR connection
Works on devices supporting CTKD
public let CBConnectPeripheralOptionEnableTransportBridgingKey: String

cbCentralManager.connect(cbPeripheral,
options:[CBConnectPeripheralOptionEnableTransportBridgingKey : true])NEWBridgingNEW

BridgingNEW

LE Connected and Paired

cbCentralManager.connect(cbPeripheral, options:[CBConnectPeripheralOptionEnableTransportBridgingKey : true])

BridgingNEW

BR/EDR Connection Request
LE Connected and Paired

cbCentralManager.connect(cbPeripheral, options:[CBConnectPeripheralOptionEnableTransportBridgingKey : true])

Bridging

BR/EDR Connected and Paired
LE Connected and Paired

Bridging

BR/EDR Connected and Paired
LE Connected and Paired•

Privacy Update

Meghna Lav, Bluetooth Engineer

Enhancements

Enhancements

User authorization

Enhancements

User authorization
Accessory notifications

User Authorization

How it currently works

Required only for background advertisingUser AuthorizationNEW

User Authorization

User consent required for all Core Bluetooth API’s

NEW

User Authorization

User consent required for all Core Bluetooth API’s
Applies to apps linked with any SDKNEWUser Authorization

User consent required for all Core Bluetooth API’s
Applies to apps linked with any SDK
Can be modified in SettingsNEWUser Authorization

User consent required for all Core Bluetooth API’s
Applies to apps linked with any SDK
Can be modified in Settings
Required on iOS, watchOS, and tvOS

NEW

User Authorization on watchOSNEW

User Authorization on watchOS

Shared between iOS and watchOSNEW

User Authorization on watchOS

Shared between iOS and watchOS
Except for standalone watchOS applications

NEWAdoption

Purpose stringNEWAdoption

Purpose string

Core BluetoothClassicSample: [access] This app has crashed because it attempted to access privacy-sensitive data
without a usage description. The app's Info.plist must contain an NSBluetoothAlwaysUsageDescription key with astring value explaining to the user how the app uses this data.

NEWAdoption

New property

var authorization: CBManagerAuthorization { get }enum CBManagerAuthorization : Int {init?(rawValue: Int)var rawValue: Int { get }case notDeterminedcase restrictedcase deniedcase allowedAlways}

NEWAdoption

New property

var authorization: CBManagerAuthorization { get }enum CBManagerAuthorization : Int {init?(rawValue: Int)var rawValue: Int { get }case notDeterminedcase restrictedcase deniedcase allowedAlways}

NEWAdoption

New property

var authorization: CBManagerAuthorization { get }enum CBManagerAuthorization : Int {init?(rawValue: Int)var rawValue: Int { get }case notDeterminedcase restrictedcase deniedcase allowedAlways}

NEWAdoptionFlowfunc centralManagerDidUpdateState(_ central: CBCentralManager)
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager)
open var state: CBManagerState { get }// if (state == CBManagerState.unauthorized)
open var authorization: CBManagerAuthorization { get }NEWAdoptionFlowfunc centralManagerDidUpdateState(_ central: CBCentralManager)
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager)
open var state: CBManagerState { get }// if (state == CBManagerState.unauthorized)
open var authorization: CBManagerAuthorization { get }NEWAdoptionFlowfunc centralManagerDidUpdateState(_ central: CBCentralManager)
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager)
open var state: CBManagerState { get }// if (state == CBManagerState.unauthorized)
open var authorization: CBManagerAuthorization { get }NEWAdoptionFlowfunc centralManagerDidUpdateState(_ central: CBCentralManager)
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager)
open var state: CBManagerState { get }// if (state == CBManagerState.unauthorized)
open var authorization: CBManagerAuthorization { get }NEW// Old managerDidUpdateState
func centralManagerDidUpdateState(_ central: CBCentralManager) {if (cbState == CBManagerState.poweredOn) {// Kick-off bluetooth functionality}}

// Updated managerDidUpdateState
func centralManagerDidUpdateState(_ central: CBCentralManager) {switch central.state {case.unknown:// Handle state
case.resetting:// Handle statecase.unsupported:// Handle state
case.unauthorized:

if (central.authorization != CBManagerAuthorization.allowedAlways) {// Prompt user to give permission}
case.poweredOn:// Handle statecase.poweredOff:// Handle state}}Enhancements

User authorization
Accessory notifications

Accessory Notifications

Accessory Notifications

Apple Notification Center Service

Accessory Notifications

Apple Notification Center Service
GATT server service

Accessory Notifications

Apple Notification Center Service
GATT server service
Allows accessories to receive notifications from iOS

ANCS Privacy Update

NEWANCS Privacy Update

User permission required to share notifications

NEW

ANCS Privacy Update

User permission required to share notifications
Prompted when accessory registers for notifications

NEW

ANCS Privacy Update

User permission required to share notifications
Prompted when accessory registers for notifications
Permissions can be changed in Settings

NEWANCS Privacy Update

User permission required to share notifications
Prompted when accessory registers for notifications
Permissions can be changed in Settings

NEWANCS Privacy Update

User permission required to share notifications
Prompted when accessory registers for notifications
Permissions can be changed in Settings

NEWNew ANCS Privacy API

public let CBConnectPeripheralOptionRequiresANCS: String

optional func centralManager(_central: CBCentralManager, didUpdateANCSAuthorizationFor
peripheral: CBPeripheral)

open var ancsAuthorized: Bool { get }NEWNew ANCS Privacy API

public let CBConnectPeripheralOptionRequiresANCS: String

optional func centralManager(_central: CBCentralManager, didUpdateANCSAuthorizationFor
peripheral: CBPeripheral)

open var ancsAuthorized: Bool { get }NEWNew ANCS Privacy API

public let CBConnectPeripheralOptionRequiresANCS: String

optional func centralManager(_central: CBCentralManager, didUpdateANCSAuthorizationFor
peripheral: CBPeripheral)

open var ancsAuthorized: Bool { get }NEWNew ANCS Privacy API

public let CBConnectPeripheralOptionRequiresANCS: String

optional func centralManager(_central: CBCentralManager, didUpdateANCSAuthorizationFor
peripheral: CBPeripheral)

open var ancsAuthorized: Bool { get }NEWBest Practices

Best Practices

Invoke Core Bluetooth APIs only when required

Best Practices

Invoke Core Bluetooth APIs only when required
Scan and advertise for a limited duration

Best Practices

Invoke Core Bluetooth APIs only when required
Scan and advertise for a limited duration
Scan for specific service UUID(s)Best Practices

Invoke Core Bluetooth APIs only when required
Scan and advertise for a limited duration
Scan for specific service UUID(s)Be transparent•Core Bluetooth PacketLogger

Duy Phan, Bluetooth Engineer

Overview

OverviewBluetooth packet analysis application

OverviewBluetooth packet analysis application
Visualizer for packet logs inside sysdiagnose

OverviewBluetooth packet analysis application
Visualizer for packet logs inside sysdiagnose
Decode all protocols defined by Bluetooth SIG and AppleOverviewBluetooth packet analysis application
Visualizer for packet logs inside sysdiagnose
Decode all protocols defined by Bluetooth SIG and Apple
Rich filtering options

OverviewBluetooth packet analysis application
Visualizer for packet logs inside sysdiagnose
Decode all protocols defined by Bluetooth SIG and Apple
Rich filtering options
Search by text or regex

OverviewBluetooth packet analysis application
Visualizer for packet logs inside sysdiagnose
Decode all protocols defined by Bluetooth SIG and Apple
Rich filtering options
Search by text or regex
Comment and flag packets

OverviewBluetooth packet analysis application
Visualizer for packet logs inside sysdiagnose
Decode all protocols defined by Bluetooth SIG and Apple
Rich filtering options
Search by text or regex
Comment and flag packets
Export raw data for analysis

Top Level View

Top Level View

Top Level View

Top Level View

Hierarchical View

Hierarchical View

Hierarchical View

Live CaptureNEWLive CaptureNEWLive CaptureNEWLive CaptureNEWLive CaptureNEWLive Capture

Install iOS 13 developer beta

NEWLive Capture

Install iOS 13 developer beta
Install iOS Bluetooth developer logging profileNEWLive Capture

Install iOS 13 developer beta
Install iOS Bluetooth developer logging profile
Launch PacketLogger

NEWLive Capture

Install iOS 13 developer beta
Install iOS Bluetooth developer logging profile
Launch PacketLogger
Connect your iOS device to your Mac

NEWLive Capture

Install iOS 13 developer beta
Install iOS Bluetooth developer logging profile
Launch PacketLogger
Connect your iOS device to your Mac
Select File and “New iOS Trace”

NEWLive Capture

Install iOS 13 developer beta
Install iOS Bluetooth developer logging profile
Launch PacketLogger
Connect your iOS device to your Mac
Select File and “New iOS Trace”
Indicator will appear on iOS device

NEWGetting PacketLogger

Getting PacketLogger

Download “Additional Tools for Xcode”

Getting PacketLogger

Download “Additional Tools for Xcode”
PacketLogger is inside the Hardware folder

Getting PacketLogger

Download “Additional Tools for Xcode”
PacketLogger is inside the Hardware folder
For best performance run with macOS Catalina

SummarySummary

Use chipset with latest Bluetooth standard

Summary

Use chipset with latest Bluetooth standard
Build Core Bluetooth apps for BR/EDR devices

Summary

Use chipset with latest Bluetooth standard
Build Core Bluetooth apps for BR/EDR devices
Protect user privacy

Summary

Use chipset with latest Bluetooth standard
Build Core Bluetooth apps for BR/EDR devices
Protect user privacy
Take advantage of the developer beta

Summary

Use chipset with latest Bluetooth standard
Build Core Bluetooth apps for BR/EDR devices
Protect user privacy
Take advantage of the developer beta
Refer to Accessory Design Guidelines for Apple devices

Summary

Use chipset with latest Bluetooth standard
Build Core Bluetooth apps for BR/EDR devices
Protect user privacy
Take advantage of the developer beta
Refer to Accessory Design Guidelines for Apple devices
Apple is here to helpMore Information
developer.apple.com/wwdc19/901

Core Bluetooth Lab

Friday, 4:00