---
title: "OneSignal"
description: "Adapty ile OneSignal'ı entegre ederek push bildirim tabanlı etkileşimi artırın."
---

[OneSignal](https://onesignal.com/), push bildirimleri, e-posta, SMS ve uygulama içi mesajlaşma sunan önde gelen bir müşteri etkileşim platformudur. Adapty ile OneSignal'ı entegre ederek tüm abonelik olaylarınıza tek bir yerden erişebilir ve bu olaylara dayalı otomatik iletişimler tetikleyebilirsiniz.

Adapty ile birden fazla mağazadaki [abonelik olaylarını](events) takip edebilir, kullanıcı davranışını analiz edebilir ve daha hedefli iletişim için bu verilerden yararlanabilirsiniz. Bu entegrasyon, OneSignal kontrol panelinizdeki abonelik olaylarını izlemenize ve bunları [edinim kampanyalarınıza](https://documentation.onesignal.com/docs/en/automated-messages) eşlemenize olanak tanır.

Adapty, abonelik olaylarına göre OneSignal etiketlerini güncelleyerek minimum kurulumla kişiselleştirilmiş push bildirimleri göndermenizi sağlar.

**Entegrasyon özellikleri**

| Entegrasyon özelliği | Açıklama |
| :------------------------- | :----------------------------------------------------------- |
| Zamanlama | Gerçek zamanlı güncellemeler |
| Veri yönü | Tek yönlü: Adapty'den OneSignal sunucusuna |
| Adapty entegrasyon noktası | <ul><li>Mobil uygulama kodunda OneSignal ve Adapty SDK'ları</li><li>Adapty sunucusu</li></ul>|

## OneSignal entegrasyonunu kurma \{#setting-up-one-signal-integration\}

Entegrasyonu kurmak için:

1. Adapty Kontrol Paneli'nde [Integrations → OneSignal](https://app.adapty.io/integrations/onesignal) sayfasını açın.

   
     <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. Entegrasyon geçişini etkinleştirin.
3. **OneSignal App ID**'nizi girin.

OneSignal entegrasyonunu kurmak için Adapty kontrol panelinizde [Integrations -> OneSignal](https://app.adapty.io/integrations/onesignal) sayfasına gidin, geçişi açın ve entegrasyon kimlik bilgilerini yapılandırın.

## OneSignal App ID'nizi alma \{#retrieving-your-onesignal-app-id\}

**OneSignal App ID**'nizi [OneSignal Dashboard](https://dashboard.onesignal.com/login)'da bulun:

1. **Settings** → **Keys & IDs** bölümüne gidin.

   
     <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**'nizi kopyalayın ve Adapty Kontrol Paneli'ndeki **App ID** alanına yapıştırın.

   
     <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 hakkında daha fazla bilgiye [bu dokümantasyondan](https://documentation.onesignal.com/docs/en/keys-and-ids) ulaşabilirsiniz.

### Olayları yapılandırma \{#configuring-events\}

Adapty, OneSignal'a üç grup olay göndermenize olanak tanır. İhtiyacınız olanları Adapty Kontrol Paneli'nden açın. Mevcut olayların tamamını ayrıntılı açıklamalarıyla [buradan](events) görüntüleyebilirsiniz.

  <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, abonelik olaylarını sunucudan sunucuya entegrasyon aracılığıyla OneSignal'a göndererek tüm abonelikle ilgili aktivitelerinizi OneSignal'da takip etmenizi sağlar.

:::warning

17 Nisan 2023'ten itibaren OneSignal'ın Ücretsiz Planı bu entegrasyonu desteklememektedir. Yalnızca **Growth**, **Professional** ve **daha üst** planlarda kullanılabilir. Ayrıntılar için [OneSignal Fiyatlandırma](https://onesignal.com/pricing) sayfasına bakın.

:::

## Özel etiketler \{#custom-tags\}

Bu entegrasyon, Adapty kullanıcılarınıza çeşitli özellikleri etiket olarak atar ve günceller; bu etiketler daha sonra OneSignal'a gönderilir. İhtiyaçlarınıza en uygun olanları bulmak için aşağıdaki etiket listesine bakın.
:::warning
OneSignal'ın bir etiket sınırı vardır. Bu sınır hem Adapty tarafından oluşturulan etiketleri hem de OneSignal'daki mevcut etiketleri kapsar. Sınırın aşılması, olay gönderilirken hatalara yol açabilir.
:::

| Etiket | Tür | Açıklama |
|---|----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `adapty_customer_user_id` | String | Kullanıcının uygulamanızdaki benzersiz tanımlayıcısı. Sisteminizde, Adapty'de ve OneSignal'da tutarlı olmalıdır. |
| `adapty_profile_id` | String | [Adapty Kontrol Paneli](profiles-crm)'nde görüntülenebilen Adapty kullanıcı profili ID'si. |
| `environment` | String | Kullanıcının mevcut ortamını belirten `Sandbox` veya `Production`. |
| `store` | String | Ürünün satın alındığı mağaza. Seçenekler: **app_store**, **play_store**, **stripe** veya [özel mağazanızın](custom-store) adı. |
| `vendor_product_id` | String | Uygulama mağazasındaki ürün ID'si (ör. `org.locals.12345`). |
| `subscription_expires_at` | String | En son aboneliğin bitiş tarihi (`YYYY-MM-DDTHH:MM:SS+0000`, ör. `2023-02-10T17:22:03.000000+0000`). |
| `last_event_type` | String | [Adapty olay listesinden](events) en son olay türü.<br/> Şunlara dikkat edin:<br/>- **Subscription expired** olayı için Adapty, `last_event_type` özelliğini `subscription_cancelled` olarak gönderir.<br/>- **Trial renew canceled** için – `auto_renew_off` olarak<br/>- **Subscription renew canceled** için – `auto_renew_off_subscription` olarak |
| `purchase_date` | String | Son işlem tarihi (`YYYY-MM-DDTHH:MM:SS+0000`, ör. `2023-02-10T17:22:03.000000+0000`). |
| `active_subscription` | String | Kullanıcının aktif bir aboneliği varsa `true`, aboneliği sona erdiyse `false`. |
| `period_type` | String | Satın alma veya yenileme için en son dönem türünü belirtir. Olası değerler: deneme dönemi için `trial`, diğer tüm durumlar için `normal`. |

Tüm ondalıklı değerler tam sayıya yuvarlanır. Dizeler değişmeden kalır.

Önceden tanımlanmış etiketlere ek olarak, [özel nitelikleri](segments#custom-attributes) etiket olarak gönderebilir ve dahil ettiğiniz verilerde daha fazla esneklik sağlayabilirsiniz. Bu, ürününüz veya hizmetinizle ilgili belirli ayrıntıları takip etmek için kullanışlıdır.

Özel kullanıcı nitelikleri, [entegrasyon sayfasında](https://app.adapty.io/integrations/onesignal) **Send user attributes** onay kutusu etkinleştirildiğinde otomatik olarak OneSignal'a gönderilir. İşaret kaldırıldığında Adapty tam olarak 10 etiket gönderir. İşaretlendiğinde ise 10'dan fazla etiket gönderilebilir, bu da daha gelişmiş veri yakalamaya olanak tanır.

## SDK yapılandırması \{#sdk-configuration\}

OneSignal ile Adapty'yi entegre etmenin iki yolu vardır:

1. **Eski yöntem (v5 öncesi):** [OneSignal SDK v5](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/5.0.0)'te kullanımdan kaldırılan `playerId` kullanır.
2. **Güncel yöntem (v5+):** `subscriptionId` kullanır.

:::warning
Adapty'ye `playerId` (OneSignal SDK v5 öncesi için) veya `subscriptionId` (OneSignal SDK v5+ için) gönderdiğinizden emin olun. Bu yapılmadan OneSignal etiketleri güncellenmez ve entegrasyon düzgün çalışmaz.
:::

<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 dokümantasyonunda daha fazla bilgi edinin:

- [Push abonelik ID'si](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#user-pushsubscription-id)
- [Push abonelik değişiklikleri](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#addobserver-push-subscription-changes)

## Birden fazla cihazı yönetme \{#dealing-with-multiple-devices\}

Bir kullanıcının birden fazla cihazı varsa satın alma olaylarını ve abonelikleri takip etmek güçleşebilir. OneSignal, bunu [harici kullanıcı ID'leri](https://documentation.onesignal.com/docs/en/users) aracılığıyla yönetmenin bir yolunu sunar.

Kullanıcı verilerini cihazlar arasında tutarlı tutmak için:

1. **Sunucu tarafında** farklı cihazları eşleştirin ve bu verileri OneSignal'a gönderin.
2. OneSignal'da Adapty'nin [customer_user_id](identifying-users)'sini [externalUserId](https://documentation.onesignal.com/docs/en/users#external-id) olarak kullanın. Uygulamanızın bir kayıt sistemi yoksa, kullanıcının cihazları arasında tutarlı kalan başka bir benzersiz tanımlayıcı kullanmayı düşünün.

Kullanıcı tanımlayıcısının tüm cihazlarda tutarlı olmasını sağlamak ve bir kullanıcının ID'si değiştiğinde OneSignal'ı güncellemek önemlidir. Bu, kullanıcı aktivitesini ve abonelikleri takip etmeyi kolaylaştırır, tutarlı mesajlaşma sağlar ve daha doğru analizler ile daha iyi bir kullanıcı deneyimine olanak tanır. Daha fazla ayrıntı için OneSignal'ın [harici kullanıcı ID dokümantasyonuna](https://documentation.onesignal.com/docs/en/users) bakın.