# iOS Live Activities

<Aside type="tip">
iOS Live Activities에 대한 비디오를 시청하세요
<YouTube id="jRrDh_pIZCE" playlabel="Youtube 비디오: iOS Live Activities" /> 
</Aside>


[Live Activities](https://developer.apple.com/design/human-interface-guidelines/live-activities)는 iPhone 또는 iPad 잠금 화면과 Dynamic Island에 앱의 최신 데이터를 표시합니다. 이 기능을 사용하면 사용자가 실시간 정보를 한눈에 보고 표시된 정보와 관련된 빠른 작업을 수행할 수 있습니다.

다음은 Live Activities 사용의 몇 가지 예입니다.

* 배달 앱에서 주문 상태 표시
* 트레이닝 앱에서 실시간 카운트다운 제공
* 택시 앱에서 추적 정보 표시
* 스포츠 앱에서 게임 통계 및 현재 점수 표시
* 날씨 앱에서 시간별 예보 제공

아래 설명된 대로 Pushwoosh iOS SDK를 사용하여 Live Activities를 활성화할 수 있습니다. Live Activities를 관리하고 콘텐츠를 업데이트하려면 [/updateLiveActivity](/ko/developer/api-reference/ios-live-activities-api#updateliveactivity) 메서드를 사용하세요.



## 설정
<Aside type="caution" title="중요" >
Pushwoosh의 Live Activities는 [토큰 기반 구성](/ko/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/)만 지원합니다. [인증서 기반 구성](/ko/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/)은 지원되지 않습니다.
</Aside> 

### 위젯 확장 프로그램 추가

1. 새 타겟 생성

**File > New > Target**으로 이동하여 **Widget Extension**을 선택합니다.

<img src="/ios-push-notifications-ios-live-activities-1.webp" alt=""/>

2. 위젯 확장 프로그램 구성
이름을 입력하고 **Include Live Activity**를 선택한 후 **Finish**를 클릭하세요.

<img src="/ios-push-notifications-ios-live-activities-2.webp" alt=""/>

###  Info.plist 구성
기본 타겟에서 Info.plist 파일을 찾아 "Supports Live Activities" 키를 삽입하고 값을 YES로 설정합니다.

```xml
	<key>NSSupportsLiveActivities</key>
	<true/>
```

###  앱에서 실시간 활동 활성화
Live Activities를 활성화하려면 기존 위젯 확장 프로그램에 코드를 추가하거나 앱에 아직 없는 경우 새로 만드세요. Live Activities는 사용자 인터페이스에 [SwiftUI](https://developer.apple.com/documentation/SwiftUI) 및 [WidgetKit](https://developer.apple.com/documentation/WidgetKit) 기능을 사용합니다. ActivityKit은 각 Live Activity의 라이프사이클을 처리합니다. 이 API는 Live Activity를 요청, 업데이트, 종료하고 ActivityKit 푸시 알림을 수신하는 데 사용됩니다. Live Activities에 대한 자세한 내용은 [Apple 문서](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities)에서 확인할 수 있습니다.

 1. Xcode에서 프로젝트의 ContentView 파일로 이동하여 버튼을 생성합니다.

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 20) {

            Button(action: {
                LiveActivityManager.shared.startActivity()
            }, label: {
                Text("Start Live Activity")
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            })
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
```
<img src="/ios-push-notifications-ios-live-activities-4.webp" alt=""/>

 2. Live Activities를 관리하기 위해 LiveActivityManager.swift 파일을 생성합니다.

```swift
import Foundation
import ActivityKit
import UIKit
import PushwooshFramework
import PushwooshLiveActivities

class LiveActivityManager: NSObject, ObservableObject {
    public static let shared: LiveActivityManager = LiveActivityManager()

    private var currentActivity: Activity<FoodDeliveryAttributes>? = nil

    override init() {
        super.init()
    }

    func startActivity() {
        guard ActivityAuthorizationInfo().areActivitiesEnabled else {
            print("You can't start live activity.")
            return
        }
        do {
            let pushwooshData = PushwooshLiveActivityAttributeData(activityId: "activity_id")
            let atttribute = FoodDeliveryAttributes(orderNumber: "1234567", pushwoosh: pushwooshData)
            let initialState = FoodDeliveryAttributes.ContentState(
                status: "Preparing your meal",
                estimatedTime: "25 min",
                emoji: "👨‍🍳",
                pushwoosh: nil
            )
            let activity = try Activity<FoodDeliveryAttributes>.request(
                attributes: atttribute,
                content: .init(state:initialState , staleDate: nil),
                pushType: .token
            )
            self.currentActivity = activity

            Task {
                for await pushToken in activity.pushTokenUpdates {
                    let pushTokenString = pushToken.reduce("") {
                        $0 + String(format: "%02x", $1)
                    }
                    print("Activity:\(activity.id) push token: \(pushTokenString)")

                    // MARK: - Send Push Token to Pushwoosh
                    Pushwoosh.LiveActivities.startLiveActivity(
                        token: pushTokenString,
                        activityId: "activity_id"
                    )
                }
            }
        } catch {
            print("Start Activity Error: \(error.localizedDescription)")
        }
    }
}

```

 3. 이제 프로젝트를 실행하고 'Start Live Activity' 버튼을 누릅니다. 그런 다음 잠금 화면으로 이동하여 생성된 Live Activity를 확인합니다.


<img src="/live-activities-1.webp" alt=""/>

### 원격 푸시 알림으로 Live Activity 시작하기

1. 원격 푸시 알림을 통해 Live Activity를 시작하려면 `pushToStartTokenUpdates` 토큰을 Pushwoosh로 보내야 합니다.

```swift
func getPushToStartToken() {
    if #available(iOS 17.2, *) {
        Task {
            for await data in Activity<LiveActivityAttributes>.pushToStartTokenUpdates {
                let token = data.map {String(format: "%02x", $0)}.joined()
                print("Activity PushToStart Token: \(token)")

                // Send `pushToStartTokenUpdates` token to Pushwoosh
                try await Pushwoosh.LiveActivities.sendPushToStartLiveActivity(token: token)
            }
        }
    }
}
```
2. 원격 푸시 알림으로 Live Activity 시작하기

<Aside type="tip">
 원격으로 Live Activity를 시작하는 요청을 만드는 방법에 대한 지침과 예제는 [Pushwoosh API 참조](/ko/developer/api-reference/ios-live-activities-api#startliveactivity)를 따르세요.
</Aside>

### Live Activities 관리

Pushwoosh iOS SDK는 Live Activities 작업을 위한 다음 메서드를 제공합니다.

```swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)

```

`Activity ID` 매개변수를 사용하여 세그먼트별로 실시간 활동을 업데이트할 수도 있습니다. 활동을 생성할 때 특정 사용자 세그먼트와 관련된 고유한 `Activity ID` 매개변수를 메서드에 전달해야 합니다.

예를 들어, N명의 사용자가 실시간 활동에서 동일한 이벤트를 구독했습니다. 이 경우 `Activity ID` 매개변수는 이 N명의 모든 사용자에게 고유해야 합니다.

Live Activity 작업을 마쳤을 때 다음 메서드를 사용하세요.
```swift
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)
```
<Aside type="note">
 [Pushwoosh API](/ko/developer/api-reference/ios-live-activities-api)를 통해 iOS Live Activities를 관리할 수 있습니다.
</Aside>

### `Setup()` 메서드
Pushwoosh는 `PushwooshLiveActivities.setup` 함수를 도입하여 활동 ID 전송을 단순화합니다. 이 함수는 애플리케이션 내에서 Live Activity의 전체 라이프사이클을 처리합니다. 이 함수는 `pushToStart` 및 `pushToUpdate` 토큰 업데이트를 자동으로 수신합니다. 이 메서드를 사용하면 애플리케이션이 더 이상 Live Activities의 시작을 수동으로 추적하거나 활동 업데이트를 위한 토큰 업데이트를 관리할 필요가 없습니다.

이 메서드는 모든 토큰 관리를 저희 쪽에서 처리하므로, 여러분이 유지 관리해야 할 코드의 양을 줄여줍니다. 이는 통합을 단순화하고 앱에 더 원활하고 효율적인 경험을 보장하므로 이 메서드를 사용하는 것을 권장합니다.

AppDelegate에서 `PushwooshFramework`와 `PushwooshLiveActivities`를 임포트하고 `Pushwoosh.LiveActivities` 모듈에서 `setup` 메서드를 호출해야 합니다.

**AppDelegate.swift**
```swift
if #available(iOS 16.1, *) {
    Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
}
```
**FoodDeliveryAttributes**

```swift
import WidgetKit
import SwiftUI
import ActivityKit
import PushwooshFramework
import PushwooshLiveActivities

