メインコンテンツへスキップ
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サイトまたはWeb SDKでは利用できません。

2. 新しいsetupDefaultメソッドを追加

OneSignal SDKにDefaultLiveActivityAttributesタイプのLiveActivityライフサイクルを管理するように指示するには、setupDefaultメソッドを呼び出すことができます。このメソッドを使用すると、Start Live ActivityUpdate Live Activityの両方のAPIを使用して、Default 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 ActivitiesBooleanとして追加し、YESに設定します。

InfoにSupports Live Activitiesキーを追加し、その値をBoolean YESに設定

Live Activitiesを更新するときに、Appleが更新の緊急性を判断するために使用する「優先度」を設定するオプションがあります。Appleには、高優先度フラグを頻繁に使用するリクエストをスロットルする内部しきい値があります。Live Activitiesのユースケースがより頻繁な高優先度更新に依存している場合は、AppleのDeveloper Docsで指示されているように、キーNSSupportsLiveActivitiesFrequentUpdatesをInfo.plistにBoolean型としてYESに設定して追加できます。Live Activityがプッシュ予算を超えると、ユーザーにはダイアログが表示され、Live Activityの継続を許可すると、予算が自動的に増加してシームレスなユーザーエクスペリエンスが提供されます。
2

Widget Extensionを作成

Xcodeで、File > New > Target… > Widget Extensionに移動します。

Xcodeでアプリの新しいWidget Extensionターゲットを追加

選択してNextを押します。名前を指定してWidget Extensionを構成し(例:OneSignalWidget)、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内の値は、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があるため、このフィールドにdataオブジェクトと、コード例で追加したメッセージ辞書などの追加フィールドを追加します。使用方法については、以下のリクエスト例を参照してください。
  • "event_attributes":これは、push to startリクエストで設定される静的データで、Live Activityが削除または上書きされるまで同じ値のままです。
  1. push to startを使用する場合、コード内ではなく、リクエストで"activity_id"を設定します。異なるActivity IDを使用すると、新しいLive Activitiesが開始されます。同じActivity IDを使用すると、そのIDを現在使用しているwidgetが上書きされます。
  2. URLパスでOneSignal App IDを変更し、AuthorizationヘッダーでRest API Keyを変更していることを確認してください。デフォルトのセットアップを使用している場合、DefaultActivityAttributesタイプは変更できません。また、パスに追加されるactivityタイプは大文字と小文字が区別され、ユーザーが定義したものまたは以下の例で使用されているDefault 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": {
    "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
}'

低レベルメソッド

これらは、独自のPush To Startトークンを生成したい場合に使用するオプションのメソッドです。これは、SDKの最新リリースにも追加されています。これらのメソッドを使用するには、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)