---
title: "OneSignal"
description: "Интегрируйте OneSignal с Adapty для улучшения вовлечённости через push-уведомления."
---

[OneSignal](https://onesignal.com/) — ведущая платформа для взаимодействия с пользователями, предлагающая push-уведомления, email, SMS и встроенные сообщения. Интеграция Adapty с OneSignal позволяет отслеживать все события подписок в одном месте и настраивать автоматические коммуникации на их основе.

С помощью Adapty вы можете отслеживать [события подписок](events) в нескольких сторах, анализировать поведение пользователей и использовать эти данные для более точечных коммуникаций. Интеграция позволяет следить за событиями подписок в дашборде OneSignal и привязывать их к [рекламным кампаниям](https://documentation.onesignal.com/docs/en/automated-messages).

Adapty обновляет теги OneSignal на основе событий подписок, что позволяет отправлять персонализированные push-уведомления с минимальными настройками.

**Характеристики интеграции**

| Характеристика интеграции | Описание                                                     |
| :------------------------ | :----------------------------------------------------------- |
| Расписание                | Обновления в реальном времени                                |
| Направление данных        | Одностороннее: от Adapty к серверу OneSignal                 |
| Точка интеграции Adapty   | <ul><li>SDK OneSignal и Adapty в коде мобильного приложения</li><li>Сервер Adapty</li></ul>|

## Настройка интеграции с OneSignal \{#setting-up-one-signal-integration\}

Чтобы настроить интеграцию:

1. Откройте раздел [Integrations → OneSignal](https://app.adapty.io/integrations/onesignal) в дашборде Adapty.

   
     <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, перейдите в [Integrations -> OneSignal](https://app.adapty.io/integrations/onesignal) в дашборде Adapty, включите переключатель и настройте учётные данные интеграции.

## Получение 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** и вставьте его в поле **App ID** в дашборде Adapty.

   
     <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 позволяет отправлять в 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

Начиная с 17 апреля 2023 года, бесплатный план OneSignal больше не поддерживает эту интеграцию. Она доступна только на планах **Growth**, **Professional** и **выше**. Подробнее см. в разделе [Цены OneSignal](https://onesignal.com/pricing).

:::

## Пользовательские теги \{#custom-tags\}

Эта интеграция обновляет и присваивает различные свойства пользователям Adapty в виде тегов, которые затем отправляются в OneSignal. Ознакомьтесь со списком тегов ниже и выберите подходящие для ваших задач.
:::warning
В OneSignal есть ограничение на количество тегов. Оно распространяется как на теги, создаваемые Adapty, так и на уже существующие теги в OneSignal. Превышение лимита может привести к ошибкам при отправке событий.
:::

| Тег | Тип | Описание                                                                                                                                                                                                                                                                                                                                         |
|---|----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `adapty_customer_user_id` | String | Уникальный идентификатор пользователя в вашем приложении. Должен быть одинаковым в вашей системе, Adapty и OneSignal.                                                                                                                                                                                                                           |
| `adapty_profile_id` | String | ID профиля пользователя в Adapty, доступный в [дашборде 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` во всех остальных случаях.                                                                                                                                                                                               |

Все значения с плавающей точкой округляются до целых чисел. Строки остаются без изменений.

Помимо стандартных тегов, вы можете отправлять [пользовательские атрибуты](segments#custom-attributes) в виде тегов, что даёт большую гибкость в выборе передаваемых данных. Это удобно для отслеживания специфических деталей, связанных с вашим продуктом или сервисом.

Пользовательские атрибуты автоматически отправляются в OneSignal, если на [странице интеграции](https://app.adapty.io/integrations/onesignal) установлен флажок **Send user attributes**. Если флажок снят, Adapty отправляет ровно 10 тегов. Если установлен — можно отправить более 10 тегов, что позволяет захватывать больше данных.

## Настройка SDK \{#sdk-configuration\}

Есть два способа интеграции OneSignal с Adapty:

1. **Устаревший (до v5):** использует `playerId` (устарел в [OneSignal SDK v5](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/5.0.0)).
2. **Актуальный (v5+):** использует `subscriptionId`.

:::warning
Убедитесь, что вы передаёте `playerId` (для OneSignal SDK до v5) или `subscriptionId` (для OneSignal SDK v5+) в Adapty. Без этого теги 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 {
        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 {
            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 подписки на push-уведомления](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#user-pushsubscription-id)
- [Изменения подписки на push-уведомления](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#addobserver-push-subscription-changes)

## Работа с несколькими устройствами \{#dealing-with-multiple-devices\}

Если у пользователя несколько устройств, отслеживать события покупок и подписок может быть непросто. OneSignal решает эту задачу с помощью [внешних идентификаторов пользователей](https://documentation.onesignal.com/docs/en/users).

Чтобы данные пользователя оставались согласованными на всех устройствах:

1. Сопоставьте разные устройства на **стороне сервера** и передайте эти данные в OneSignal.
2. Используйте [customer_user_id](identifying-users) из Adapty в качестве [externalUserId](https://documentation.onesignal.com/docs/en/users#external-id) в OneSignal. Если в вашем приложении нет системы регистрации, используйте другой уникальный идентификатор, который остаётся постоянным на всех устройствах пользователя.

Важно поддерживать согласованность идентификатора пользователя на всех устройствах и обновлять OneSignal при каждом изменении ID пользователя. Это упрощает отслеживание активности и подписок, обеспечивает единообразие сообщений и позволяет получать более точную аналитику для лучшего пользовательского опыта. Подробнее см. в документации OneSignal по [внешним идентификаторам пользователей](https://documentation.onesignal.com/docs/en/users).