ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
watchOSにおけるBluetoothデバイスからのタイムリーなアラートの取得
関連度の高いアラートを、BluetoothデバイスからApple Watchにタイムリーに送信する仕組みをご確認ください。コンプリケーションで周期的なデータを活用する方法をはじめ、バックグラウンドでのBluetooth端末の検出、watchOSでのCharacteristicモニタリングの使用方法について解説します。また、優れたBluetoothアクセサリを作成するベストプラクティスや設計に関するガイダンスも紹介します。
リソース
関連ビデオ
WWDC21
-
ダウンロード
(音楽)
こんにちは Yannです Core Bluetoothエンジニアです 今日は Bluetoothデバイスから Apple Watchへの タイムリーなアラートのお話です
まずwatchOS Appが バックグラウンドにある時の コンプリケーションの アップデートについて
そしてタイムリーなアラートの watchOS Appでの検知について
またwatchOS 9における 新しいBluetooth端末の 発見方法について
最後にBluetooth アクセサリの最適な デザイン方法をお話しします
まず最初のトピックは コンプリケーションの アップデートについてです 昨年 Background App Refreshにおける コンプリケーションの アップデートの方法を ご紹介しました
今 ご覧いただいている 気温の表示のように 定期的に更新される データに最適です
昨年 バックグラウンドでの 定期的な更新のために Background App Refreshの 使用を可能にしました Background App Refreshが 行われる度 みなさんのAppが Bluetooth端末に接続し データを受信した後 接続を切ります この詳細に関しては 昨年のビデオを ご確認ください
でもユーザーにとって 時間に依存した出来事が 起こった場合はどうでしょう?
watchOS 9では Bluetooth端末からのアラートを バックグラウンドで検知でき その方法についてご紹介します
これがその流れです Appの稼働中に デバイスに接続し 特徴をモニターします
Appの使用が止まると Core Bluetoothが デバイスとの接続を維持し 特徴をモニターし続けます
その特徴の数値に 変化があれば Appに処理のための ランタイムが与えられます ローカル通知や ネットワークリクエストが例です これによりユーザーに 時間に依存した情報を 提供できます
例えば調理用の温度計を 見てみましょう 一定温度でオーブンから 料理を取り出すため アラートを設定できます
設定温度に 近づくにつれ 温度計が特徴としての数値を変え まもなく料理ができると Appがローカル通知を送ります
そして料理ができれば それを表す通知が来ます
もし温度が上昇し続ければ 最後の通知が来ます
ではまずBackgroundモードの 設定方法です
WatchのUIBackgroundModesに bluetooth-centralを足し
Xcodeでは Required background modesです ここにApp communicates using CoreBluetoothを追加
これらのInfo.plistのエントリは セントラルとしての background executionの場合 iOSのものと同じです
Watch Appのinfo.plistは 手作業で編集し iOSでのSigning capabilities とは別物になります
コードを見てみます すでに接続済みとし GATT serviceを見つけ GATT characteristicを 発見しました didDiscoverCharacteristicFor コールバックが呼ばれます
コールバック内で 数値変化の度に 通知を受けるか決められます
これ自体は watchOS 8のAPIと同じですが 違いはAppがバックグラウンド でも動作することです
そしてdidUpdateValueForで 数値の変化に対応するため デリゲートメソッドを 実装します
数値が変わればここで ローカル通知を送信したり ネットワークリクエストなどの 処理を行えます このメソッドはフォアグラウンドでも バックグラウンドでもコールされるので 正しいアクションを いずれのケースでもセットしてください
さらなる考慮が必要な 以下のような場合もあります
まずBluetooth接続に ついてです デバイスが圏外に出ると タイムアウト後 切断されます
この場合 Appは一時 バックグラウンドランタイムで connectPeripheralを呼び 再接続を試みます iOSの場合と同じです デバイスが圏内に戻れば Core Bluetoothが再接続します
では制限について 話しましょう これらの制限は バッテリーライフの維持に 非常に重要です
デバイスがBluetooth圏内 ギリギリにあり バックグラウンドBLE接続の 最中に何度も切断されると 再接続の範囲が縮小されます つまり再接続できるのは 近くのデバイスのみです
この制限は 24時間枠で計算され ユーザーがAppを使えば リセットされます
もう一つの制限は タイムリーな通知における バックグラウンドランタイムです
よってユーザーにとって 重要である数値変化のみを モニターするようにしてください 定期的なデータが必要であれば Background App Refresh によって行います
Appがその制限を 超えそうになると LeGattNearBackground NotificationLimitがポストされるため Appでそのエラーをモニターし ユーザーのインタラクションが ないことを把握する必要があります
このアラートが重要なら ネットワークリクエストや Bluetooth端末のUIを変更するなど ユーザーへの コミュニケーションに関して 別の方法を模索するべきです
制限を越えれば 別の通知がポストされます LeGattExceededBackground NotificationLimitです
Appがバックグラウンドランタイムを 得ることができなくなり バックグラウンド接続のない watchOS 8の挙動に 戻ることになります
これらの2つの通知は GATT Notification Updateの errorフィールドに掲示されます バックグラウンド BLE接続においては 制限に達したかについて カウントダウンではなく エラーの活用をお勧めします
watchOS 9ではバックグラウンド ランタイムの制限は5です これらはユーザーがAppを 使用するとリセットされます またユーザーがAppを 使用しなかった場合 制限に達した24時間後に リセットされます これはBluetooth バックグラウンドLE接続のみです もし文字盤に コンプリケーションがある場合 Background App Refreshは この制限に関わらず継続されます
処理のための時間は 限られており 複雑な処理のための時間は ありませんが ユーザーへの通知には 十分な時間です 最後にバックグラウンドでの タイムリーなアラートの検知には Apple Watch Series 6 以降のみが対応します バックグラウンドでできるのは アラート検知だけではありません watchOS 9ではバックグラウンドでも Bluetooth端末を発見できます
Bluetooth搭載の 医療機器があり watchOS Appがタイムリーな アラートを検知したとします 電源節約のため 深刻な状態を感知するまで Bluetooth端末は アドバタイズしません
つまりApple Watchとは まだ接続されていません watchOS Appが 医療機器からのUUIDを スキャンします
医療機器が 深刻な状態を感知すると アドバタイズを始めます Apple WatchはこのBluetooth端末を見つけ バックグラウンドでAppを起動
そしてAppが ユーザーにそれを伝えます
仕組みはこうです Watch Appが Bluetooth端末のスキャンを始め Core Bluetoothがバックグラウンドで スキャンし続けます
デバイスのアドバタイズを 検知すれば バックグラウンドランタイムが 与えられ接続が開始されます
それではコードを 見てみましょう APIはwatchOS 8から 変わっていませんが Appがバックグラウンドでも スキャンが行われます
対象のサービスのUUIDで scanForPeripheralsを コールします Appがフォアグラウンドでも バックグラウンドでも 実行することができます allowDuplicatesKeyの オプションを選択すれば Appがフォアグラウンドの時のみ 実行するようにできます ただし制限があります
Appの稼働時間外での バックグラウンドランタイムの 回数です この制限は 先ほどのGATT特徴変化の バックグラウンドランタイムと 結合されます またバックグラウンドでの Bluetooth端末のスキャンは Apple Watch Series 6 以降が必要です
まとめるとApple Watchが バックグラウンドでスキャンする際 Bluetooth service UUIDを 限られた回数スキャンできます
ではこの特徴を活かした アクセサリの デザインについてです
Bluetoothアクセサリは トレードオフを 考えねばなりません
電力消費が重要なら デバイスが待機状態になり アラートが生じた時のみ 関連情報を告知する トポロジーを選択します トレードオフはアラートがある度 Bluetoothの発見時間に 少し遅延が生じますが 電力消費を抑えられます
医療機器などに提供される トポロジーです
その一方で アラートの待ち時間が 短時間な上 電力消費が重要でないなら バックグラウンドLE接続を 使用することで GATTでアラートを 送るべきです Bluetoothの接続は Appにつき2つです
これは温度センサーの 例で見たトポロジーです
ユーザーがアラートで 最高の経験を得るには 時間の緊急性を フィルターするため デバイスに処理能力と 知識を足すべきです
温度計の例で言うと すべての温度を送信せず 必要最低限の情報や 温度変化を送るのです このアプローチを使うと 定期情報から重要情報を 取り出すことで デバイスも Apple Watchユーザーも 電力を節約し いい体験となります
デバイスの接続が切れた時は 再接続のアドバタイズを お勧めします これはBluetoothデバイスの 再接続の速さや 電池の残量など 必要条件次第で アドバタイズ間隔が変わります アクセサリガイドラインに いくらかの参考値があります 例えば 電池の消費量が 限られるデバイスなら 1022.5ミリ秒の数値を 使用します
またアドバタイズレートが 20ミリ秒なら 理想的状況下で 1秒以内の発見が可能です
また重要な状況のみ それが可能になるよう デザインすることもできます
では接続間隔についてです バックグラウンドでデバイスが 接続し続けられるトポロジーを選ぶなら 長い接続間隔を お勧めします 最低150ミリ秒が必要です これにより デバイスの節電と 最高のユーザー体験が 提供できます
Bluetooth 5.3が Apple Watchに採用されます これにより デバイスが待機中は 接続間隔を増加し 短レイテンシが必要な時は 接続間隔を短縮できます
OSによる違いは ご覧の通りです Bluetooth Low Energyで サポートされている構造です 昨年 watchOSに Background App Refreshが Background Execution Mode として登場しました 今年はSeries 6以降であれば タイムリーなアラートで 向上されます
ありがとうございました
(音楽)
-
-
3:41 - Listen for alerts
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { peripheral.setNotifyValue(true, for: characteristic) } func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { if let newData = characteristic.value { // Post a local notification. } }
-
9:15 - Discover peripherals
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { central.scanForPeripherals(withServices: [myCustomUUID]) }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。