메인 콘텐츠로 건너뛰기
Live Activities는 비교적 새로운 iOS 기능이며 네이티브 구현이 필요하므로 React Native, Flutter, Unity, Cordova 등과 같은 크로스 플랫폼 프레임워크를 사용할 때 어려움을 겪을 수 있습니다. 프로세스를 단순화하기 위해 OneSignal의 SDK에는 네이티브 코드 요구 사항을 최소화하는 기능이 포함되어 있어 지원되는 플랫폼 전체에서 간소화된 Live Activity 통합이 가능합니다.

요구 사항

  • 최신 버전의 SDK.
  • iOS 16.1+ 및 iPadOS 17+
  • .p8 APNs 키를 사용하세요. Apple은 Live Activities에서 p12 인증서를 지원하지 않습니다.
  • Xcode 14 이상

설정

1. SDK 설정

앱에 최신 버전의 Mobile SDK를 설정했는지 확인하세요. Live Activities는 웹사이트 또는 Web SDK에서 사용할 수 없습니다.

2. 새로운 setupDefault 메서드 추가

OneSignal SDK에 DefaultLiveActivityAttributes 유형에 대한 LiveActivity 수명 주기를 관리하도록 지시하려면 setupDefault 메서드를 호출할 수 있습니다. 이 메서드를 사용하면 Start Live ActivityUpdate Live Activity API를 모두 사용하여 기본 Live Activity를 시작/업데이트/종료할 수 있습니다.
import { OneSignal } from 'react-native-onesignal'

//Push To Start
OneSignal.LiveActivities.setupDefault()

//Launching the Live Activity from within the app (not needed for push to start)
const activityId = "my_activity_id"
const attributes = { title: "Sample Title" } ;
const content = { message: { en: "message" } };
OneSignal.LiveActivities.startDefault(activityId, attributes, content);

3. Activity Widget 만들기

1

Info.plist 업데이트

Xcode에서 메인 타겟의 Info.plist를 열고 Supports Live Activities 키를 Boolean으로 추가하고 YES로 설정하세요.

Info에 Supports Live Activities 키를 추가하고 값을 Boolean YES로 설정

Live Activities를 업데이트할 때 Apple이 업데이트의 긴급성을 결정하는 데 사용하는 “priority”를 설정할 수 있는 옵션이 있습니다. Apple에는 높은 우선순위 플래그를 너무 자주 사용하는 요청을 제한하는 내부 임계값이 있습니다.Live Activities에 대한 사용 사례가 더 빈번한 높은 우선순위 업데이트에 의존하는 경우 Apple의 개발자 문서에 지시된 대로 Info.plist에 NSSupportsLiveActivitiesFrequentUpdates 키를 Boolean 유형으로 YES로 설정하여 추가할 수 있습니다. Live Activity가 푸시 예산을 초과하면 사용자에게 대화 상자가 표시되며 Live Activity를 계속 허용하면 원활한 사용자 경험을 위해 예산이 자동으로 증가합니다.
2

Widget Extension 만들기

Xcode에서 File > New > Target… > Widget Extension으로 이동하세요.

Xcode에서 앱용 새 Widget Extension 타겟 추가.

선택하고 Next를 누르세요.이름을 제공하여(예: OneSignalWidget) Widget Extension을 구성하고 Include Live Activity가 선택되어 있는지 확인하세요. 그런 다음 Finish를 클릭하세요.

Live Activity용 Widget Extension 옵션.

스키마를 활성화하라는 메시지가 표시되면 Don’t Activate를 클릭하세요.

Live Activity용 Widget Extension 옵션.

3

Podfile에 OneSignalXCFramework 추가

프로젝트의 Targets 목록에서 widget extension 타겟의 이름을 찾으세요. 예제의 이름은 OneSignalWidgetExtension입니다.

widget extension 타겟의 이름 찾기

Podfile을 열고 다음 코드를 추가하세요. OneSignalWidgetExtension을 widget extension 타겟의 이름으로 교체하세요.
Podfile
target 'OneSignalWidgetExtension' do
  #use_frameworks!
  pod 'OneSignalXCFramework', '>= 5.0.0', '< 6.0'
end
Xcode를 닫고 pod repo update && pod install을 실행하여 OneSignalLiveActivities pod를 설치하세요.

4. LiveActivity.swift 파일 설정

Xcode에서 WidgetExtensionLiveActivity.swift 파일을 여세요. 화면 오른쪽의 Inspector 패널을 여세요. Target Membership 내에서 + 버튼을 클릭하고 Runner 타겟을 선택하세요.

메인 타겟 멤버십 허용

