WWDC Quick Look 💓 By SwiftGGTeam
Meet Core Location Monitor

Meet Core Location Monitor

元の動画を見る

ハイライト

Apple は、Swift Actor ベースの位置監視フレームワークである新しい CLMonitor API を WWDC23 で発表しました。開発者は、モニターを作成し、条件を追加し、地理的エリアの出入りとビーコン状態の変化を監視するイベントを待つだけで済みます。スレッドの同期を手動で処理したり、コールバックを委任したりする必要はなくなりました。

主な内容

CLMonitor を使い始めるための 3 つのステップ

(00:31) CLMonitor の中心的な使用法は非常に簡単です。

  1. モニターを作成します。名前として英数字の文字列を渡します。
  2. 条件を追加します: を使用しますadd監視するエリアやビーコンを追加する方法
  3. await イベント: 非同期シーケンスで状態変更イベントを受信します。

(01:33) CLMonitor はトップレベルの Swift Actor です。これは、すべてのアクセスがスレッドセーフであり、ロックやキューを手動で処理する必要がないことを意味します。レコードの作成、追加、削除、クエリ、すべての操作に必要なのはawait

2 つの条件タイプ

03:07

CircularGeographicCondition: 中心座標と半径によって定義される円形の地理的エリア。iOS 16以前と同様CLCircularRegion

BeaconIdentityCondition: UUID、メジャーおよびマイナーによって定義されるビーコン ID 条件。に似ているCLBeaconIdentityConstraint

(04:56) ビーコン条件は 3 レベルのマッチング戦略をサポートしています。

  • UUID のみ: この UUID のすべてのビーコンに一致します
  • UUID + メジャー: 特定のグループ内のすべてのビーコンと一致します
  • UUID + メジャー + マイナー: 単一の特定のビーコンと一致します

この設計により、柔軟な展開が可能になります。同じ UUID がすべてのサイトをカバーし、異なるメジャーによってサイトが区別され、異なるマイナーによってサイト内の特定の場所が区別されます。

イベントと記録

(09:14) 監視された各状態には、次のような対応するレコードがあります。

  • 状態: 監視対象の元の状態
  • lastEvent: ステータス (満足/不満足/不明)、時間、絞り込みを含む最新のイベント

(10:03) 改良は CLMonitor の巧妙な設計です。ワイルドカード (UUID のみを指定) を使用してビーコンをリッスンすると、条件が満たされたときのイベントに絞り込みが含まれ、実際に検出されたメジャー値とマイナー値が通知されます。これにより、「すべてのサイトを聴きながら、どのサイトを正確に把握する」ことが簡単になります。

##詳細

モニターを作成して条件を追加する

01:53

import CoreLocation

// Monitor を作成
let monitor = await CLMonitor("MyLocationMonitor")

// 円形の地理的エリア条件を追加
let workCoordinate = CLLocationCoordinate2D(latitude: 37.3349, longitude: -122.0090)
let workCondition = CLMonitor.CircularGeographicCondition(
    center: workCoordinate,
    radius: 100.0  // メートル
)
await monitor.add(workCondition, identifier: "Work")

// Beacon 条件を追加(UUID のみで、すべてのサイトに一致)
let cafeteriaUUID = UUID(uuidString: "E2C56DB5-DFFB-48D2-B060-D0F5A71096E0")!
let beaconCondition = CLMonitor.BeaconIdentityCondition(uuid: cafeteriaUUID)
await monitor.add(beaconCondition, identifier: "AnyCafeteria")

キーポイント:

  • モニター名は、永続的なログ記録に使用される英数字の文字列です。
  • 同じ名前のモニターがすでに存在する場合、新しいモニターを作成する代わりにそのモニターが開かれます。
  • 同じ名前で同時に開くことができるインスタンスは 1 つだけです

イベントをリッスンする

12:12

// Task 内でイベントを監視
Task {
    for await event in monitor.events {
        switch event.state {
        case .satisfied:
            print("\(event.identifier) - 条件を満たしました")
            
            // refinement がある場合は具体的な情報を取得
            if let refinement = event.refinement {
                print("検出された Beacon: \(refinement)")
            }
            
        case .unsatisfied:
            print("\(event.identifier) - 条件を満たしていません")
            
        case .unknown:
            print("\(event.identifier) - 状態は不明です")
        }
        
        // 完全なレコードを取得
        if let record = await monitor.record(for: event.identifier) {
            print("最後のイベント時刻: \(record.lastEvent.date)")
        }
    }
}

キーポイント:

  • monitor.eventsこれは非同期シーケンスであり、ステータスが変化すると自動的に回復します。
  • イベントには識別子、状態、日付、絞り込みが含まれます
  • 新しいイベントはステータスが変化した場合にのみ受信されます

レコードのクエリ

11:09

// 単一レコードを取得
if let record = await monitor.record(for: "Work") {
    let condition = record.condition
    let lastEvent = record.lastEvent
    print("状態: \(lastEvent.state), 時刻: \(lastEvent.date)")
}

// すべてのレコードを走査
for identifier in await monitor.identifiers {
    if let record = await monitor.record(for: identifier) {
        print("\(identifier): \(record.lastEvent.state)")
    }
}

キーポイント:

  • monitor.identifiers追加されたすべての条件の識別子のリストを返します。
  • レコードと状態は永続的であり、アプリケーションの再起動後も持続します。
  • 識別子リストを自分で管理する必要はありません

初期状態の設定

(08:33) 条件を追加するときに初期状態を指定できます。

// アプリがユーザーは作業エリア内にいないと判断済みだと仮定
await monitor.add(
    workCondition,
    identifier: "Work",
    assuming: .unsatisfied
)

仮定が間違っている場合、コアの位置は真の状態を判断した後に正しい値を返します。このパラメータは主に、初期状態が決定されるまでの遅延を短縮するために使用されます。

条件を削除

await monitor.remove("Work")

条件を削除すると、対応するレコードも削除されます。

重要ポイント

  1. 古いエリア監視コードを置き換えます
  • 対処方法: 既存のものを使用しますCLCircularRegionそしてCLBeaconRegionコードを CLMonitor に移行する
  • 実行する価値がある理由: CLMonitor は Swift Actor と非同期シーケンスに基づいており、コードはよりシンプルでスレッドセーフであり、デリゲート コールバックやスレッド同期を処理する必要がなくなりました。
  • 開始方法: CLMonitor インスタンスを作成し、既存のインスタンスを変換します。startMonitoring(for:)呼び出しは次のように置き換えられます。monitor.add()、意思locationManager(_:didEnterRegion:)デリゲート メソッドは次のように置き換えられます。for await event in monitor.events
  1. 位置情報をトリガーとするスマートなワークフローを構築
  • 何をすべきか: CLMonitor の Beacon 3 レベル マッチング機能を使用して、位置ベースの自動ワークフローを構築します。
  • 実行する価値がある理由: UUID/メジャー/マイナーの柔軟なマッチングにより、同じ Beacon 展開で「任意のオフィスに入る」、「特定のオフィスに入る」、「オフィスの特定のエリアに入る」の 3 つの粒度をサポートできます。
  • 開始方法: 統一された UUID を使用してビーコンをデプロイします。異なるオフィスでは異なるメジャーが使用され、オフィス内の異なるエリアでは異なるマイナーが使用されます。アプリケーションで対応する粒度の CLMonitor 条件を作成します。
  1. 永続的な位置状態管理を実現
  • 対処方法: CLMonitor の永続記録機能を使用して、アプリケーションの再起動後に位置ステータスを復元します。
  • 実行する価値がある理由: レコードとステータスは自動的に永続化され、アプリケーションはシステムによって終了された後に再起動されたときに最後の状態から継続できます。
  • 開始方法:didFinishLaunchingWithOptions同じ名前でモニターを再初期化し、ただちにイベントを待って監視を再開し、レコードをクエリして最後の既知のステータスを取得します。
  1. SwiftUI と組み合わせてリアルタイムの位置情報 UI を構築
  • やるべきこと: CLMonitor と SwiftUI を組み合わせて、位置ステータスをリアルタイムに反映するインターフェイスを構築します
  • 実行する価値がある理由: 非同期シーケンスは当然ながら SwiftUI に適しています.task位置状態駆動型 UI を簡潔に実装するための修飾子
  • 開始方法: ViewModel のビュー内に CLMonitor を作成します。.taskイベントリスニングを開始するには、次を使用します@Publishedプロパティ主導の UI 更新

関連セッション

コメント

GitHub Issues · utterances