> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Live Activities開発者セットアップ

> OneSignalを使用してiOSアプリでLive Activitiesを設定して、ロック画面とDynamic Islandにリアルタイム更新を表示します。

Live Activitiesを使用すると、iOSアプリがロック画面とDynamic Islandに直接リアルタイム更新を表示できます。配送追跡、スポーツスコア、または時間に敏感なトランザクション更新に最適で、アプリを開かずにユーザーに情報を提供し続けます。

<Note> Androidには[Android Live通知](./android-live-notifications)と呼ばれる同様の機能があります。 </Note>

## 要件

* ネイティブiOS（Swift/Objective-C）を使用している場合は、[iOS SDKセットアップ](./ios-sdk-setup)に従ってください。
  * ラッパーSDK（React Native、Flutter、Unityなど）を使用している場合は、[Mobile SDKセットアップ](./mobile-sdk-setup)に従い、次に[クロスプラットフォームLive Activity SDKセットアップ](./cross-platform-live-activity-setup)に従ってください。
* **push-to-start**サポートにはOneSignal iOS SDKバージョン5.2.0+が必要です（[リリースノートを参照](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/5.2.0)）。
* **クリック追跡**と**確認済み配信**にはOneSignal iOS SDKバージョン5.2.15+が必要です
* iOS 16.1+およびiPadOS 17+
* [.p8 APNsキー](./ios-p8-token-based-connection-to-apns)を使用します。AppleはLive Activitiesでp12証明書をサポートしていません。
* Xcode 14以降

***

## セットアップ

