---
title: "OneSignal"
description: "Adapty と OneSignal を連携してプッシュ通知ベースのエンゲージメントを向上させましょう。"
---

[OneSignal](https://onesignal.com/) は、プッシュ通知・メール・SMS・アプリ内メッセージングを提供する主要なカスタマーエンゲージメントプラットフォームです。Adapty と OneSignal を連携することで、すべてのサブスクリプションイベントを一か所で確認でき、それらのイベントをトリガーとした自動コミュニケーションを設定できます。

Adapty を使えば、複数のストアにわたる[サブスクリプションイベント](events)を追跡し、ユーザー行動を分析して、よりターゲットを絞ったコミュニケーションに活用できます。この連携により、OneSignal ダッシュボード内でサブスクリプションイベントを監視し、[獲得キャンペーン](https://documentation.onesignal.com/docs/en/automated-messages)にマッピングすることが可能です。

Adapty はサブスクリプションイベントに基づいて OneSignal のタグを更新するため、最小限の設定でパーソナライズされたプッシュ通知を配信できます。

**連携の特性**

| 連携の特性 | 説明 |
| :------------------------- | :----------------------------------------------------------- |
| スケジュール | リアルタイム更新 |
| データの方向 | 一方向：Adapty から OneSignal サーバーへ |
| Adapty の連携ポイント | <ul><li>モバイルアプリのコード内の OneSignal と Adapty SDK</li><li>Adapty サーバー</li></ul>|

## OneSignal 連携の設定 \{#setting-up-one-signal-integration\}

連携を設定するには：

1. Adapty ダッシュボードの [Integrations → OneSignal](https://app.adapty.io/integrations/onesignal) を開きます。

   
     <img src="/assets/shared/img/onesignal-on.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   

2. 連携トグルを有効にします。
3. **OneSignal App ID** を入力します。

OneSignal との連携を設定するには、Adapty ダッシュボードの [Integrations -> OneSignal](https://app.adapty.io/integrations/onesignal) に移動し、トグルをオンにして連携の認証情報を設定してください。

## OneSignal App ID の取得 \{#retrieving-your-onesignal-app-id\}

**OneSignal App ID** は [OneSignal ダッシュボード](https://dashboard.onesignal.com/login)で確認できます：

1. **Settings** → **Keys & IDs** に移動します。

   
     <img src="/assets/shared/img/onesignal-dashboard.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   

2. **OneSignal App ID** をコピーして、Adapty ダッシュボードの **App ID** フィールドに貼り付けます。

   
     <img src="/assets/shared/img/onesignal-id.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   

OneSignal ID の詳細については、[こちらのドキュメント](https://documentation.onesignal.com/docs/en/keys-and-ids)をご覧ください。

### イベントの設定 \{#configuring-events\}

Adapty では、3 つのグループのイベントを OneSignal に送信できます。Adapty ダッシュボードで必要なものをトグルでオンにしてください。利用可能なイベントの完全なリストと詳細な説明は[こちら](events)で確認できます。

  <img src="/assets/shared/img/onesignal.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

Adapty はサーバー間連携を使用してサブスクリプションイベントを OneSignal に送信するため、OneSignal ですべてのサブスクリプション関連のアクティビティを追跡できます。

:::warning

2023 年 4 月 17 日より、OneSignal の無料プランではこの連携がサポートされなくなりました。**Growth**、**Professional**、およびそれ以上のプランでのみ利用可能です。詳細は [OneSignal Pricing](https://onesignal.com/pricing) をご覧ください。

:::

## カスタムタグ \{#custom-tags\}

この連携では、Adapty ユーザーのさまざまなプロパティをタグとして更新・付与し、OneSignal に送信します。以下のタグ一覧から、ニーズに合ったものをご確認ください。
:::warning
OneSignal にはタグの上限があります。これには Adapty が生成するタグと OneSignal に既存するタグの両方が含まれます。上限を超えると、イベント送信時にエラーが発生する可能性があります。
:::

| タグ | 型 | 説明 |
|---|----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `adapty_customer_user_id` | String | アプリ内でのユーザーの一意の識別子。システム、Adapty、OneSignal 全体で一貫している必要があります。 |
| `adapty_profile_id` | String | Adapty のユーザープロファイル ID。[Adapty ダッシュボード](profiles-crm)で確認できます。 |
| `environment` | String | ユーザーの現在の環境を示す `Sandbox` または `Production`。 |
| `store` | String | プロダクトが購入されたストア。選択肢：**app_store**、**play_store**、**stripe**、または[カスタムストア](custom-store)の名前。 |
| `vendor_product_id` | String | アプリストアにおけるプロダクト ID（例：`org.locals.12345`）。 |
| `subscription_expires_at` | String | 最新のサブスクリプションの有効期限（`YYYY-MM-DDTHH:MM:SS+0000`、例：`2023-02-10T17:22:03.000000+0000`）。 |
| `last_event_type` | String | [Adapty イベントリスト](events)における最新のイベントタイプ。<br/> 注意点：<br/>- **Subscription expired** イベントの場合、Adapty は `last_event_type` プロパティを `subscription_cancelled` として送信します。<br/>- **Trial renew canceled** の場合は `auto_renew_off` として送信します。<br/>- **Subscription renew canceled** の場合は `auto_renew_off_subscription` として送信します。 |
| `purchase_date` | String | 最後のトランザクション日時（`YYYY-MM-DDTHH:MM:SS+0000`、例：`2023-02-10T17:22:03.000000+0000`）。 |
| `active_subscription` | String | ユーザーがアクティブなサブスクリプションを持つ場合は `true`、サブスクリプションが終了している場合は `false`。 |
| `period_type` | String | 購入または更新における最新の期間タイプを示します。使用可能な値：試用期間の場合は `trial`、それ以外のすべての場合は `normal`。 |

すべての float 値は整数に丸められます。文字列はそのまま変更されません。

事前定義されたタグに加えて、[カスタム属性](segments#custom-attributes)をタグとして送信することで、含めるデータの柔軟性を高めることができます。これは、プロダクトやサービスに関連する特定の詳細を追跡するのに役立ちます。

カスタムユーザー属性は、[連携ページ](https://app.adapty.io/integrations/onesignal)の **Send user attributes** チェックボックスが有効になっている場合、自動的に OneSignal に送信されます。チェックを外した場合、Adapty はちょうど 10 個のタグを送信します。チェックを入れると 10 個を超えるタグを送信でき、より多くのデータをキャプチャできます。

## SDK の設定 \{#sdk-configuration\}

OneSignal と Adapty を連携する方法は 2 つあります：

1. **レガシー（v5 以前）：** `playerId` を使用します（[OneSignal SDK v5](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/5.0.0) では非推奨）。
2. **現行（v5 以降）：** `subscriptionId` を使用します。

:::warning
Adapty に `playerId`（OneSignal SDK v5 以前の場合）または `subscriptionId`（OneSignal SDK v5 以降の場合）を必ず送信してください。これを行わないと、OneSignal のタグが更新されず、連携が正しく機能しません。
:::

<Tabs groupId="current-version" queryString> 
<TabItem value="v5+" label="OneSignal SDK v5+ (current)" default> 

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS (Swift)" default>

```swift showLineNumbers
// SubscriptionID
OneSignal.Notifications.requestPermission({ accepted in
    Task {
        // Adapty SDK 4.x
        try await Adapty.setIntegrationIdentifier(.oneSignalSubscriptionId(OneSignal.User.pushSubscription.id))
        // Adapty SDK 3.x
        try await Adapty.setIntegrationIdentifier(
            key: "one_signal_subscription_id", 
            value: OneSignal.User.pushSubscription.id
        )
    }
}, fallbackToSettings: true)
```

</TabItem>
<TabItem value="kotlin" label="Android (Kotlin)" default>

```kotlin showLineNumbers
// SubscriptionID
val oneSignalSubscriptionObserver = object: IPushSubscriptionObserver {
    override fun onPushSubscriptionChange(state: PushSubscriptionChangedState) {
        Adapty.setIntegrationIdentifier("one_signal_subscription_id", state.current.id) { error ->
            if (error != null) {
                // handle the error
            }
        }
    }
}
```

</TabItem>
<TabItem value="java" label="(Android) Java" default>

```java showLineNumbers
// SubscriptionID
IPushSubscriptionObserver oneSignalSubscriptionObserver = state -> {
    Adapty.setIntegrationIdentifier("one_signal_subscription_id", state.getCurrent().getId(), error -> {
        if (error != null) {
            // handle the error
        }
    });
};
```

</TabItem>  

<TabItem value="flutter" label="Flutter (Dart)" default>

```javascript showLineNumbers
// 1. Since OneSignal.User.pushSubscription.id may return null if called too early, 
// OneSignal suggests to listen for the updates:

OneSignal.User.pushSubscription.addObserver((state) {
   if (state.current.optedIn) {
      // now you can try to retrieve subscriptionId
   }
});

// 2. Then you can push subscriptionId to Adapty:
final subscriptionId = OneSignal.User.pushSubscription.id;
if (subscriptionId != null) {
   await Adapty().setIntegrationIdentifier(key: "one_signal_subscription_id", value: subscriptionId);
}
```

</TabItem>
<TabItem value="unity" label="Unity (C#)" default>

```csharp showLineNumbers
using AdaptySDK;
using OneSignalSDK;

var pushUserId = OneSignal.Default.PushSubscriptionState.userId;

Adapty.SetIntegrationIdentifier(
  "one_signal_player_id", 
  pushUserId, 
  (error) => {
  // handle the error
});
```

</TabItem>
<TabItem value="rn" label="React Native (TS)" default>

```typescript showLineNumbers

OneSignal.User.pushSubscription.addEventListener('change', (subscription) => {
  const subscriptionId = subscription.current.id;

  if (subscriptionId) {
    adapty.setIntegrationIdentifier("one_signal_subscription_id", subscriptionId);
  }
});
```

</TabItem>
</Tabs>

 </TabItem> 

<TabItem value="pre-v5" label="OneSignal SDK v. up to 4.x (legacy)" default> 

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS (Swift)" default>

```swift showLineNumbers
// PlayerID
// in your OSSubscriptionObserver implementation
func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges) {
    if let playerId = stateChanges.to.userId {
        Task {
            // Adapty SDK 4.x
            try await Adapty.setIntegrationIdentifier(.oneSignalPlayerId(playerId))
            // Adapty SDK 3.x
            try await Adapty.setIntegrationIdentifier(
                key: "one_signal_player_id", 
                value: playerId
            )
        }
    }
}
```

</TabItem>
<TabItem value="kotlin" label="Android (Kotlin)" default>

```kotlin showLineNumbers
// PlayerID
val osSubscriptionObserver = OSSubscriptionObserver { stateChanges ->
    stateChanges?.to?.userId?.let { playerId ->
        Adapty.setIntegrationIdentifier("one_signal_player_id", playerId) { error ->
            if (error != null) {
                // handle the error
            }
        }
    }
}
```

</TabItem>
<TabItem value="java" label="Java" default>

```java showLineNumbers
// PlayerID
OSSubscriptionObserver osSubscriptionObserver = stateChanges -> {
    OSSubscriptionState to = stateChanges != null ? stateChanges.getTo() : null;
    String playerId = to != null ? to.getUserId() : null;
    
    if (playerId != null) {
        Adapty.setIntegrationIdentifier("one_signal_player_id", playerId, error -> {
            if (error != null) {
                // handle the error
            }
        });
    }
};
```

</TabItem>  

<TabItem value="flutter" label="Flutter (Dart)" default>

```javascript showLineNumbers
// PlayerID (pre-v5 OneSignal SDK)
// in your OSSubscriptionObserver implementation
func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges) {
    if let playerId = stateChanges.to.userId {
        Task {
            try await Adapty.setIntegrationIdentifier(
                key: "one_signal_player_id", 
                value: playerId
            )
        }
    }
}
```

</TabItem>
<TabItem value="rn" label="React Native (TS)" default>
```typescript showLineNumbers

OneSignal.addSubscriptionObserver(event => {
  const playerId = event.to.userId;
  
  adapty.setIntegrationIdentifier("one_signal_player_id", playerId);
});
```

</TabItem>
</Tabs>

 </TabItem> 

</Tabs>

OneSignal ドキュメントの詳細はこちらをご覧ください：

- [プッシュサブスクリプション ID](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#user-pushsubscription-id)
- [プッシュサブスクリプションの変更](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#addobserver-push-subscription-changes)

## 複数デバイスへの対応 \{#dealing-with-multiple-devices\}

ユーザーが複数のデバイスを持っている場合、購入イベントやサブスクリプションの追跡が難しくなることがあります。OneSignal では、[external user ID](https://documentation.onesignal.com/docs/en/users) を使ってこの問題に対処できます。

デバイス間でユーザーデータを一貫させるには：

1. **サーバーサイド**で異なるデバイスを照合し、そのデータを OneSignal に送信します。
2. Adapty の [customer_user_id](identifying-users) を OneSignal の [externalUserId](https://documentation.onesignal.com/docs/en/users#external-id) として使用します。アプリに登録システムがない場合は、ユーザーのデバイス間で一貫性を保つ別の一意の識別子の使用を検討してください。

すべてのデバイスでユーザー識別子の一貫性を維持し、ユーザーの ID が変わるたびに OneSignal を更新することが重要です。これにより、ユーザーのアクティビティとサブスクリプションの追跡が簡素化され、一貫したメッセージングが確保されるとともに、より正確な分析とより良いユーザー体験が実現できます。詳細については、OneSignal の [external user ID ドキュメント](https://documentation.onesignal.com/docs/en/users)をご覧ください。