메인 콘텐츠로 건너뛰기
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로 설정하세요.
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으로 이동하세요.
선택하고 Next를 누르세요.이름을 제공하여(예: OneSignalWidget) Widget Extension을 구성하고 Include Live Activity가 선택되어 있는지 확인하세요. 그런 다음 Finish를 클릭하세요.
스키마를 활성화하라는 메시지가 표시되면 Don’t Activate를 클릭하세요.
3

Podfile에 OneSignalXCFramework 추가

프로젝트의 Targets 목록에서 widget extension 타겟의 이름을 찾으세요. 예제의 이름은 OneSignalWidgetExtension입니다.
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)