_WidgetExtensionLiveActivity.swift_의 내용을 다음 기본 Live Activity 레이아웃으로 업데이트하세요. 이 Widget의 값은 위젯에 표시하려는 모든 것으로 변경할 수 있으며 setupDefault 메서드가 이러한 속성에 대한 구조체 정의를 처리합니다.
Swift
import ActivityKit
import WidgetKit
import SwiftUI
import OneSignalLiveActivities

// Your struct name might be different here
@available(iOS 16.2, *)
struct OneSignalWidgetLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: DefaultLiveActivityAttributes.self) { context in
            // Lock screen / banner UI
            VStack {
                Spacer()

                Text("Title: " + (context.attributes.data["title"]?.asString() ?? ""))
                    .font(.headline)

                Spacer()

                HStack {
                    Spacer()
                    Text(context.state.data["message"]?.asDict()?["en"]?.asString() ?? "Default Message")
                    Spacer()
                }

                Text("INT: " + String(context.state.data["intValue"]?.asInt() ?? 0))
                Text("DBL: " + String(context.state.data["doubleValue"]?.asDouble() ?? 0.0))
                Text("BOL: " + String(context.state.data["boolValue"]?.asBool() ?? false))

                Spacer()
            }
            .activitySystemActionForegroundColor(.black)
            .activityBackgroundTint(.white)

        } dynamicIsland: { _ in
            DynamicIsland {
                // Expanded UI
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom")
                    // More content
                }
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T")
            } minimal: {
                Text("Min")
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}


Live Activity 테스트

  1. 앱을 시작하세요
  2. Start Live Activity API 레퍼런스에서 가능한 모든 필드를 확인하세요. 이러한 필드의 구조는 UI를 설정한 방법에 따라 다를 수 있습니다. 예를 들어:
  • "event_updates": Live Activity가 시작된 후 업데이트할 수 있는 동적 데이터입니다(코드 예제의 context.state 이후의 모든 것). context.state.data가 있으므로 이 필드에 데이터 객체와 코드 예제에 추가한 message 딕셔너리와 같은 추가 필드를 추가합니다. 사용 방법은 아래 예제 요청을 참조하세요.
  • "event_attributes": push to start 요청에서 설정되는 정적 데이터이며 Live Activity가 제거되거나 덮어쓰기될 때까지 동일한 값을 유지합니다.
  1. push to start를 사용할 때 코드가 아닌 요청에서 "activity_id"를 설정합니다. 다른 Activity ID를 사용하면 새 Live Activities가 시작됩니다. 동일한 Activity ID를 사용하면 현재 해당 ID를 사용하는 위젯을 덮어씁니다.
  2. url 경로에서 OneSignal 앱 ID를, Authorization 헤더에서 Rest API Key를 변경했는지 확인하세요. 기본 설정을 사용하는 경우 DefaultActivityAttributes 유형은 변경할 수 없습니다. 또한 경로에 추가된 activity 유형은 대소문자를 구분하며 아래 예제에서 사용된 기본 activity 또는 정의한 것과 일치해야 합니다.
curl
curl --request POST \
     --url https://api.onesignal.com/apps/YOUR_APP_ID/activities/activity/DefaultLiveActivityAttributes \
     --header 'Authorization: key YOUR_REST_API_KEY' \
     --header 'Content-Type: application/json' \
     --header 'accept: application/json' \
     --data '
{
  "event": "start",
  "event_updates": {
    "data": {
      "message": {
        "en": "The message is nested in context.state.data[\"message\"] as a dictionary"
      },
      "intValue": 10,
      "doubleValue": 3.14,
      "boolValue": true
    }
  },
  "event_attributes": {
    "data": {
      "title": "this is set when the LA starts and does not get updated after"
    }
  },
  "activity_id": "my-activity-id",
  "name": "OneSignal Notification Name",
  "contents": {
    "en": "English Message"
  },
  "headings": {
    "en": "English Message"
  },
  "sound": "beep.wav",
  "priority": 10
}'

하위 수준 메서드

SDK의 최신 릴리스에도 추가된 자체 Push To Start 토큰을 생성하려는 경우 사용할 수 있는 선택적 메서드입니다. 이러한 메서드를 사용하려면 Xcode와 더 많이 상호 작용하고 Swift로 Push To Start용 자체 토큰을 생성해야 합니다. 이에 대한 가이드는 여기에서 찾을 수 있습니다.
//Setting the Push To Start Token
OneSignal.LiveActivities.setPushToStartToken(activityType: string, token: string)

//Removing the Push To Start Token
OneSignal.LiveActivities.removePushToStartToken(activityType: string)