【Swift UI】Core Bluetoothでペリフェラルと再接続する方法!retrievePeripherals

この記事からわかること

  • Swift UICore BluetoothBluetooth接続アプリ実装方法
  • セントラルからペリフェラル再接続するには
  • retrievePeripheralsメソッドの使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式リファレンス:Core Bluetooth

セントラルからペリフェラルと再接続する方法

この実装は既に接続した履歴がある状態で現在接続されていない場合に再接続する方法です。切断後にアプリを停止させたりすると再接続できないようなのであくまでアプリ起動中に明示的に切断された場合などに使用する感じになります。

またこの記事は以下の記事で実装した続きです。

セントラルからペリフェラルと再接続するには以下のステップで実装していきます。

  1. 接続時にペリフェラルのUUIDをローカルに保存
  2. スキャン実行前にローカルにUUIDがあるかつ初回接続でないか識別
  3. セントラル内の接続履歴(UUID)を取得
  4. マッチするペリフェラルを取得しconnectメソッドを実行

接続時にペリフェラルのUUIDをローカルに保存

まずは初回接続時にペリフェラルのUUIDをローカルに保存しておきます。ペリフェラルのUUIDはUUID型でありCBUUID型ではないので注意してください。これはペリフェラルの個体を一意に識別するためのものではなく、セントラル側から繋いだペリフェラルを識別するためのものです。つまり別のデバイスから同一ペリフェラルに接続してもこのUUIDは異なります。

// ④:ペリフェラルの接続結果を取得:成功
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    log.append("接続成功\n")
    // ⑤:サービス/キャラクタリスティックの取得
    peripheral.delegate = self
    
    // 接続したペリフェラルのUUIDをローカルに保存
    let uuidStr = peripheral.identifier.uuidString
    userDefaults.set(uuidStr, forKey: userDefaultsKey)
    
    // サービスの探索開始
    let services = [serviceUUID]
    peripheral.discoverServices(services) // nilを渡すことも可能だが電池消費が激しい
}

スキャン実行前にローカルにUUIDがあるかつ初回接続でないか識別

UUIDの保存ができたのでスキャン実行前に、connectPeripheral(接続後にペリフェラルを保持するプロパティ)がnilでないか、ローカルの中にUUIDが保存されているかを識別します。

// ②:スキャンの実装
public func startScan() {
    if centralManager.state == .poweredOn {
        // 接続したことがあるかどうか
        if connectPeripheral != nil {
            if let uuidStr = userDefaults.string(forKey: userDefaultsKey) {
                if let uuid = UUID(uuidString: uuidStr) {
                    // 次の実装
                }
            }
        }
        log.append("スキャン開始\n")
        centralManager.scanForPeripherals(withServices: nil, options: nil)
    }
}

セントラル内の接続履歴(UUID)を取得/マッチするペリフェラルを取得しconnectメソッドを実行

セントラル内の接続履歴(UUID)を取得するにはretrievePeripheralsメソッドを実行します。この中からUUIDがマッチするペリフェラルを取得できるのでconnectメソッドを実行すれば再接続が可能になります。

if let uuid = UUID(uuidString: uuidStr) {
    let peripherals = centralManager.retrievePeripherals(withIdentifiers: [uuid])
    if peripherals.count != 0 {
        // 再接続
        log.append("接続済みのペリフェラルに再接続\n")
        centralManager.connect(peripherals.first!)
        return
    }
}

また全体のコードはGitHubに掲載しています。

おすすめ参考書:iOS×BLE Core Bluetoothプログラミング

iOSアプリでBLEを使用した機能を実装したいなら一度は読んでおくことをおすすめする参考書です。iOSでのCore Bluetoothを使用した実装だけでなく、Bluetoothに関する細かい知識やノウハウも詰まっているので網羅的に理解したい方にはバッチリだと思います。

少し古い参考書であり、Objective-CとSwift両方のコードで実装方法が記述されています。Swift UIでの実装方法は載っていませんが、基本的なコードは昔からあまり変わっていないのでつまづくところはなく実装できると思います。

BLEを食材や店員などに例えて解説してくれるので素人でもBLEの概念がつかみやすく記述されています。約500ページくらいあるのでボリュームがすごいですが、ここから得られる知識は数知れませんでした。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index