Bluetooth Devices in Swift: Step-by-Step Instructions

In this tutorial, we provide a comprehensive guide on how to connect Bluetooth devices in Swift.

Bluetooth connectivity is a fundamental feature in many iOS applications, enabling seamless communication with a wide range of devices such as speakers, headphones, fitness trackers, and IoT devices.

Throughout this tutorial, we walk you through the process of establishing Bluetooth connections in Swift. We cover essential topics such as discovering nearby Bluetooth devices, pairing with devices, handling connection callbacks, and sending/receiving data.

We also discuss best practices for managing Bluetooth connections efficiently and dealing with common challenges.

By following our step-by-step instructions and code examples, you’ll gain a solid understanding of the Bluetooth framework in Swift and its various APIs.

Whether you’re building a music streaming app, a home automation solution, or a fitness tracking application, this tutorial will equip you with the knowledge and skills to seamlessly integrate Bluetooth connectivity into your Swift projects.


This is a swift project using the Framework Core Bluetooth.

The goal of the project is communicate with Bluetooth low energy and BR/EDR (“Classic”) Devices.

Overview The Core Bluetooth framework provides the classes needed for your apps to communicate with Bluetooth-equipped low energy (LE) and Basic Rate / Enhanced Data Rate (BR/EDR) wireless technology.

Core Bluetooth central, peripheral
Core Bluetooth central, peripheral

Basic Core Bluetooth connection in Swift Example:

import CoreBluetooth

class BluetoothManager: NSObject, CBCentralManagerDelegate {
    var centralManager: CBCentralManager!
    override init() {
        centralManager = CBCentralManager(delegate: self, queue: nil)
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            // Bluetooth is powered on, start scanning for peripherals
            centralManager.scanForPeripherals(withServices: nil, options: nil)
        } else {
            // Bluetooth is not available or powered off
            print("Bluetooth is not available.")
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral,
                        advertisementData: [String : Any], rssi RSSI: NSNumber) {
        // Peripheral discovered, connect to it
        centralManager.connect(peripheral, options: nil)
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        // Connection established, perform any necessary actions with the peripheral
        print("Connected to peripheral: \( ?? "Unknown")")
        // Discover services and characteristics
        peripheral.delegate = self

extension BluetoothManager: CBPeripheralDelegate {
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        if let services = {
            for service in services {
                // Process discovered services
                print("Discovered service: \(service.uuid)")
                // Discover characteristics for each service
                peripheral.discoverCharacteristics(nil, for: service)
    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        if let characteristics = service.characteristics {
            for characteristic in characteristics {
                // Process discovered characteristics
                print("Discovered characteristic: \(characteristic.uuid)")
                // Perform read/write operations on characteristics if needed
                // peripheral.readValue(for: characteristic)
                // peripheral.writeValue(data, for: characteristic, type: .withResponse)

// Create an instance of BluetoothManager to start the Bluetooth connection
let bluetoothManager = BluetoothManager()

In this example, we create a BluetoothManager class that adopts the CBCentralManagerDelegate protocol to handle central manager events, such as updating state, discovering peripherals, and establishing connections. The CBCentralManager instance is initialized within the class’s init method.

The centralManagerDidUpdateState method is called when the central manager’s state is updated. If the state is .poweredOn, we start scanning for peripherals using scanForPeripherals(withServices:options:).

When a peripheral is discovered, the centralManager(_:didDiscover:advertisementData:rssi:) method is called, and we connect to the discovered peripheral using connect(_:options:).

Once the connection is established (centralManager(_:didConnect:)), we can perform actions with the peripheral. In this example, we print the peripheral’s name and proceed to discover services and characteristics using the discoverServices(_:) and discoverCharacteristics(_:for:) methods, respectively.

The BluetoothManager class also adopts the CBPeripheralDelegate protocol to handle peripheral events. In the peripheral(_:didDiscoverServices:) method, we process discovered services and proceed to discover characteristics for each service in the peripheral(_:didDiscoverCharacteristicsFor:error:) method.


Swift Core Bluetooth

SwiftUI Core Bluetooth

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *