ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
位置情報の更新の合理化
Core Locationで未来に旅立ちましょう!最新のSwiftの並行処理のために設計されたCLLocationUpdateクラスを紹介し、これがどのように位置情報の更新の取得を簡素化するかを学びます。このクラスがフォアグラウンドまたはバックグラウンドで実行されるときに、あなたのアプリでどのように動作するか説明し、いくつかのベストプラクティスを共有します。
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪
皆さん こんにちは CoreLocationのエンジニアの Sirajです このセッションでは 位置情報を取得する 新しいCoreLocation APIについて お話しします 始めましょう
位置情報の取得は この1行のコードを書くだけです なんて素晴らしいのでしょう これは新しいSwiftネイティブAPIで 最新のswift並行処理をすぐにサポートし 位置情報の更新を取得します 詳しく見ていきましょう まず 新しいCLLocationUpdate APIの 構造を詳しく説明します 続いて このAPIで位置情報の 更新を取得する方法を説明します それから バックグラウンドで 位置情報の更新を取得するために 必要なことを説明します 続いて 更新を自動的に一時停止したり 再開したりする方法を説明します 最後に このAPIで アップデートを取得する際の アプリのライフサイクルについて説明します CLocationUpdate APIの構造を 見ていきましょう 新しいCLLocationUpdate クラスを導入しています このクラスはUpdatesと呼ばれる AsyncSequenceを返す― 静的関数liveUpdatesを持っています これは for/try/awaitを使用して 直接反復することができ CLLocationUpdate型の要素や Location型の位置情報 および自動 一時停止 そして再開を管理するための ブール値のフラグisStationaryを含みます liveUpdatesは LiveConfiguration列挙型の オプションの引数も消費します では コードを進めてこの新しいAPIで アップデートを取得する方法を 見ていきましょう フォアグラウンドから位置情報の更新を 開始する基本的なアプリを作ります まずCoreLocationをインポートします そして CLLocationUpdateクラスが 提供する静的ファクトリー関数 liveUpdatesを呼び出して Updates AsyncSequenceを 取得します これを直接 for/try/awaitを使って繰り返し クロージャ内の CLLocationUpdateを取得します そして その位置情報プロパティに アクセスして位置情報を取得します さて この時点で更新が始まりました では 更新を停止する場合は? 停止させるにはforループを抜けるだけです isStationaryを覚えていますか? isStationaryがtrueと報告されたら forループから抜け出し 自動的に更新を停止しましょう 明示的な開始と停止のメッセージは もう必要ありません CLLocationUpdate APIが返す AsyncSequenceを確認します 要素の検索 選択および除外など AsyncSequence上でできる 強力なことはすべて この更新シーケンスでも実行できます この例ではAsyncSequence上で 最初のフィルタを 直接使用する方法を説明します フードの下では更新が開始され 各要素の位置に対して 速度が確認されます 速度が200以上の更新が見つかるとすぐに その最初の要素が返されて処理が完了します 最初のマッチが見つかると アップデートは自動的に停止します ここで速度にお気づきでしょうか? これは秒速200メートルで 時速に換算するとおよそ447マイルです 速すぎると思いませんか? 一致するものが見つかるまで 実行が止まってしまうので これらのフィルターを使うときは 注意が必要です horizontalAccuracyに基づく場所の フィルタリングに使用する場合は さらに注意が必要です さて これは前のスライドにあった更新を 取得するためのサンプルコードで liveUpdatesには 何も設定を指定していません つまり デフォルトの設定で 自動的に構成されます しかし liveUpdates APIは 明示的な設定を取ることができます この構成はこのAPIの 一部として導入する新しい列挙型です 列挙型のメンバーと その用途を見てみましょう LiveConfiguration列挙型は アプリがアップデートを開始するために 選択できる ベイク済みの 構成のコレクションです メンバーとして default automotiveNavigation otherNavigation fitness airborneがあります アプリがすでに既存の位置情報更新APIで 特定のCLActivityTypeを 使用しているなら 新しいAPIを採用しながら 同じ位置情報エクスペリエンスを持つために 対応するLiveConfiguration メンバーを選択することができます 特定のactivityTypeの 必要性がない場合は デフォルトの構成で更新を開始するか 構成をまったく指定しないことができます 「updates」AsyncSequenceが もたらすことは? これを繰り返し実行すると CLLocationUpdate型の オブジェクトが得られます このオブジェクトにはCLLocation型の オプション型のlocationが含まれます locationがない場合は locationをnilとして更新を行います また このオブジェクトには isStationaryという ブール値のプロパティがあり位置情報の 更新の自動的な一時停止/再開を管理します フォアグラウンドからアップデートを 取得する方法について説明しました 次に アプリの バックグラウンドでの動作中に 更新を取得する方法を説明します バックグラウンドでの位置情報更新を有効に するにはライブアクティビティが最適です ライブアクティビティが アクティブである限り アプリはほかの追加設定なしに アップデートを受け取ることができます アプリがまだライブアクティビティを 持っていなくても心配しないでください 新しいAPIを採用する際の 障害にはなりません CLBackgroundActivitySessionを 代わりに使用することができます どのように機能するか見ていきます すでにご存知の方も多いかもしれませんが 青色のバックグラウンドの 位置インジケータは 使用中のみ許可として認証されたアプリが バックグラウンドで アップデートを取得する際に表示されます CLBackgroundActivitySessionは 同じインジケータを使って アプリにバックグラウンドの 位置情報機能を提供します これはバックグラウンドで使用する 位置情報サービスに関する可視性を ユーザーに提供することで実現します また 可視性が維持されるため バックグラウンドからでも位置情報に アクセスできるようになります バックグラウンドからでも 位置情報にアクセスできるようになります CLBackgroundActivitySessionは アプリの認証全体をサポートします よってアプリがバックグラウンドで 更新を受け取るだけでなく CLMonitorを使ってイベントを 監視することも可能になります BackgroundActivitySessionは 更新の開始に依拠しません セッションを作成するだけで アプリがバックグラウンドの時に インジケータを表示し 必要に応じて 更新やイベントを受け取ります CLBackgroundActivitySessionを 使用するには インスタンス化して保持する必要があります ホールドの部分には注意してください オブジェクトのデアロケーションによって セッションが自動的に無効になり アプリがバックグラウンドで位置情報へ アクセスできなくなる可能性があるからです BackgroundActivitySessionが 効果的に動作するためには アプリのUIBackgroundModes配列に locationが残っている必要があります 未処理のセッションがない場合は フォアグラウンドから新しいセッションを を開始する必要がありますが バックグラウンドから既存のセッションに 再参加することならできます 簡単なコードで説明しながら backgroundActivitySessionの 使い方を見ていきます 前のセクションと同じ「アップデートを 取得する方法」のコードスライドです
CLBackgroundActivitySession オブジェクトを 更新の開始前にインスタンス化して 新しいセッションを開始する必要があります セッションをローカル変数ではなく プロパティである― self.backgroundActivityに 代入していることに注意してください ローカル変数を使うと その変数がスコープ外に出たときに その変数が保持しているオブジェクトが 割り当てを解除されて アプリが位置情報に アクセスできなくなる可能性があるからです セッションを終了したいときは invalidateメッセージを送信するか オブジェクトを破棄します これがライブアクティビティまたは CLBackgroundActivitySessionによって アプリがバックグラウンドで 更新を取得する方法です この新しいAPIが自動的に更新を 一時停止したり再開したりすることで バッテリー寿命に どのように貢献するか見てみましょう ユーザーが動いている間 アプリが更新を受信していると仮定します しかし 1日に何度も デバイスは静止状態になります 例えば ユーザーがオフィスに着くと デバイスを机の上に 置いたままにするかもしれません そのような状況ではアプリに 同じ場所を何度も与えることになります
代わりに 更新を一時停止することで 電力効率を上げることができます これはアプリに冗長な場所を 与えないことで アプリの負荷も軽減するものです デバイスが十分な時間静止状態になると CLLocationUpdate APIが これを認識し 自動一時停止をトリガーします 一時停止がトリガーされると 非nilの位置情報とisStationaryフラグが Trueにマークされた更新を送信します これにより 位置情報が 利用できなくなったのではなく ユーザーが移動しなくなったことを 知ることができます その後 デバイスが非定常状態になると ユーザーの操作なしに 更新が自動的に再開されます 更新が再開されると isStationaryはFalseとして送信され アプリへの更新配信が継続されます アプリがバックグラウンドにある間 自動的に更新を 一時停止したり再開したりすることは アプリのライフサイクルに影響します アプリがバックグラウンドで 実行されている間に受ける― 様々なライフサイクル段階と バックグラウンド更新の継続性を 維持するために 取るべきアクションを見ていきます アプリがフォアグラウンドで実行され アップデートを受信している間 フォアグラウンド実行から バックグラウンド実行へ またはその逆へと移行する可能性があります しかし この新しいAPIでは アプリがバックグラウンド実行状態から サスペンド状態に移行することがあります これは配信するアップデートがない場合に 起こる可能性が高いものです 例えば デバイスが静止しているため 自動的に一時停止したり 位置情報サービスが位置情報の修正を 計算できない場合などです 心配はいりません! CLLocationUpdateはあなたのアプリを サスペンド状態にすることはありません 代わりに 自動レジュームが開始されたり 位置情報が利用可能になったりして 更新が可能になると すぐにアプリのサスペンドを解除し バックグラウンドの実行状態に戻します アプリがサスペンド状態から再開されるとき バックグラウンドで更新を継続するための アクションは必要ありません サスペンド状態だけではありません アプリが終了状態まで 遷移する可能性もあります この遷移にはいくつかの方法があります 見ていきましょう 第一に アプリのクラッシュや ユーザーが閉じたことによって バックグラウンド実行から直接終了― またはリソースが制約されている場合の システム終了です 第二に アプリはサスペンド状態からでも ユーザーの終了や リソースの制約によって 終了状態に移行する可能性があります しかし 朗報があります 私たちのAPIはアプリが終了し まったく実行されていない場合でも ほとんどの場合 アプリを回復することができます 位置情報の更新が可能になり次第 アプリをバックグラウンドで起動することで 復旧させ アプリを終了状態から バックグラウンド実行状態に移行させます しかし 起動を受け取ったあと バックグラウンドでの 位置情報セッションが継続できるよう いくつか手順が必要です
liveUpdatesを呼び出して更新を再開し アプリが以前にバックグラウンド アクティビティセッションを 使用していた場合はCLBackground ActivitySessionの再作成が必要です バックグラウンドから既存の CLBackgroundActivitySessionへの 再参加は可能ですが 新しいCLBackgroundActivitySessionの 開始はできません それについてもう少し説明します 先ほど再作成したバックグラウンド アクティビティセッションオブジェクトは? それは新しいセッションの 開始ではありません 新しいセッションオブジェクトを 作成しただけです あなたのアプリは終了する前に すでにセッションを開始していたので この再作成によってあなたのアプリは バックグラウンドから既存のセッションに 再び参加することができ バックグラウンドでの位置情報の更新を 続けることができます バックグラウンドでアプリを起動したあとの liveUpdatesセッションと バックグラウンドアクティビティ セッションの再作成方法を説明しました 再作成に関連して 注意すべき点がいくつかあります
アプリはバックグラウンドアプリの 起動を受信したら すぐに再作成を実行する必要があります これらのオブジェクトの再作成は アプリがバックグラウンド 起動を受信したときに 実行される場所に配置してください サンプルアプリでは アプリの起動が完了すると呼び出される― UIApplicationDelegateの didFinishLaunchingWithOptionsに レクリエーションを配置しました 素晴らしい! これが新しい位置情報更新APIです 採用が簡単になり バッテリーの パフォーマンスも向上しています 今年からすべてのプラットフォームで 利用可能になります ぜひ皆さんのアプリで CLLocationUpdateを試して フィードバックアシスタントを通じて 貴重なご意見をお寄せください 新しいAPIの使い方を紹介する サンプルアプリもありますので リソースセクションから ダウンロードしてください CLLocationUpdateのApple Developer ドキュメントでAPIの詳細をご覧ください 「Meet Core Location Monitor」 セッションでは 今年追加される― Core Location Monitoring APIを 解説していますので ぜひご覧ください 以上 位置情報の更新の合理化についての セッションでした ご視聴ありがとうございました! ♪ ♪
-
-
0:26 - Getting location updates is easy!
for try await update in CLLocationUpdate.liveUpdates() { print("My current location : \(update.location)") }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。