struct FoodDeliveryAttributes: PushwooshLiveActivityAttributes {
    public struct ContentState: PushwooshLiveActivityContentState {
        var status: String
        var estimatedTime: String
        var emoji: String
        var pushwoosh: PushwooshLiveActivityContentStateData?
    }

    var orderNumber: String
    var pushwoosh: PushwooshLiveActivityAttributeData
}
```
`FoodDeliveryAttributes`: 이 구조체는 `PushwooshLiveActivityAttributes` 프로토콜을 준수합니다. 앱 내에서 실시간 활동의 속성을 정의하는 데 사용됩니다.

<Aside type="note">
 Pushwoosh API의 /updateLiveActivity 메서드를 사용하여 Live Activities를 관리하고 콘텐츠를 업데이트할 수 있습니다. 자세한 내용은 [이 가이드](/ko/developer/api-reference/ios-live-activities-api)를 참조하세요.
</Aside>

## 마이그레이션 가이드

Pushwoosh iOS SDK 버전 6.8.0부터 SDK 구조를 업데이트했습니다. 이제 Live Activities 메서드는 `PushwooshLiveActivities` 모듈을 통해 액세스됩니다.

Pushwoosh iOS SDK 6.8.0 이전 버전을 사용하고 아래 나열된 메서드를 호출했으며, 이후 6.8.0 이상 버전으로 업데이트한 경우 다음 변경 사항에 유의하세요.

```swift
static func setup<Attributes: PushwooshLiveActivityAttributes>(_ activityType: Attributes.Type)
static func defaultSetup()
static func defaultStart(_ activityId: String, attributes: [String: Any], content: [String: Any])
```

이제 이러한 메서드에 액세스하려면 LiveActivity 모듈을 사용해야 합니다.

```swift
import PushwooshFramework
import PushwooshLiveActivities

```

```swift
Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
Pushwoosh.LiveActivities.defaultSetup()
Pushwoosh.LiveActivities.defaultStart("activity_id",
                            attributes: ["key_attribute": "value_attribute"],
                            content: ["key_content": "value_content"])
```

또한 아래 나열된 `Pushwoosh.sharedInstance()`를 통한 메서드 지원도 유지했지만, 이러한 메서드는 향후 릴리스에서 사용 중단될 예정입니다.

``` swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)
```