【iOS】Live Activityにリアルタイムで現在の位置情報を表示する
Live Activityにリアルタイムで現在の位置情報を表示する方法について解説します。これにより、Dynamic Islandに現在の位置情報を表示することができるようになり、一目で自身の位置情報を確認することができるようになります。
本記事では、Live Activityの表示・更新・停止の方法については解説しません。
Live Activityに関する基本的な情報は以下の記事にまとめていますので、必要に応じてご参照ください。
【iOS】ActivityKitでLive Activityを表示する
Background Modes
アプリがバックグラウンド状態の時でも位置情報を取得することができるようにするために、アプリ本体のTargetのCapabilityに「Background Modes」を追加します。まず最初に、アプリ本体のTargetを選択し、[Signing & Capabilities]を選択します。
そして、[+ Capability]を選択すると以下のダイアログが表示されます。
この中から「Background Modes」を選択します。そして、「Background Modes」の「Location updates」にチェックを入れます。
ここまでの設定を行うと、ユーザーの許可があれば、アプリがバックグラウンド状態の時でも端末の位置情報を取得することができるようになります。
位置情報の表示方法
ActivityAttributes
Live Activityに現在の位置情報をリアルタイムで表示したいため、Activity.ContentState
のプロパティに、位置情報を格納するプロパティを用意します。
位置情報の取得
位置情報を取得するために、CLLocationManager
インスタンスを生成し、位置情報の取得タイミングやデリゲートメソッドの移譲先を設定します。
位置情報を取得する度に、locationManager(_:didUpdateLocations:)
がコールされます。取得したCLLocation
インスタンスを使用してreverseGeocodeLocation(_:completionHandler:)
で、逆ジオコーディングを行い、位置情報をString
型で取得しています。
Live Activityの更新
逆ジオコーディングで取得した位置情報を使用して、LocationAttributes.ContentState
インスタンスを生成します。その生成したインスタンスを引数に指定してupdate(using:)
を実行することで、位置情報が更新される度にLive Activityが更新されるようになります。
Live ActivityのView
Live Activity Viewは位置情報を表示するような構成にします。
Live Activityの開始と停止
Live Activityの開始と停止を行うためのボタンを表示する画面を用意します。Live Activityの開始はrequest(attributes:contentState:pushType:)
、停止はend(_:dismissalPolicy:)
を実行します。
位置情報取得の開始
画面がフォアグラウンド ⇔ バックグラウンドに遷移する度にstartUpdatingLocation()
を実行します。
実行結果
動くコンテンツの表示方法
ActivityAttributes
Live Activityに画像を表示するために、Activity.ContentState
のプロパティに、Data?
型のプロパティを用意します。このプロパティは、UIImage
型 -> Data?
型に変換したインスタンスを格納するために使用します。
Live Activityの更新
2種類程度の画像を用意し、UIImage
型 -> Data?
型に変換しておきます。Live Activityを更新する度に、LocationAttributes.ContentState
インスタンスのimgData
に、事前に用意しておいた2種類のData?
型インスタンスを交互に指定することで、Live Activityに動くコンテンツを表示することができます。
Live ActivityのView
ActivityViewContext<LocationAttributes>
型のcontext
引数経由で取得した、Data?
型のオブジェクトをUIImage
型に変換して、Image
で表示しています。
実行結果
Live Activityに関する様々な制約
2023/10/9時点では、Live Activityに Map()
を表示することはできませんでした。
その他にも、現時点ではLive Activityには様々な制約があるとAppleから発表されています。
参考資料
・Core Location
・Live Activities
Discussion