🏃‍♂️

【iOS】Live Activityにリアルタイムで現在の位置情報を表示する

2023/10/09に公開

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から発表されています。
https://developer.apple.com/jp/news/?id=qpqf1gru

参考資料

・Core Location
https://developer.apple.com/documentation/corelocation

・Live Activities
https://developer.apple.com/design/human-interface-guidelines/live-activities

Discussion