【Swift UI】Core Bluetoothでペリフェラルと再接続する方法!retrievePeripherals
この記事からわかること
- Swift UIでCore BluetoothでBluetooth接続アプリの実装方法
- セントラルからペリフェラルと再接続するには
- retrievePeripheralsメソッドの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
セントラルからペリフェラルと再接続する方法
この実装は既に接続した履歴がある状態で現在接続されていない場合に再接続する方法です。切断後にアプリを停止させたりすると再接続できないようなのであくまでアプリ起動中に明示的に切断された場合などに使用する感じになります。
またこの記事は以下の記事で実装した続きです。
セントラルからペリフェラルと再接続するには以下のステップで実装していきます。
- 接続時にペリフェラルのUUIDをローカルに保存
- スキャン実行前にローカルにUUIDがあるかつ初回接続でないか識別
- セントラル内の接続履歴(UUID)を取得
- マッチするペリフェラルを取得し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ページくらいあるのでボリュームがすごいですが、ここから得られる知識は数知れませんでした。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。