これらの手順では、Live Activitiesを迅速にセットアップする方法を説明します。詳細とデザインのカスタマイズについては、[AppleのLive Activities開発者ドキュメント](https://developer.apple.com/design/human-interface-guidelines/live-activities)を参照してください。

### 1. Widget Extensionを追加する

Xcodeで、**ファイル > 新規 > ターゲット... > Widget Extension**に移動します。

<Frame caption="XcodeでアプリのWidget Extensionターゲットを新規追加します。">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-widget-extension.png?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=60a52d6484203c4d6af21bc3a7da5e62" width="2166" height="1488" data-path="images/live-activities/live-activity-widget-extension.png" />
</Frame>

選択して**次へ**を押します。

名前を入力してWidget Extensionを設定し（例：`OneSignalWidget`）、**Include Live Activity**が選択されていることを確認します。次に**完了**をクリックします。

<Frame caption="Live ActivityのWidget Extensionオプション。">
  <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/OneSignalWidget.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=47412314963f6fbd58fd2c7d3a529322" width="2166" height="1488" data-path="images/live-activities/OneSignalWidget.png" />
</Frame>

スキームをアクティブ化するように求められた場合は、**アクティブ化しない**をクリックします。

<Frame caption="スキームのアクティベーションプロンプト — 「アクティベートしない」を選択します。">
  <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/la-scheme-activation.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=d3a2207ff2b5988c63c2abd631a72541" width="2166" height="1488" data-path="images/live-activities/la-scheme-activation.png" />
</Frame>

### 2. `Info.plist`を更新する

メインターゲットの`Info.plist`に、キー`Supports Live Activities`を**Boolean**として追加し、`YES`に設定します。

<Frame caption="InfoにSupports Live Activitiesキーを追加し、その値をBoolean YESに設定します">
  <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/info-la-setting.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=e839231401651b71d0ae8d48614ec130" width="2166" height="1488" data-path="images/live-activities/info-la-setting.png" />
</Frame>

プログラムで設定する場合は、次のようになります：

```xml info.plist theme={null}
<key>NSSupportsLiveActivities</key>
<true/>
```

<Note>
  Live Activitiesを更新する場合、「優先度」を設定するオプションがあり、Appleはこれを使用して更新の緊急性を判断します。Appleには内部しきい値があり、高優先度フラグを頻繁に使用するリクエストをスロットルします。

  Live Activitiesのユースケースがより頻繁な高優先度更新に依存している場合、[AppleのDeveloper Docs](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency)で指示されているように、Info.plistにキー`NSSupportsLiveActivitiesFrequentUpdates`をBoolean型でYESとして追加できます。Live Activityがプッシュ予算を超えると、ユーザーにダイアログが表示され、Live Activityを続行することを許可すると、シームレスなユーザーエクスペリエンスのために予算が自動的に増加します。
</Note>

### 3. SDKを追加する

<Tabs>
  <Tab title="パッケージマネージャー">
    <Note>
      ラッパーSDK（例：**Flutter**）でSPMが有効になっている場合、このステップはスキップできます。OneSignalパッケージはすでに解決されており、すべてのターゲットで利用可能です。
    </Note>

    Widget Extensionターゲットで、**一般 > フレームワーク、ライブラリ、および埋め込みコンテンツ**の下に`OneSignalFramework`を追加します：

    <Frame caption="Widget ExtensionターゲットにOneSignalFrameworkを追加します">
      <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/add-one-signal-framework.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=386781616958e5a80a5cfec5ee143dcb" width="2392" height="1488" data-path="images/live-activities/add-one-signal-framework.png" />
    </Frame>
  </Tab>

  <Tab title="Cocoapods">
    プロジェクトのTargetsリストでWidget Extensionターゲットの名前を見つけます。例の名前は`OneSignalWidgetExtension`です。

    <Frame caption="Widget Extensionターゲットの名前を見つけます">
      <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/cocoapods-la-extension-name.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=850a91387539587802306a66771435eb" width="2166" height="1488" data-path="images/live-activities/cocoapods-la-extension-name.png" />
    </Frame>

    `Podfile`を開き、次のコードを追加します。`OneSignalWidgetExtension`をWidget Extensionターゲットの名前に置き換えます。

    <CodeGroup>
      ```ruby Podfile theme={null}
      target 'OneSignalWidgetExtension' do
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
      end
      ```

      ```ruby Full Podfile example theme={null}
      # Uncomment the next line to define a global platform for your project
      # platform :ios, '9.0'

      target 'Demo Momenta' do
        # Comment the next line if you don't want to use dynamic frameworks
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
        pod 'OneSignal/OneSignalInAppMessages', '>= 5.0.0', '< 6.0'
      end

      target 'OneSignalNotificationServiceExtension' do
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
      end

      target 'OneSignalWidgetExtension' do
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
      end
      ```
    </CodeGroup>

    Xcodeを閉じて、`pod repo update && pod install`を実行して`OneSignalLiveActivities` podをインストールします。

    これを行った後も「No such module 'OneSignalLiveActivities'」エラーが表示され続ける場合は、**「Widget Extensionターゲット」> 一般 > フレームワークとライブラリ > +アイコン**に移動して、依存関係を手動で追加できます。`OneSignalLiveActivities`フレームワークを選択します：

    <Frame caption="依存関係を手動で追加します">
      <img src="https://mintcdn.com/onesignal/YOTSrtBSoqdrJ37A/images/docs/427d54ef84e97edaf0a7c3b158b48b3bec7305fb1764db9dd4ef7c340d77bc6c-image.png?fit=max&auto=format&n=YOTSrtBSoqdrJ37A&q=85&s=f7ba0aa4234ef69ebd7820ef5e50a18b" width="1273" height="881" data-path="images/docs/427d54ef84e97edaf0a7c3b158b48b3bec7305fb1764db9dd4ef7c340d77bc6c-image.png" />
    </Frame>
  </Tab>
</Tabs>

### 4. ウィジェット属性とUIを定義する

`your-nameLiveActivity.swift`ファイル（例：`OneSignalWidgetLiveActivity.swift`）を開いて、構造体のプロパティを定義し、ウィジェットUIを変更します。

* `your-nameAttributes`は、Live Activityの静的コンテンツを説明します。
* `ContentState`は、Live Activityの動的コンテンツを説明します。

例に従っている場合は、以下のコードをあなたの `OneSignalWidgetLiveActivity.swift`ファイルにコピーペーストします。

```swift your-nameLiveActivity.swift theme={null}
import ActivityKit
import WidgetKit
import SwiftUI
// OneSignalLiveActivitiesモジュールをインポート
// モジュールが見つからないというエラーが発生した場合は、ステップ3に戻り、OneSignalLiveActivities podが正しく追加されていることを確認してください。
import OneSignalLiveActivities

// OneSignalLiveActivityAttributesから継承するように更新
// これはLive Activityを開始するためのAPIリクエストで使用されます
struct OneSignalWidgetAttributes: OneSignalLiveActivityAttributes  {
    // OneSignalLiveActivityContentStateから継承するように更新
    public struct ContentState: OneSignalLiveActivityContentState {
        // アクティビティに関する動的なステートフルプロパティをここに配置します！
        var emoji: String
        // OneSignalLiveActivityContentStateData?への参照を追加
        var onesignal: OneSignalLiveActivityContentStateData?
    }
    // アクティビティに関する固定の変更されないプロパティをここに配置します！
    var name: String
    // OneSignalLiveActivityAttributeDataへの参照を追加
    var onesignal: OneSignalLiveActivityAttributeData
}

struct OneSignalWidgetLiveActivity: Widget {
    var body: some WidgetConfiguration {
      // `for: 属性構造体の名前`を使用するように更新
      // これはLive Activityを開始するためのAPIリクエストで使用されます
        ActivityConfiguration(for: OneSignalWidgetAttributes.self) { context in
            // ロック画面/バナーUIをここに配置
            // ペイロード経由で送信された属性を表示するように更新
            VStack {
                Text("Hello \(context.attributes.name) \(context.state.emoji)")
            }
            .activityBackgroundTint(Color.cyan)
            .activitySystemActionForegroundColor(Color.black)

        } dynamicIsland: { context in
            DynamicIsland {
                // 拡張UIをここに配置。leading/trailing/center/bottomなどの
                // さまざまな領域を通じて拡張UIを構成します
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom \(context.state.emoji)")
                    // 追加のコンテンツ
                }
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T \(context.state.emoji)")
            } minimal: {
                Text(context.state.emoji)
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}
```

### 5. メインターゲットメンバーシップを許可する

<Note>
  このステップはカスタム属性（例：`OneSignalWidgetAttributes`）を使用する場合にのみ必要です。`DefaultLiveActivityAttributes`を使用している場合は、このステップをスキップしてください。このタイプはOneSignal SDKによって提供されており、メインアプリターゲットからすでにアクセス可能です。
</Note>

`your-nameLiveActivity.swift`ファイルの**ターゲットメンバーシップ**リストにメインアプリターゲットを追加します。これは、メインアプリターゲットがセットアップ呼び出し（ステップ6）でカスタム属性構造体を参照できるようにするために必要です。

Xcodeで、画面の右側にあるInspectorパネルを開きます。**ターゲットメンバーシップ**内で、\*\*+\*\*ボタンをクリックし、`ContentView`とOneSignal初期化コードを含むメインアプリターゲットを選択します。

<Frame caption="メインターゲットメンバーシップを許可します">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/target-membership.png?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=3315253623dfec6c13a56ff30a156772" width="2392" height="1488" data-path="images/live-activities/target-membership.png" />
</Frame>

### 6. AppDelegateにセットアップメソッドを追加する

OneSignal SDK初期化の後、`AppDelegate`で`OneSignal.LiveActivities.setup`を呼び出します。

`OneSignalWidgetAttributes`をLive Activity属性構造体の名前に置き換えます。

```swift AppDelegate theme={null}
// OneSignalLiveActivitiesモジュールをインポート
import OneSignalLiveActivities

// これはOneSignal SDKの初期化後に追加する必要があります
if #available(iOS 16.1, *) {
	OneSignal.LiveActivities.setup(OneSignalWidgetAttributes.self)
  // 複数のLive Activitiesがある場合は、setupメソッドでここに追加できます
  // OneSignal.LiveActivities.setup(LiveActivityWidgetAttributes-2.self)
}
```

これにより、ActivityKit非同期シーケンスを使用して更新を管理および報告します。

<Warning>
  アプリで次のシーケンスを直接使用する場合、OneSignal Live Activityの動作に干渉する可能性があります：

  * activityStateUpdates
  * pushTokenUpdates
  * pushToStartTokenUpdates
  * activityUpdates
</Warning>

***

## Live Activityを開始する

デバイスでLive Activityを開始するには2つのオプションがあります：

<Tabs>
  <Tab title="Push-to-start">
    [Push To Start APIリクエスト](/reference/start-live-activity)を送信します。すべての名前とIDがウィジェットの構成と正確に一致することを確認してください（パラメーターは大文字小文字を区別します）。何かが欠落しているか、誤って追加された場合、ウィジェットの起動時に問題が発生する可能性があります。

    上記の例で機能するリクエストの例を次に示します。

    置き換え：

    * `YOUR_APP_ID`をOneSignal App IDに置き換えます。
    * `YOUR_APP_API_KEY`をOneSignal APIキーに置き換えます。
    * `OneSignalWidgetAttributes`をWidget Attributes構造体の名前に置き換えます。

      ```curl curl theme={null}
      curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/activities/activity/OneSignalWidgetAttributes' \
      --header 'Authorization: key YOUR_APP_API_KEY' \
      --header 'Content-Type: application/json' \
      --data '{
          "event": "start",
          "activity_id": "push-to-start",
          "included_segments": [
              "Subscribed Users"
          ],
          "event_attributes": {
              "name": "World"
          },
          "event_updates": {
              "emoji":"🤩"
          },
          "name": "Live Activities Test",
          "contents": {
              "en": "A push started this Live Activity"
          },
          "headings": {
            "en": "Live Activity Started"
          }
        }'
      ```

    提供されたサンプルコードに従っている場合、デバイスのロック画面にLive Activityが表示されます。

    <Frame caption="ロック画面のLive Activity">
      <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-lock-screen.jpg?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=8abc098ce8772b1c457e5f1effc8c14e" width="900" height="385" data-path="images/live-activities/live-activity-lock-screen.jpg" />
    </Frame>

    <Check>
      push-to-startでLive Activityを正常に開始しました！

      ユーザーは更新を受け取り続けるために「許可」を選択する必要があります。
    </Check>
  </Tab>

  <Tab title="Trigger-in-app">
    アプリを操作している間に、ユーザーにLive Activityをトリガーさせることができます。

    たとえば、ユーザーがアクティブなイベントを進行中（注文した、ゲームが進行中、イベントが開始されようとしているなど）にアプリを開いたときに、Live Activityを自動的に表示できます。

    この例では、ボタンを使用してLive Activityを手動で開始します。

    ```swift theme={null}
    import SwiftUI
    import ActivityKit
    import OneSignalFramework
    import OneSignalLiveActivities

    struct ContentView: View {
      @StateObject private var viewModel = LiveActivityViewModel()

      var body: some View {
        VStack {
          Button("Start Live Activity") {
            viewModel.startLiveActivity()
          }
        }
      }
    }

    class LiveActivityViewModel: ObservableObject {

      func startLiveActivity() {
        let osAttributes = OneSignalLiveActivityAttributeData.create(activityId: "click-to-start")
        let attributes = OneSignalWidgetAttributes(name: "OneSignal", onesignal: osAttributes)
        let contentState = OneSignalWidgetAttributes.ContentState(emoji:"🤩", onesignal: nil)
        do {
            let activity = try Activity<OneSignalWidgetAttributes>.request(
                attributes: attributes,
                contentState: contentState,
                pushType: .token)
        } catch {
            print(error.localizedDescription)
        }
      }
    }
    ```

    ボタンをクリックすると、Live Activityが起動します。
  </Tab>
</Tabs>

***

## Live Activityのクリックを追跡する

OneSignalのクリック追跡を実装することで、ユーザーがLive ActivitiesとDynamic Islandをタップしたときを追跡します。これにより、エンゲージメントを測定し、オプションでユーザーをアプリ内の特定のコンテンツにディープリンクできます。

### ステップ1: ウィジェットにクリック追跡を追加する

Live Activityウィジェット内のクリックを追跡したいUIコンポーネントに`.onesignalWidgetURL()`モディファイアを追加します：

```swift theme={null}
import OneSignalLiveActivities

struct ExampleAppFirstWidget: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: ExampleAppFirstWidgetAttributes.self) { context in
            VStack {
                Spacer()
                Text("Sample Text " + context.attributes.title).font(.headline)
                // Other UI code
            }
            .onesignalWidgetURL(URL(string: "myapp://settings"), context: context)
            // Pass nil if you don't need deep linking: .onesignalWidgetURL(nil, context: context)
        } dynamicIsland: { context in
            DynamicIsland {
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                // Other Dynamic Island regions
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T")
            } minimal: {
                Text("Min")
            }
            .onesignalWidgetURL(URL(string: "myapp://settings"), context: context)
            // Optional: Track Dynamic Island clicks separately
        }
    }
}
```

**重要な考慮事項：**

* ディープリンク用のURLを渡すか、ナビゲーションなしでクリック追跡のみを行う場合は`nil`を渡すことができます
* `.onesignalWidgetURL()`を使用している場合、ビュー階層にAppleの`.widgetURL()`モディファイアを**含めることはできません**
* 両方のクリックを追跡したい場合は、メインのLive ActivityビューとDynamic Islandの両方にモディファイアを適用します

### ステップ2: アプリでURLを処理する

クリックを追跡しユーザーを適切にルーティングするために、アプリにURLハンドリングを追加します：

```swift theme={null}
import OneSignalLiveActivities

// AppDelegateの例：
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let originalURL = OneSignal.LiveActivities.trackClickAndReturnOriginal(url)

    // 元のURLを処理してユーザーをナビゲート
    if let url = originalURL {
        // カスタムURLルーティングロジック
        return handleDeepLink(url)
    }
    return false
}

// SceneDelegateの例：
func scene(_ scene: UIScene, openURLContexts URLContexts: Set) {
    guard let url = URLContexts.first?.url else { return }

    let originalURL = OneSignal.LiveActivities.trackClickAndReturnOriginal(url)

    if let url = originalURL {
        // カスタムURLルーティングロジック
        handleDeepLink(url)
    }
}

// SwiftUIの例：
.onOpenURL { url in
    let originalURL = OneSignal.LiveActivities.trackClickAndReturnOriginal(url)

    if let url = originalURL {
        // カスタムURLルーティングロジック
        handleDeepLink(url)
    }
}
```

`trackClickAndReturnOriginal()`メソッドは、OneSignalでクリックを自動的に追跡し、アプリが処理するためにウィジェットで指定した元のURLを返します。

***

## Live Activityを更新する

[Update Live Activity API](/reference/update-live-activity-api)を使用してアクティブなウィジェットを更新します。

アクティビティを開始するときに使用した`activity_id`と一致させます。

このサンプルリクエストは、定義した`activity_id`が`push-to-start`というタイトルであるため、push-to-startウィジェットを更新します。
click-to-startウィジェットを更新するには、リクエストパスを`push-to-start`の代わりに`click-to-start`を使用するように更新します。

```curl curl theme={null}
curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/live_activities/push-to-start/notifications' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: key YOUR_API_KEY' \
--data '{
    "event": "update",
    "event_updates": {
        "emoji": "😎"
    },
    "contents": {
        "en": "A push updated this Live Activity"
    },
    "name": "Live Activity Updated"
}'
```

<Frame caption="Live Activity更新">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-updated.jpg?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=729ab3b33c297c15e52617ebd065b293" width="895" height="152" data-path="images/live-activities/live-activity-updated.jpg" />
</Frame>

<Check>
  Live Activityを正常に更新しました！

  Live Activityの更新の詳細については、[Update Live Activity API](/reference/update-live-activity-api)をご覧ください。
</Check>

***

## Live Activityを終了する

同じ[Update Live Activity API](/reference/update-live-activity-api)を使用して、`"event": "end"`を設定することでLive Activityを終了できます。

```curl curl theme={null}
curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/live_activities/my_activity_id/notifications' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: key YOUR_API_KEY' \
--data '{
    "event": "end",
    "event_updates": {
        "emoji": "👋"
    },
    "contents": {
        "en": "A push ended this Live Activity"
    },
    "name": "Live Activity Ended"
}'
```

Live Activityが終了する他の方法：

* SDK の[`exit()`メソッド](./mobile-sdk-reference#exit)を使用する。
* ユーザーが手動でLive Activityをスワイプして削除する。
* ユーザーがiOS設定でLive Activitiesの権限を取り消す。

<Frame caption="Live Activity終了">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-ended.jpg?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=734a62b67cb2fe989203087a22945448" width="1218" height="200" data-path="images/live-activities/live-activity-ended.jpg" />
</Frame>

<Check>
  Live Activityを正常に終了し、例を完了しました！
</Check>

***

## ベストプラクティスと推奨事項

### デザインに関する考慮事項

* Appleの[Live Activities Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/live-activities)に従ってください。
  * 重要な情報を優先して、一目で理解しやすくします。
  * Dynamic Islandに注意を引く要素をアプリに追加しないでください。
  * マージンを使用し、要素間のスペースを維持します。
  * 背景に太字の色を使用します。ライトモードとダークモードの両方をデザインします。

### 機能性

* Appleは、各[Live Activityプレゼンテーション](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities#Review-Live-Activity-presentations)をサポートする必要があります。
  * [Compact](https://developer.apple.com/design/human-interface-guidelines/live-activities#Compact-presentation)
  * [Minimal](https://developer.apple.com/design/human-interface-guidelines/live-activities#Minimal-presentation)
  * [Expanded](https://developer.apple.com/design/human-interface-guidelines/live-activities#Expanded-presentation)
  * [ロック画面](https://developer.apple.com/design/human-interface-guidelines/live-activities#The-Lock-Screen)
* [ディープリンク](https://developer.apple.com/design/human-interface-guidelines/live-activities#Offering-interactivity)をテストします。
* Appleの[Live ActivitiesでライブデータをDisplaying](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities)に関するガイドをレビューします。
* Live Activityに機密情報を表示しないでください。

### フォールバックメッセージの設定

Live Activityが開始された後、ユーザーが更新を受信できない場合は、アプリを開くことでアクティビティが更新されます。最初の更新を送信することを見込んでいる時点以降の将来の日時に[stale date](/reference/start-live-activity#body-stale-date)を設定します。更新を受信していないユーザーには、代わりにフォールバックメッセージが表示されます。

ウィジェットUIでこの「stale」状態をリッスンして、フォールバックメッセージを表示できます：

<Frame caption="Live Activityがstaleになったときに表示されるフォールバックメッセージ。">
  <img src="https://mintcdn.com/onesignal/CKWnlQN-faoVTpm2/images/live-activities/live-activity-refresh.png?fit=max&auto=format&n=CKWnlQN-faoVTpm2&q=85&s=180ef1cc07313ef04361fbd45e2fec24" alt="フォールバックメッセージを表示しているLive Activityウィジェット" width="509" height="181" data-path="images/live-activities/live-activity-refresh.png" />
</Frame>

```swift theme={null}
struct ptsLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: ptsAttributes.self) { context in
            //stale dateの後にtrueになります
            let isStale = context.isStale
            if !isStale{
                VStack {
                    Text("\(context.attributes.name) \(context.state.emoji)")
                        .activityBackgroundTint(Color.cyan)
                        .activitySystemActionForegroundColor(Color.black)
                }
            }  else {
            //メッセージがstaleの場合、ユーザーにウィジェットをクリックしてアプリを開くように要求します
                VStack {
                    Text("Something went wrong, please click to refresh")
                }
            }
            // ... ウィジェットUIの残り
        }
    }
}
```

***

## FAQ

### 高優先度更新の予算は何ですか？

Appleは高優先度（`priority: 10`）更新に固定制限を提供していませんが、動的なシステムレベルの予算を適用しています。短期間に高優先度更新を送信しすぎると、更新が遅延またはドロップされるスロットリングが発生する可能性があります。

スロットリングのリスクを軽減するには：

* 優先度レベルを混在させる：Appleは、バランスを取るために`priority: 5`（標準）と`priority: 10`（高）の両方を使用することを推奨しています。
* `priority: 10`は、時間に敏感または重要な更新のみに予約します（例：注文ステータスの変更、ゲームスコア）。

ユースケースで頻繁な更新が必要な場合：

* アプリの`Info.plist`ファイルに`NSSupportsLiveActivitiesFrequentUpdates`キーをBoolean `YES`として追加します。
* この予算を超えると、iOSはユーザーに追加の更新を許可するように促す場合があります。ユーザーが同意すると、Appleはシームレスなエクスペリエンスを維持するために、許可された更新制限を自動的に拡張します。

詳細については、[AppleのDeveloper Docs](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency)を参照してください。

### メインアプリからLive Activity更新を読み取ることはできますか？

はい。デバッグまたはUI同期のために更新を監視できます：

```swift theme={null}
Task {
    for await content in activity.contentUpdates {
        print("LA activity id: \(activity.id), content update: \(content.state)")
    }
}
// 出力例：
// LA activity id: EFE6D54D-F7E1-45EF-9514-4C2598F8DED2, content update: ContentState(message: "My message from payload")
```

ライフサイクルの変更を追跡：

```swift theme={null}
Task {
    for await state in activity.activityStateUpdates {
        print("LA state update: \(state)")
        //状態に基づいて何かをしたい場合は、これを使用します：
      	if state != ActivityState.active {
            //ここで何かを行う
        }
    }
}

// 出力例 1 - LAは終了したが、まだ表示されている
// LA state update: active

/* StateはActivityState列挙型の4つの可能な値のいずれかになります
active、dismissed、ended、stale
*/
```

### APIが400を返し、サブスクライバー制限を超えているというエラーメッセージが表示されました。どうすればよいですか？

プッシュサブスクライバー数がプランのプッシュサブスクライバー数を超えている場合は、アカウントを次のプランにアップグレードするか、`support@onesignal.com`にお問い合わせください。最新のプラン詳細については、[こちらをご覧ください](https://onesignal.com/pricing)。

### プッシュとLive Activitiesの両方を送信しないようにするにはどうすればよいですか？

アプリケーションは既に一連のプッシュ通知を送信している可能性があり、設計したLive Activityがこれらのプッシュ通知の必要性を置き換えます。たとえば、プッシュ経由でスコア更新を送信している場合、これをLive Activityで置き換えることができます。

ユーザーがメッセージを受け取りすぎないようにするために、ユーザーがLive Activityにオプトインするときにデータタグを追加することをお勧めします。このデータタグを追加することで、同じまたは類似のコンテンツを含む可能性のあるプッシュメッセージからこのデータタグを持つユーザーを除外できます。詳細については、[データタグ](./add-user-data-tags)と[セグメント](./segmentation)をご覧ください。

***

## トラブルシューティング

### 受信者なし

Live Activityを開始または更新しようとするときにユーザーが見つかるようにするには、アクティビティタイプ、ウィジェット、およびcURLリクエストのすべてに一致する値があることを確認する必要があります。

1. リクエストのパスパラメーターをチェックして、正しくフォーマットされたリクエストをサーバーに送信していることを確認します。App IDは`OneSignal.Initialize`メソッドで使用したApp IDと一致する必要があり、アクティビティタイプはLive Activityファイルで定義したタイプと一致する必要があります。

2. [Push To Start APIリクエスト](/reference/start-live-activity)の本文には、次のパラメーターが必要です：

* `event`: `"start"`
* `event_updates`: アクティビティタイプの下の構造体で定義した動的データで、ウィジェットで使用されます。リクエスト、タイプ、ウィジェット間で大文字小文字と変数がすべて一致することを確認してください。
* `event_attributes`: 静的データはEvent Updatesと同じロジックに従い、使用中のすべての変数を含める必要があり、Live Activityのすべての部分とリクエスト全体で一致する必要があります
* `activity_id`: これによりウィジェットにIDが割り当てられ、ユーザーのデバイスで起動された後にアクティビティを更新するために使用されます。
* `name`: Live Activity名。
* `contents`: プッシュ送信に必要なメッセージコンテンツ。
* `headings`: プッシュ送信に必要なメッセージ見出し。
* `included_segments`のようなターゲティングパラメーター。[利用可能なオプション](/reference/create-message)。

### アクティビティが送信されたが、受信されない

1. リクエストが正しくフォーマットされていることを確認します。ウィジェットで使用されているフィールドが省略されている場合、アクティビティが起動または更新されない可能性があります。

2. APIリクエストで、設定している`priority`レベルを確認します。これを`10`（最高優先度）に設定している場合は、`5`に下げて再度テストしてください。Appleは独自の内部レート制限に従って、頻繁に送信されるリクエストをスロットルします。

ユースケースでより頻繁な更新が必要な場合は、[AppleのDeveloper Docs](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency)で指示されているように、Info.plistにBoolean型でYESに設定された`NSSupportsLiveActivitiesFrequentUpdates`キーを追加します。Live Activityがプッシュ予算を超えると、ユーザーにダイアログが表示され、ユーザーがLive Activityの継続を許可すると、シームレスなユーザーエクスペリエンスのために予算が自動的に増加します。

<Info>
  サポートが必要ですか？

  サポートチームとチャットするか、`support@onesignal.com`にメールしてください

  以下を含めてください：

  * 発生している問題の詳細と再現手順（利用可能な場合）
  * OneSignal App ID
  * 該当する場合は、External IDまたはSubscription ID
  * 該当する場合は、OneSignalダッシュボードでテストしたメッセージのURL
  * 関連する[ログまたはエラーメッセージ](/docs/ja/capturing-a-debug-log)

  お気軽にお問い合わせください！
</Info>

***
