🙄

SwiftでBluetoothデバイスを管理する方法

2024/05/13に公開

はじめに

この記事では、Swiftを使用してiOSデバイスからBluetoothデバイスを検出し、接続する方法を詳しく説明します。Core Bluetoothフレームワークを利用して、Bluetoothデバイスとの通信を管理するクラスBluetoothManagerの実装例を紹介します。

BluetoothManagerクラスの概要

BluetoothManagerクラスは、CBCentralManagerDelegateCBPeripheralDelegateプロトコルを採用して、Bluetoothデバイスの検出から接続までの一連のプロセスを管理します。主な機能は以下の通りです。

  • Bluetoothの状態の監視
  • デバイスのスキャン
  • デバイスの発見と接続
  • サービスと特性の探索

Info.plistの設定

Bluetoothを使用するiOSアプリケーションでは、Info.plistにいくつかの設定を追加する必要があります。これはアプリがユーザーのデバイスのBluetooth機能にアクセスするための許可を得るために必須です。

<key>NSBluetoothAlwaysUsage  Description</key>
<string>このアプリはあなたのBluetoothデバイスに接続して音楽を再生するためにBluetoothを使用します。</string>

初期化と状態の監視

クラスはCBCentralManagerのインスタンスを生成し、Bluetoothの状態が更新されたときにスキャンを開始します。

override init() {
    super.init()
    centralManager = CBCentralManager(delegate: self, queue: nil)
}

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    if central.state == .poweredOn {
        scanForDevices()
    } else {
        print("Bluetooth is not available.")
    }
}

デバイスのスキャンと発見

Bluetoothが有効になると、デバイスのスキャンが開始されます。デバイスを発見すると、コンソールにデバイス名とRSSI値が表示されます。

func scanForDevices() {
    centralManager.scanForPeripherals(withServices: nil, options: nil)
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    print("Discovered \(peripheral.name ?? "unknown device") at \(RSSI)")
    onDeviceDiscovered?(peripheral)
}

デバイスへの接続

特定のデバイス(例えば "WH-1000XM5")を発見した場合、スキャンを停止してそのデバイスに接続を試みます。

if let name = peripheral.name, name.contains("WH-1000XM5") {
    centralManager.stopScan()
    peripheralToConnect = peripheral
    centralManager.connect(peripheral, options: nil)
}

まとめ

このクラスを利用することで、Swiftアプリケーション内でBluetoothデバイスのスキャン、接続、およびサービスの探索を簡単に実装できます。

サンプルコードを下記に載せましたので参考にしてください
https://github.com/entaku0818/AudioMaster/blob/main/AudioMasterApp/AudioMasterApp/AudioMasterApp/AVF/BluetoothManager.swift

Discussion