🚨

Live Activityによるスペース利用時間の延長促進機能

2024/09/01に公開

こんにちは、スペースマーケットでモバイルエンジニアをしている村田です。

以前投稿した記事【アプリエンジニアがプロダクトをグロースさせる施策立案】に続き、今回はスペースの利用時間をスムーズに延長するための機能について考え、施策を立案しました。iOSならではのLive Activityを活用した機能を実装しましたので、開発時に直面した課題も含め本記事で紹介します。

Live Activityとは

ロック画面やDynamic Islandに、アプリの最新情報を表示する機能で、ユーザーがリアルタイムの情報を一目で確認し、関連するアクションを素早く実行できるようにします。

例えばUberEatsアプリでは、注文品の進捗状況(調理中、配達中など)がロック画面に表示されるようになっており、商品が手元に届くまで逐一ユーザーがアプリをフォアグラウンド移行して確認する手間がなくなったのかなと思います。

https://x.com/tomokusutomi/status/1664208722934247424

Live Activityを利用した新機能

冒頭に記載した通り、今回Live Activityを利用した機能を開発しました。iOSエンジニアとして漠然と触ってみたいと思っていた技術だったため、Live Activityを起点に施策の立案を行いました。

スペース利用時間の延長促進機能アイディア出し

スペースマーケットは最短1時間からレンタルスペースを予約でき、15分単位で利用時間の延長が可能です。スペース利用中に、利用残り時間と延長ボタンをロック画面に表示することで、ユーザーが気軽に延長をしてくれるのではと考えました。また、延長が可能であること自体知らないユーザーへのリーチにもつながれば嬉しいなと思いました。

スペース利用前/利用中/利用後と適切なWidgetを切り替え、各ステップユーザーにとって有益な情報を出したいなと考えを粗くFigjamへ書き出し✍️

デザイン

考えがある程度固まった後、デザインチームに話を持っていき、仕様を詰めつつデザインの依頼を行いました。UIレイアウトの制約が多くとても面倒だったと思います、BIG感謝!(Live Activities – Human Interface Guidelines

利用前

利用中

利用残り時間と経過時間が視覚的に分かりやすくなるよう経過時間プログレスバーを設置

※ 後述しますがプログレスバーの更新が難しく泣く泣く削ることになりました..。デザイナーさんに申し訳なかったです🙇

利用後

利用終了後は延長ができないため、レビューを投稿ボタンを設置

開発時の課題

UIレイアウト制約やアプリがバックグラウンド状態を考慮した実装(バックグラウンドタスク or Push通知)が必要だったり、制限の多さから開発を進める中で仕様の変更を余儀なくされる場面がありました。そのいくつかを紹介させていただきます

8時間制限

Live Activityのアクティブ時間は最大8時間のようで、この制限を超えるとOSが自動でLive Activityを終了してしまうようです。利用時間前の表示時間+利用時間が8時間を超える場合、そもそもLive Activityを起動しないような工夫が必要でした。

A Live Activity can be active for up to eight hours unless its app or a person ends it before this limit. After the eight-hour limit, the system automatically ends the Live Activity, and immediately removes it from the Dynamic Island. However, the Live Activity remains on the Lock Screen until a person removes it or for up to four additional hours before the system removes it — whichever comes first. As a result, a Live Activity remains on the Lock Screen for a maximum of 12 hours.

https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities#Understand-constraints

また、当初は8時間経過する度にLive Activityの再起動を繰り返すことでOS8時間制限を突破しようと考えていました。ただ、Live Activityはバッググラウンド状態で起動ができないという制限があることを知り、確実に8時間以内に収める必要がありました

Your app can only start Live Activities while it’s in the foreground. However, you can update or end a Live Activity from your app while it runs in the background — for example, by using Background Tasks.

https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities#Start-the-Live-Activity

バックグラウンドタスク

利用中Widgetにおける残り時間と経過時間のプログレスバーの更新は、フォアグラウンドとバックグラウンドそれぞれで1分に1回更新する設定をしていました。アプリチームでバックグラウンド状態の動作確認を各メンバーの端末で進める中で、確実に更新されるメンバーと、うまく更新されないメンバーが存在し、動作が不安定であることが判明しました。

バックグラウンドタスクへの依存を減らすために1分1回更新を諦め、プログレスバーを削除する決断をしました。

利用残り時間の表示には、SwiftUIのTextに Text.DateStyle.timer スタイルを設定することで、利用終了時刻までのカウントダウンを表示するよう対応。

let endedAt: Date 
Text(endedAt, style: .timer)

開発中に原因を特定することはできませんでしたが、リリース後にREALITYさんの記事を拝見し、位置情報オンにしているかどうかの差だったのかなと想像しています

調査したところ、位置情報など特定のバックグラウンドタスクがアプリで実行されている必要があり、配信の音声再生だけでは、バックグラウンド更新ができる条件を満たさないようでした

https://note.com/reality_eng/n/n1ba7b7d02127

成果物

利用時間延長ボタンを押下した際の挙動になります。
アプリをフォアグラウンドに移行し、利用時間延長画面を表示する一連の流れをワンタップで行えて便利!

ロック画面 Dynamic Island

リリース後結果

8月中に実行された予約延長の約1割が、Live Activityを導線としたものでした! 8月の頭にリリースしたばかりでバージョンの浸透率が低い中でも、良い結果が出ているのではないかと感じています。

ちなみに、Dynamic Islandの拡張表示に設置した予約延長ボタンは、数回しかタップされていませんでした🥺 Dynamic Island対応端末利用ユーザーが多くない事は前提ですが、Dynamic Islandをロングタップして拡張表示されること自体、認知度が低いのかもしれません

最後に

スペースマーケットでは一緒に働く仲間を募集中です!
詳しくは以下採用ページをご確認ください。

https://spacemarket.co.jp/recruit/engineer/

https://herp.careers/v1/spmhr/f8x6AkIueBSb

https://herp.careers/v1/spmhr/9zYSnsOQ0UMA

GitHubで編集を提案
スペースマーケット Engineer Blog

Discussion