View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC22に戻る

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • トランスクリプト
  • コード
  • watchOSにおけるBluetoothデバイスからのタイムリーなアラートの取得

    関連度の高いアラートを、BluetoothデバイスからApple Watchにタイムリーに送信する仕組みをご確認ください。コンプリケーションで周期的なデータを活用する方法をはじめ、バックグラウンドでのBluetooth端末の検出、watchOSでのCharacteristicモニタリングの使用方法について解説します。また、優れたBluetoothアクセサリを作成するベストプラクティスや設計に関するガイダンスも紹介します。

    リソース

    • Accessory Design Guidelines
    • Core Bluetooth
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC21

    • BluetoothデバイスのApple Watchへの接続
  • このビデオを検索

    (音楽)

    こんにちは 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])
      }

Developer Footer

  • ビデオ
  • WWDC22
  • watchOSにおけるBluetoothデバイスからのタイムリーなアラートの取得
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン