WWDC Quick Look 💓 By SwiftGGTeam
Meet Core Location for spatial computing

Meet Core Location for spatial computing

元の動画を見る

ハイライト

Core Location は、visionOS 上の iOS と同じ権限モデルと API を使用しますが、「使用中」の定義は、前景の状態ではなくユーザーの視線方向に基づいています。ヘッドセットを単独で使用した場合の測位精度は約 100 メートルで、近くに iPhone があれば携帯電話レベルまで精度を向上させることができます。ウィンドウ アプリケーションは、ユーザーが目を離した後、短い猶予期間内に位置情報の更新の受信を停止します。

主な内容

権限モデル: よく知られていますが、再理解する必要があります

(00:50)visionOS での位置情報のアクセス許可のリクエストは、iOS の場合とまったく同じです。作成するCLLocationManager、 電話requestWhenInUseAuthorization()、Info.plistに設定します。NSLocationWhenInUseUsageDescription説明文字列。

(02:14) ユーザーに表示される認証ポップアップ ウィンドウも iOS に似ています。1 回だけ許可するか、使用中に許可または拒否するかを選択でき、正確な位置または曖昧な位置も選択できます。ただし、ここでの「使用時に許可」は、空間コンピューティング プラットフォームではまったく異なる意味を持ちます。

(02:52) 重要な原則: ターゲティングが本当に必要なコンテキストでのみ権限をリクエストしてください。起動時に許可を要求すると、ユーザーが許可される可能性が低くなり、プライバシー設計原則にも違反します。

位置決め精度: 機器の組み合わせによって精度が決まります

(04:04)visionOS デバイスは、単独で使用した場合の測位精度が約 100 メートルで、Mac に匹敵します。近くのレストランや公園などを探すにはこれで十分です。

(04:24) しかし、ユーザーの iPhone が近くにある場合、2 つのデバイス間の連携接続により、位置精度が iPhone レベルまで向上します。これは、アプリケーションが現在の精度に基づいて動作を適応させる必要があることを意味します。100 メートルの精度で正確なナビゲーションを実行することに意味はありません。

「使用中」の新しい定義

(05:02) これがセッションの中核となる内容です。iPhone では、「使用中」は「フォアグラウンドのアプリ」に相当します。しかし、visionOS では概念がまったく異なります。

(05:33) 完全没入型アプリケーションの場合、ユーザーがアプリケーションを実行している限り、そのアプリケーションは「使用中」とみなされ、位置情報の更新を取得できます。

(05:56) ウィンドウ アプリケーションの場合、Core Location は、ユーザーがアプリケーションを「最近見た」場合にのみ、アプリケーションが「使用中」であるとみなします。ユーザーが目をそらすと、アプリは短い猶予期間 (数秒) の後に位置情報の更新の受信を停止します。

(06:17) 具体的なシナリオ:

  • ユーザーはどのアプリも操作していません。どちらのアプリも位置情報の更新を受け取りません
  • ユーザーは左側のアプリケーションに注目します。左側のアプリケーションは位置情報の更新を取得できますが、右側のアプリケーションは取得できません。
  • ユーザーは 2 つのウィンドウを一緒に移動し、同時に表示します。両方のアプリが位置情報の更新を取得できます。
  • ユーザーの視線が左右のアプリ間で切り替わります。両方のアプリは短い猶予期間中に更新を取得できます。

(07:33) アプリケーションは、実行されていないときは位置情報の更新を受信せず、監視 API (エリア監視など) からの更新も配信されません。これは iOS のバックグラウンド動作とは根本的に異なります。

互換モードでの動作

(07:54) iPhone または iPad アプリがvisionOS (互換モード) 上で直接実行される場合は、次の変更点に注意する必要があります。

  • Always 認証のリクエストは WhenInUse 認証にリダイレクトされます -常にオプションは設定に表示されません
  • 地域モニター (CLMonitor/CLCircularRegion) はイベントを受信しません
  • バックグラウンドでの位置情報の更新は利用できません

iOS アプリが特定の API が常に利用可能であると想定している場合、visionOS で予期しない動作が発生する可能性があります。公開する前に、互換モードでパフォーマンスをテストすることをお勧めします。

##詳細

位置情報の更新をリクエストするコード

00:54)使用CLLocationUpdateリアルタイムの位置情報の更新を取得します。

import CoreLocation

actor LocationActor {
    func startUpdates() async {
        // 请求权限
        let manager = CLLocationManager()
        manager.requestWhenInUseAuthorization()
        
        // 获取实时位置更新
        for await update in CLLocationUpdate.liveUpdates() {
            if let location = update.location {
                print("Latitude: \(location.coordinate.latitude)")
                print("Longitude: \(location.coordinate.longitude)")
                print("Accuracy: \(location.horizontalAccuracy) meters")
            }
        }
    }
}

キーポイント:

  • CLLocationUpdate.liveUpdates()Swift 同時実行パターンに準拠した非同期シーケンスを返します。
  • Info.plistで設定する必要がありますNSLocationWhenInUseUsageDescription
  • 診るhorizontalAccuracy現在の精度が要件を満たしているかどうかを判断するには

精度に基づいてアプリケーションの動作を調整する

func handleLocationUpdate(_ location: CLLocation) {
    let accuracy = location.horizontalAccuracy
    
    if accuracy <= 10 {
        // iPhone 级别精度,可以做精确导航
        showDetailedNavigation()
    } else if accuracy <= 100 {
        // 头显单独使用时的精度
        showNearbyPlaces()
    } else {
        // 精度较低,只显示大致区域
        showGeneralArea()
    }
}

視覚を意識したウィンドウ アプリケーションの設計

(06:17) ウィンドウ アプリケーションは、見通し線主導の位置更新モードに適応する必要があります。

import SwiftUI
import CoreLocation

struct LocationView: View {
    @StateObject private var locationModel = LocationModel()
    
    var body: some View {
        VStack {
            if let location = locationModel.lastLocation {
                Text("Current: \(location.coordinate.latitude), \(location.coordinate.longitude)")
                Text("Accuracy: ±\(Int(location.horizontalAccuracy))m")
                    .foregroundColor(accuracyColor(location.horizontalAccuracy))
            } else {
                Text("Looking away - location updates paused")
                    .foregroundColor(.secondary)
            }
        }
        .task {
            await locationModel.startMonitoring()
        }
    }
    
    func accuracyColor(_ accuracy: CLLocationAccuracy) -> Color {
        if accuracy <= 10 { return .green }
        if accuracy <= 100 { return .yellow }
        return .orange
    }
}

@MainActor
class LocationModel: ObservableObject {
    @Published var lastLocation: CLLocation?
    
    func startMonitoring() async {
        let manager = CLLocationManager()
        manager.requestWhenInUseAuthorization()
        
        for await update in CLLocationUpdate.liveUpdates() {
            if let location = update.location {
                self.lastLocation = location
            }
        }
    }
}

キーポイント:

  • 使用.taskビューが表示されると、モディファイアは位置のリスニングを開始します
  • ユーザーが目を離すと、更新は一時停止され、UI には適切なステータスが表示されます。
  • @MainActorUI の更新がメインスレッドで実行されるようにする

重要ポイント

  1. 視覚を意識した位置決めエクスペリエンスを設計する
  • 内容: 見通し線による位置更新に適応し、測位のアクティブ ステータスを明確に表示する、visionOS ウィンドウ アプリケーション用の UI を設計します。
  • 実行する価値がある理由: ユーザーが目を離すと位置情報の更新が一時停止されます。混乱を避けるために、UI はユーザーにこの動作を理解させる必要があります。
  • 開始方法: を使用して、位置ステータス インジケーターをビューに追加します。.task位置情報の更新のライフサイクルを管理し、更新が一時停止されているときの UI 状態を処理します。
  1. 精度に基づく動的調整機能
  • 何をすべきか: に基づいていますhorizontalAccuracyの値は、アプリケーションによって提供される機能の粒度を動的に調整します。
  • 実行する価値がある理由: ヘッドセットを単独で使用した場合の 100 メートルの精度と、iPhone と併用した場合のメートルレベルの精度との間には大きな違いがあります。同じ UI でも、2 つの精度ではまったく異なるエクスペリエンスが得られます。
  • 開始方法: 位置情報の更新を取得するときに精度値を確認し、さまざまな精度範囲に応じてさまざまな機能レベルと UI パフォーマンスを設計します。
  1. 互換モードでの位置情報の動作をテストします
  • やるべきこと:visionOS エミュレータとデバイスの互換モードで既存の iOS アプリの位置関連機能をテストします。
  • 実行する価値がある理由: 認証は常にダウングレードされ、地域監視は機能せず、バックグラウンド更新は利用できません。これらの変更により、既存のアプリケーションが異常な動作をする可能性があります。
  • 開始方法: Xcode でvisionOS シミュレーターを選択して、既存の iOS アプリを実行し、位置リクエスト、ゾーン リスニング、およびバックグラウンド動作をテストします。
  1. デバイスのコラボレーションを使用して測位エクスペリエンスを向上させる
  • やるべきこと: iPhone が近くにある高精度のシナリオと、ヘッドセットが単独で使用される低精度のシナリオを考慮した機能の設計
  • 実行する価値がある理由: どちらのシナリオも実際のユーザーが遭遇するものであり、アプリケーションは両方の状況で適切なエクスペリエンスを提供する必要があります。
  • 開始方法: 低精度シナリオ向けの劣化ソリューションを設計しながら、より正確な位置決めのために iPhone を近くに置くように UI でユーザーに促します。

関連セッション

コメント

GitHub Issues · utterances