더 빠르게 주문 상태 전달하기: Live Activities

2 weeks ago 5

Taemin Yun

안녕하세요. 모바일 팀에서 iOS 앱을 개발하고 있는 윤태민입니다.

저희 모바일 팀은 최고의 사용자 경험을 위해 매주 다양한 주제로 스터디를 진행하고 있는데요. 기초적인 CS 개념을 공부하기도 하고, 최신 AI 기술 영상을 함께 보기도 하며, WWDC에서 소개된 새로운 API들을 직접 앱에 적용해 보기도 합니다.

그중에서도 이번에 소개할 Live Activities(실시간 현황)는 함께 스터디하는 것을 넘어서, 실제 프로덕트에 반영된 기능이라는 점과 사용자들의 요청을 수용해 Live Activities를 도입했다는 점에서 그 의미가 더욱 큽니다.

Press enter or click to view image in full size

요기요에 Live Activities 도입을 요구하는 리뷰들

앱, 그 이상을 위하여…

애플이 제공하는 기능 중에는 시스템(OS)과 상호작용을 할 수 있는 기능들이 많이 있습니다. 대표적으로 Siri, Shortcut, Spotlight, Push Notifications, Widget 등이 있죠.

Press enter or click to view image in full size

시스템과 상호작용을 하는 서비스

이러한 시스템 연동 기능들의 공통점은, 사용자 경험을 앱 내부에만 머물지 않도록 확장해 준다는 데 있습니다. 즉, 사용자가 굳이 앱을 열지 않아도 필요한 정보를 확인하거나 특정 작업을 수행할 수 있도록 도와주며, 더 자연스럽고 새로운 경험을 제공하게 됩니다.

특히 Live Activities는 실시간으로 데이터를 업데이트하고 이를 즉각적으로 사용자에게 전달할 수 있다는 점에서, 요기요에서 중요하게 다루는 주문 상태 업데이트와 매우 잘 맞다고 생각했습니다.

그럼, 본격적으로 Live Activities가 무엇인지 살펴볼까요?

Live Activities, 실시간 현황이 뭔가요?

기능을 추가할 때 가장 먼저 고려해야 할 점 중 하나는 그 기능의 목적을 이해하는 것입니다. 목적을 알아야, 그 기능을 제대로 활용할 수 있기 때문이죠. 특히, 출시 여부가 애플의 심사에 따라 결정되는 앱이라면 그 중요성은 더 커집니다.

Live Activities의 목적은 애플 공식 문서에서 매우 명확하게 정의되어 있습니다.

Live Activities provide frequent information updates that appear in glanceable locations such as the Lock Screen, on iPhone in StandBy, and the Dynamic Island.

여기서 가장 중요한 부분은 역시 “frequent information updates”, 즉 빈번한 정보 업데이트입니다. Live Activities는 지속적으로 변화하는 데이터를 실시간으로 표시하기 위한 기능입니다.

아래 GIF를 보면 하나의 액티비티 내에서 정보가 변하는 걸 볼 수 있죠. 이것이 바로 Live Activities의 가장 큰 목적이자 특징입니다.

그렇다면 이런 질문이 생깁니다. “Live(실시간)가 아닌 Dead(정적) Activities도 있을까?” 다시 말해, 빈번하게 변하지 않는 정보를 보여주는 기능도 있을까요?

네, 있습니다! 바로 우리가 익숙하게 사용하는 Push Notifications(알림) 입니다.

애플은 Push Notifications의 상위 개념인 User Notifications를 다음과 같이 정의합니다.

User-facing notifications communicate important information to users of your app, regardless of whether your app is running on the user’s device.

정의에서 알 수 있듯이, User Notification은 Live Activity와 달리 일회성으로 정보를 전달하는 기능입니다. 즉, 새로운 정보를 전달하려면 매번 새로운 알림을 보내야 합니다.

‘갑자기 왜 Push Notifications 얘기가 나왔을까?’ 싶을 수 있지만, Live Activities와 Push Notifications는 서로 유사하면서도 다른 성격을 가지고 있습니다. 그렇기 때문에 그 차이를 명확히 이해하는 것이 중요합니다. 그래야 상황에 맞는 적절한 기능을 쓸 수 있을 테니까요.

“정적 데이터는 Push Notifications로, 동적 데이터는 Live Activities로”

요기요에 Live Activities 접목하기

요기요에서 제공하는 주문 상태는 동적으로 변화하는 데이터입니다. 이 부분이 Live Activities를 도입한 이유입니다.

물론 앞서 설명한 알림으로도 주문 상태를 사용자에게 알릴 수 있습니다. 하지만 빈번한 알림은 자칫 사용자에게 잡음으로 다가올 수 있습니다. 그래서 하나의 액티비티에서 데이터를 갱신할 수 있는 Live Activities가 제격이라고 생각했습니다.

Press enter or click to view image in full size

잡음으로 다가올 수 있는 빈번한 알림

그럼 실제 요기요에서 Live Activities를 어떻게 이용했는지 살펴볼까요? 우선 요기요에서 정의한 주요 요구사항부터 확인해 보겠습니다.

요구사항

요기요에서는 다음과 같이 대표적인 두 가지 기능이 요구되었습니다.

(1) 주문 상태에 따른 라이브 액티비티 생성 및 업데이트

  • 주문 완료¹ → 액티비티 생성² → 주문 상태 업데이트³ → 액티비티 업데이트⁴ → 배달 완료⁵ → 액티비티 제거⁶

(2) 액티비티 터치 시, 주문 상세 페이지로 이동

두 번째 기능(주문 상세로 이동)은 이미 Deep Linking이 구현되어 있었기 때문에, WidgetKit에서 제공하는 API를 통해 간단히 연결할 수 있었습니다.

ActivityConfiguration(for: OrderStatusActivityAttributes.self) { context in
VStack(alignment: .leading) {
...
}
.widgetURL(URL) // 주문 상세로 이동하는 Deep Linking URL 추가
}

widgetURL(_:) 메서드를 사용하면, 사용자가 액티비티를 탭할 때 지정한 URL Scheme으로 이동할 수 있습니다. 이를 통해 앱을 열지 않고도 주문 상세 화면으로 직접 진입할 수 있죠.

중요한 부분은 역시 액티비티 관리입니다. 먼저 액티비티를 관리하는 방법을 살펴보겠습니다.

액티비티를 관리하는 방법

Live Activities는 크게 두 가지 방식으로 관리할 수 있습니다.

(1) 앱 내부에서 직접 관리하는 방법

가장 간단한 방법은 앱 내부에서 액티비티를 생성 및 업데이트하는 방식입니다. 앱 내에서 Activity.request() 나 activity.update() 메서드를 호출해 직접 액티비티를 조작할 수 있습니다.

이 방식은 구조가 단순하고, 앱 상태를 바로 반영할 수 있기 때문에 신뢰성이 높습니다. 다만, 앱이 백그라운드나 종료 상태일 때는 업데이트가 불가능하다는 한계가 있습니다.

(2) APNs를 통한 서버 관리

APNs는 Apple Push Notification service의 약자로 도식으로 쉽게 이해할 수 있습니다.

Press enter or click to view image in full size

여기서 주목해야 할 점은 다음과 같습니다:

  • Push Token을 사용해 특정 기기를 식별한다는 점
  • 요청 주체가 앱이 아닌 서버라는 점

즉, 서버가 Push Token을 기반으로 APNs에 요청을 보내면, APNs가 해당 기기로 Payload를 전달하고, 앱은 그 데이터를 통해 액티비티를 업데이트하게 됩니다.

이 방식의 가장 큰 장점은, 앱이 실행 중이지 않아도 Live Activities의 상태를 원격으로 갱신할 수 있다는 것입니다.

즉, 사용자가 앱을 완전히 종료한 상태에서도 주문 상태나 진행 현황이 시스템 UI(Dynamic Island, Lock Screen 등)에 실시간으로 반영될 수 있습니다.

참고로, APNs는 Live Activities뿐 아니라 일반 Push Notifications(알림)도 동일한 채널을 통해 전달합니다. 다만 Live Activities의 경우에는 특별한 Payload 구조를 사용합니다.

액티비티 관리

예상하셨겠지만, 요기요에서는 Live Activities를 APNs를 통해 관리하기로 했습니다.

가장 큰 이유는 다음과 같습니다.

(1) 여러 기기에 대한 동일한 Live Activities 관리

Live Activities를 앱 내부에서 직접 관리하게 되면, 주문이 완료된 시점에 즉시 액티비티를 생성할 수는 있지만, 해당 주문을 진행한 단말기에서만 액티비티가 생성되고 업데이트된다는 한계가 있습니다.

요기요는 같은 계정으로 로그인한 모든 기기에서 동일한 주문 상태 정보를 실시간으로 확인할 수 있도록 하고 싶었습니다.

예를 들어, 사용자가 아이폰과 아이패드를 동시에 사용 중이라면 양쪽 모두에서 동일한 액티비티가 노출되어야 합니다.

이를 위해 요기요에서는 외부 Push Service를 통해 Live Activities를 관리했습니다. 요기요 서버는 사용자 계정에 연결된 기기 정보와 주문 상태를 해당 서비스로 전달하고, 해당 서비스가 APNs를 통해 각 기기로 동일한 액티비티에 대한 업데이트를 요청합니다.

(2) 앱이 실행 중이 아니어도 Live Activities 생성 및 업데이트

마찬가지로 Live Activities의 관리 주체가 앱 내부에 있을 경우, 앱이 실행 중이 아닐 때는 액티비티를 업데이트할 수 없습니다. 즉, 포그라운드 상태에서만 특정 이벤트 트리거를 통해 업데이트할 수 있죠.

하지만 APNs를 통해 서버가 직접 업데이트를 제어하면, 앱이 완전히 종료되어 있어도 시스템 UI(Dynamic Island, Lock Screen 등)의 상태를 변경할 수 있습니다.

요기요는 이 방식을 통해 앱 실행 여부와 관계없이 주문 상태를 실시간으로 반영할 수 있었습니다. 이는 사용자 관점에서 “앱을 열지 않아도 배달 현황을 확인할 수 있는 경험”을 가능하게 합니다.

(3) 배달 종류에 따라 동적으로 Live Activities 노출 여부 결정

요기요는 음식 배달 플랫폼으로, 다양한 형태의 배달을 제공합니다. 각각의 배달은 Live Activities가 노출하는 정보를 가지고 있을 수도 있고 그렇지 않을 수도 있습니다.

그리고 이런 내용은 언제든지 변할 수 있습니다. 예를 들어, 포장 주문에 대한 실시간 데이터를 제공하지 않아 Live Activities 노출이 필요 없다가 어느 순간 제공이 가능해질 수도 있습니다.

요기요는 서버에서 주문 종류에 따라 Live Activities 노출 여부를 동적으로 제어함으로써 변화하는 서비스 정책이나 배달 로직에 유연하게 대응할 수 있도록 구현했습니다.

APNs 기반 관리 구조는 이러한 정책 변경에도 코드 수정 없이 서버 설정만으로 대응할 수 있다는 장점이 있습니다.

Live Activities 적용 시 고려할 점

Live Activities를 도입하면서 실제 마주했던 내용들을 공유하려고 합니다. 아래 소개되는 내용들은 Live Activities 적용 시 필수적으로 고려해야 하는 부분이니 항상 염두에 둬야 합니다.

디자인 제약

가장 먼저 고려해야 할 점은 디자인 제약입니다. Live Activities가 노출되는 위치는 Lock Screen, Dynamic Island 등 한정적인데요. 특히 Dynamic Island는 노출 상태에 따라 크기, 위치, 비율 제약이 매우 까다롭습니다. 상태마다 레이아웃 가이드가 다르기 때문에, Apple의 Human Interface Guidelines을 반드시 확인해야 합니다.

다음으로는 애니메이션 제약입니다. Live Activities가 표시되는 영역에서는 사용할 수 있는 애니메이션에 제약이 있습니다. 공식 문서와 세션 영상들을 보면, View 전환 애니메이션이나 SF Symbols의 애니메이션 기능을 일부 활용할 수 있다고 설명하지만, 실제 적용 시 불완전한 요소가 많아 정적 이미지 중심으로 디자인을 구성했습니다.

Live Activities는 시스템 리소스를 직접 사용하는 기능이기 때문에, 무리한 애니메이션보다는 안정적인 정적 표현에 초점을 맞추는 것이 좋습니다.

컨텐츠 제약

Apple은 Live Activities의 콘텐츠 정책에 대해 다음과 같이 명시하고 있습니다.

Don’t use a Live Activity to display ads or promotions. Live Activities help people stay informed about ongoing events and tasks, so it’s important to display only information that’s related to those events and tasks.

즉, Live Activity에는 광고나 프로모션 콘텐츠를 삽입해서는 안 됩니다. Live Activities의 목적은 어디까지나 빈번하게 변하는 데이터를 전달하는 것입니다. 이 원칙을 벗어나면 심사 과정에서 불리하게 작용할 수 있습니다.

“그럼 광고는 뭐로 보여주나요?”

예상이 되나요? 바로 Push Notifications입니다. Live Activities와 Push Notifications는 서로 대체 관계라기 보다는 상호 보완 관계입니다. 즉, Live Activities는 실시간 상태 변화에, Push Notifications는 단발성 메시지 전달에 각각 최적화되어 있습니다.

이 두 기능을 적절히 조합하면 시스템 전반에서 자연스럽게 확장되는 사용자 경험을 제공할 수 있습니다.

끝으로…

Live Activities는 단순히 정보를 표시하는 기능이 아니라, 앱과 시스템이 협력해 사용자 경험을 확장하는 인터페이스입니다. 앱 내부에서만 머물던 정보 흐름을 Lock Screen, Dynamic Island 등 시스템 전역으로 확장할 수 있다는 점에서 그 의미가 큽니다.

요기요는 이 기능을 활용해 사용자가 앱을 열지 않아도 주문 상태를 직관적으로 확인할 수 있도록 했고, Push Service와 APNs를 연동해 Live Activities를 서버 중심으로 관리함으로써, 여러 기기에서 일관된 경험을 제공하고, 주문 정책 변화에도 유연하게 대응할 수 있었습니다.

Press enter or click to view image in full size

오늘도 열심히 배달하고 있는 요리

앞으로도 애플은 사용자와 시스템을 연결하는 다양한 인터페이스를 확장해 나갈 것입니다. 그만큼 개발자는 단순한 기능 개발을 넘어 어떤 경험을 만들어 낼지 고민해야 합니다.

Live Activities는 그 출발점이었습니다. 이 경험을 바탕으로 이제부터 더 풍부한 사용자 경험을 만들어갈 예정입니다.

Read Entire Article