### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başladıktan sonra tanımlıyorsanız (örneğin uygulamanıza giriş yaptıktan veya kayıt olduktan sonra), customer user ID'yi ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty bunu otomatik olarak mevcut profile bağlar.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı ID'leri her kullanıcı için benzersiz olmalıdır. Parametre değerini sabit kodlarsanız, tüm kullanıcılar tek bir kullanıcı olarak değerlendirilir.
:::
Diğer SDK metodlarını çağırmadan önce `identify` tamamlanma callback'inin tetiklenmesini bekleyin. Eş zamanlı çağrılar, tanımlanmış profil yerine anonim profile düşebilir. Bkz. [Android SDK'da çağrı sırası](android-sdk-call-order).
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriyi almasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmesi için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel veriyi alamayabilir; ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum sırasında ağ isteklerini önlemek amacıyla kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, flow'ları ve paywallları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Ayrıca daha hızlı getirmek için CDN ve CDN'e ulaşılamadığı durumlarda bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman en son sürümü aldığınızdan emin olmak için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, bu metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
Android için: `TimeInterval`'ı uzantı fonksiyonlarıyla oluşturabilirsiniz (örneğin `5.seconds`; burada `.seconds`, `import com.adapty.utils.seconds`'tan gelir) ya da `TimeInterval.seconds(5)` şeklinde kullanabilirsiniz. Sınır koymamak için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :---------- | | Flow | Placement, tanımlayıcılar (`id`, `variationId`), ad, remote config'ler ve flow'un bir görünüm yapılandırması içerip içermediğini belirten `hasViewConfiguration` bayrağını barındıran bir `AdaptyFlow` nesnesi. Ön yükleme, özel UI veya programatik kontroller için gerçek ürünleri çekmek üzere `getPaywallProducts(flow)` çağrısını kullanın. | ## View konfigürasyonunu alma \{#fetch-the-view-configuration\} Flow veya paywall'ı aldıktan sonra, `flow.hasViewConfiguration` ile bir view konfigürasyonu içerip içermediğini kontrol edin. Bu bayrak, placement'ın Adapty Kontrol Paneli'nde nasıl tasarlandığını ayırt eder: - **`true`** — placement, **Flow Builder** (bir flow) veya **Paywall Builder** (bir paywall) ile tasarlanmış. Adapty, arayüzü sizin için render eder. Görünüm yapılandırmasını almak ve [flow veya paywall'ı sunmak](android-present-paywalls) için aşağıdaki adımlara devam edin. - **`false`** — placement, Builder arayüzü olmayan özel bir paywall. [Remote config paywall olarak ele alın](present-remote-config-paywalls-android). :::important Flow Builder'da **Show on device** geçişinin etkinleştirildiğinden emin olun. Bu seçenek açık değilse görünüm yapılandırması alınamaz. :::isteğe bağlı
varsayılan: cihaz dili
| [Yerelleştirmenin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı; `-` ile ayrılmış bir veya iki alt etiket içeren dil kodu olarak beklenir (örn. `en`, `pt-br`). Bkz. [Yerelleştirmeler ve dil kodları](android-localizations-and-locale-codes). | | **loadTimeout** | varsayılan: 5 sn | Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür. Nadir durumlarda bu metod, `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabilir; zira işlem arka planda farklı isteklerden oluşuyor olabilir. |isteğe bağlı
varsayılan: cihaz dili
| Bir veya iki alt etiket içeren dil kodu formatında beklenen [yerelleştirme](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı; etiketler `-` ile ayrılır (örn. `en`, `pt-br`). Bkz. [Yerelleştirmeler ve yerel ayar kodları](android-localizations-and-locale-codes). | | **loadTimeout** | varsayılan: 5 sn | Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbellekteki veriler veya yerel yedek döndürülür. Nadir durumlarda bu metot, arka planda farklı isteklerden oluşabileceğinden `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabilir. |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığından bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu senaryoda kullanıcılar en son veriye ulaşamayabilir; ancak internet bağlantısı ne kadar dengesiz olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum sırasında ağ isteklerini azaltmak amacıyla kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırıldığında veya manuel temizleme yapıldığında temizlendiğini unutmayın.
| ## Varlıkları özelleştir \{#customize-assets\} Flow veya paywallınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görselleri ve videolarının önceden tanımlanmış kimlikleri vardır: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri kimliklerine göre hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir kimlik belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterin. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterin. - Bir video başlamadan önce önizleme görseli gösterin. İşte özel varlıkları basit bir sözlük aracılığıyla nasıl sağlayabileceğinize dair bir örnek: ```kotlin showLineNumbers val customAssets = AdaptyCustomAssets.of( "hero_image" to AdaptyCustomImageAsset.remote( url = "https://example.com/image.jpg", preview = AdaptyCustomImageAsset.file( FileLocation.fromAsset("images/hero_image_preview.png"), ) ), "hero_video" to AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), ), ) val flowView = AdaptyUI.getFlowView( activity, flowConfiguration, products, eventListener, insets, customAssets, ) ``` :::note Bir asset bulunamazsa, flow varsayılan görünümüne geri döner. ::: Videolar için, isteğe bağlı olarak bir `resolution` geçerek video yüklenmeden önce düzen alanını ayırabilir ve en boy oranını (`width / height`) belirleyebilirsiniz: ```kotlin showLineNumbers AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920), ) ```isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil için, ikincisi ise bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) bölümüne bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu yaklaşımı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla uğraştığını düşünüyorsanız, varsa önbelleğe alınmış verileri döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı getirmek için CDN ve CDN'e ulaşılamadığı durumlarda bağımsız bir yedek sunucu da kullanırız. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken paywalllarınızın her zaman en son sürümünü almanızı garantilemek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
Android için: `TimeInterval`'ı uzantı işlevleriyle oluşturabilirsiniz (örneğin `5.seconds`, burada `.seconds` `import com.adapty.utils.seconds`'dan gelir) veya `TimeInterval.seconds(5)` şeklinde kullanabilirsiniz. Sınırlama koymamak için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Ürün ID'lerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://android.adapty.io/adapty/com.adapty.models/-adapty-paywall/) nesnesi. | ## Paywall Builder ile tasarlanan paywallın görünüm yapılandırmasını getirme \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse, görünüm yapılandırması getirilemez. ::: Paywallı getirdikten sonra, bunun Paywall Builder ile oluşturulduğunu gösteren bir `ViewConfiguration` içerip içermediğini kontrol edin. Bu, paywallı nasıl görüntüleyeceğiniz konusunda size yol gösterecektir. `ViewConfiguration` mevcutsa, bunu Paywall Builder paywallı olarak değerlendirin; aksi takdirde [remote config paywallı olarak işleyin](present-remote-config-paywalls).isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil için, ikincisi ise bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) bölümüne bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu yaklaşımı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla uğraştığını düşünüyorsanız, varsa önbelleğe alınmış verileri döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
| ## Varlıkları özelleştirme \{#customize-assets\} Paywallınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görseller ve videoların önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leriyle hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterin. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterin. - Video başlamadan önce bir önizleme görseli gösterin. :::important Bu özelliği kullanmak için Adapty Android SDK'yı 3.7.0 veya daha yüksek bir sürüme güncelleyin. ::: Özel varlıkları basit bir sözlük aracılığıyla nasıl sağlayabileceğinize dair bir örnek: ```kotlin showLineNumbers val customAssets = AdaptyCustomAssets.of( "hero_image" to AdaptyCustomImageAsset.remote( url = "https://example.com/image.jpg", preview = AdaptyCustomImageAsset.file( FileLocation.fromAsset("images/hero_image_preview.png"), ) ), "hero_video" to AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), ), ) val paywallView = AdaptyUI.getPaywallView( activity, viewConfiguration, products, eventListener, insets, customAssets, ) ``` :::note Bir varlık bulunamazsa, paywall varsayılan görünümüne geri döner. :::Inset'ler, tıklanabilir öğelerin sistem çubukların arkasına gizlenmesini önlemek için flow'un çevresindeki boşluklardır.
Varsayılan: `Unspecified` — yani Adapty inset'leri otomatik olarak ayarlar; bu, kenardan kenara flow'lar için idealdir.
Flow'unuz kenardan kenara değilse özel inset'ler ayarlamak isteyebilirsiniz. Bunun nasıl yapılacağını öğrenmek için aşağıdaki [Flow inset'lerini değiştirme](android-present-paywalls#change-flow-insets) bölümünü okuyun.
| | **customAssets** | isteğe bağlı | Flow veya paywall'ınızdaki görsel ve videoları çalışma zamanında değiştirmek için bir `AdaptyCustomAssets` nesnesi geçin. Daha fazla bilgi için [Varlıkları özelleştirme](android-get-pb-paywalls#customize-assets) konusuna bakın. | | **tagResolver** | isteğe bağlı | Flow metnindeki özel etiketleri çözümlemek için `AdaptyUiTagResolver` kullanın. Bu çözümleyici bir etiket parametresi alır ve buna karşılık gelen bir dizeye dönüştürür. Daha fazla bilgi için Paywall Builder'da özel etiketler konusuna bakın. | | **timerResolver** | isteğe bağlı | Özel zamanlayıcı işlevselliği kullanacaksanız çözümleyiciyi buraya geçin. | :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Flow inset'lerini değiştirme \{#change-flow-insets\} Inset'ler, flow'un etrafındaki boşluklardır ve tıklanabilir öğelerin sistem çubuklarının arkasında gizlenmesini önler. Adapty varsayılan olarak inset'leri otomatik olarak ayarlar; bu, kenardan kenara flow'larda mükemmel çalışır. Flow'unuz kenardan kenara değilse, özel inset'ler ayarlamak isteyebilirsiniz: - `AdaptyFlowView` üst durum çubuğuyla da alt gezinme çubuğuyla da çakışmıyorsa `AdaptyFlowInsets.None` kullanın. - Flow'unuz üst durum çubuğuyla çakışıyor ancak altla çakışmıyorsa gibi daha özel durumlar için yalnızca `bottomInset` değerini aşağıdaki örnekte gösterildiği gibi `0` olarak ayarlayabilirsiniz:Insets, tıklanabilir öğelerin sistem çubuklarının arkasına gizlenmesini önleyen paywall etrafındaki boşluklardır.
Varsayılan: `UNSPECIFIED` — bu, Adapty'nin inset'leri otomatik olarak ayarlayacağı anlamına gelir; bu ayar kenardan kenara paywalllar için mükemmel çalışır.
Paywallınız kenardan kenara değilse özel inset'ler ayarlamak isteyebilirsiniz. Bunun nasıl yapılacağını aşağıdaki [Paywall inset'lerini değiştirme](android-present-paywalls#change-paywall-insets) bölümünde okuyabilirsiniz.
| | **personalizedOfferResolver** | isteğe bağlı | Kişiselleştirilmiş fiyatlandırmayı ([daha fazla bilgi](https://developer.android.com/google/play/billing/integrate#personalized-price)) belirtmek için `AdaptyUiPersonalizedOfferResolver` uygulayın ve `AdaptyPaywallProduct`'ı, ürünün fiyatı kişiselleştirilmişse `true`, değilse `false` olarak eşleyen kendi mantığınızı geçirin. | | **tagResolver** | isteğe bağlı | Paywall metnindeki özel etiketleri çözümlemek için `AdaptyUiTagResolver` kullanın. Bu çözümleyici bir etiket parametresi alır ve bunu karşılık gelen bir dizeye dönüştürür. Daha fazla bilgi için Paywall Builder'daki Özel Etiketler konusuna bakın. | | **timerResolver** | isteğe bağlı | Özel zamanlayıcı işlevselliği kullanacaksanız çözümleyiciyi buraya geçirin. | :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Paywall insets'lerini değiştirme \{#change-paywall-insets\} Insets, tıklanabilir öğelerin sistem çubukları arkasında gizlenmesini engelleyen paywall etrafındaki boşluklardır. Varsayılan olarak Adapty, kenar-kenara paywalllar için harika çalışan insets'leri otomatik olarak ayarlar. Paywallınız kenar-kenara değilse özel insets ayarlamak isteyebilirsiniz: - `AdaptyPaywallView` ile ne durum çubuğu ne de gezinme çubuğu çakışmıyorsa `AdaptyPaywallInsets.NONE` kullanın. - Paywallınız üst durum çubuğuyla çakışıyor ama alt kısımla çakışmıyorsa gibi daha özel durumlarda, aşağıdaki örnekte gösterildiği gibi yalnızca `bottomInset`'i `0` olarak ayarlayabilirsiniz:
## Paywall görüntüleme sayısı çok büyük \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntüleme sayısı beklenen değerin iki katını gösteriyor.
**Neden**: Kodunuzda `logShowFlow` (Android SDK v4+) / `logShowPaywall` çağırıyor olabilirsiniz; bu, Paywall Builder veya Flow Builder kullanıyorsanız görüntüleme sayısını çifte katlıyor. Bu araçlarla oluşturulan flow'lar ve paywall'lar için analitik otomatik olarak takip edilir, dolayısıyla bu metodu kullanmanıza gerek yoktur.
**Çözüm**: Paywall Builder veya Flow Builder kullanıyorsanız kodunuzda `logShowFlow` (Android SDK v4+) / `logShowPaywall` çağırmadığınızdan emin olun.
## Diğer sorunlar \{#other-issues\}
**Sorun**: Yukarıda ele alınmayan başka Paywall Builder sorunlarıyla karşılaşıyorsunuz.
**Çözüm**: Gerekirse [migration kılavuzlarını](android-sdk-migration-guides) kullanarak SDK'yı en son sürüme güncelleyin. Pek çok sorun daha yeni SDK sürümlerinde çözülmüştür.
---
# File: android-quickstart-manual
---
---
title: "Android SDK'da özel paywall'unuzda satın almaları etkinleştirin"
description: "Uygulama içi satın almaları etkinleştirmek için Adapty SDK'yı özel Android paywall'larınıza entegre edin."
---
Bu kılavuz, Adapty'yi özel paywall'larınıza nasıl entegre edeceğinizi açıklar. Paywall implementasyonunun tam kontrolü sizde kalırken Adapty SDK ürünleri getirir, yeni satın almaları yönetir ve önceki satın almaları geri yükler.
:::important
**Bu rehber, özel paywall'lar uygulayan geliştiriciler içindir.** Satın alma işlemlerini etkinleştirmenin en kolay yolunu arıyorsanız [Adapty Flow Builder](android-quickstart-paywalls)'ı kullanın. Flow Builder ile no-code görsel editörde flow'lar oluşturursunuz, tüm satın alma mantığını Adapty otomatik olarak yönetir ve uygulamanızı yeniden yayınlamadan farklı tasarımları test edebilirsiniz.
:::
## Başlamadan önce \{#before-you-start\}
### Ürünleri ayarlama \{#set-up-products\}
Uygulama içi satın alımları etkinleştirmek için üç temel kavramı anlamanız gerekir:
- [**Products**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Paywalls**](paywalls) – hangi ürünlerin sunulacağını tanımlayan yapılandırmalar. Adapty'de ürünlere yalnızca paywall'lar aracılığıyla ulaşılabilir; bu tasarım sayesinde uygulama koduna dokunmadan ürünleri, fiyatları ve teklifleri değiştirebilirsiniz.
- [**Placements**](placements) – uygulamanızda paywall'ları nerede ve ne zaman göstereceğiniz (`main`, `onboarding`, `settings` gibi). Paywall'ları kontrol panelinde placement'lara bağlar, ardından kodunuzda placement ID'siyle talep edersiniz. Bu yapı, A/B testleri çalıştırmayı ve farklı kullanıcılara farklı paywall'lar göstermeyi kolaylaştırır.
Bu kavramları, özel paywallınızla çalışsanız bile anladığınızdan emin olun. Bunlar, uygulamanızda sattığınız ürünleri yönetmenin yollarından ibarettir.
Özel paywallınızı hayata geçirmek için bir **paywall** oluşturmanız ve bunu bir **placement**'a eklemeniz gerekir. Bu yapı, ürünlerinizi almanızı sağlar. Kontrol panelinde yapmanız gerekenleri anlamak için hızlı başlangıç kılavuzunu [buradan](quickstart) takip edin.
### Kullanıcıları yönetme \{#manage-users\}
Kendi tarafınızda backend kimlik doğrulamasıyla veya olmadan çalışabilirsiniz.
Ancak Adapty SDK, anonim ve kimliği doğrulanmış kullanıcıları farklı şekilde yönetir. Ayrıntıları anlamak ve kullanıcılarla doğru şekilde çalıştığınızdan emin olmak için [kimlik doğrulama hızlı başlangıç kılavuzunu](android-quickstart-identify) okuyun.
## Adım 1. Ürünleri alın \{#step-1-get-products\}
Özel paywall'ınız için ürünleri almak üzere şunları yapmanız gerekir:
1. `getFlow` metoduna [placement](placements) ID'sini geçirerek `flow` nesnesini alın.
2. Bu flow için `getPaywallProducts` metodunu kullanarak ürünler dizisini alın.
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en güncel veriye ulaşamayabilir; ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli aralıklarla güncellendiğinden, oturum sırasında gereksiz ağ isteklerini önlemek amacıyla güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, flow'ları ve paywall'ları iki katmanda depolar: yukarıda açıklanan düzenli güncellenen önbellek ve [yedek paywall'lar](android-use-fallback-paywalls). Ayrıca flow'ları ve paywall'ları daha hızlı getirmek için CDN, CDN'e erişilemediği durumlarda ise bağımsız bir yedek sunucu kullanırız.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşıldığında önbellekteki veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilen süreden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini kodunuza sabit olarak yazmayın! Flow'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme süresi gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız bu 2 ürünü göstermelidir. Ancak daha sonra 3 ürün alırsanız, herhangi bir kod değişikliği gerektirmeden uygulamanız 3 ürünü de göstermelidir. Kodunuza sabit olarak yazmanız gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Placement, tanımlayıcılar (`id`, `variationId`), ad, `remoteConfigs` dizisi (yapılandırılmış her yerel ayar için bir giriş) ve `hasViewConfiguration` bayrağını içeren bir `AdaptyFlow` nesnesi. Flow için ürünleri almak üzere `getPaywallProducts(flow)` çağrısını kullanın. | :::note v4'te `locale` parametresi `getFlow`'dan `getFlowConfiguration`'a taşındı (yalnızca AdaptyUI ile render ederken kullanılır). Özel paywalllar için mevcut tüm locale'ler `flow.remoteConfigs` içinde birlikte döndürülür; kullanıcının cihaz diline veya uygulamanızın ayarına uygun locale'i seçin. ::: ## Ürünleri getir \{#fetch-products\} Flow'a sahip olduktan sonra, o flow'a karşılık gelen ürün dizisini sorgulayabilirsiniz:SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Bu seçeneği öneririz çünkü kullanıcılarınızın her zaman en güncel verilere erişmesini sağlar.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu durumda kullanıcılar en son verileri alamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum sırasında ağ isteklerini azaltmak amacıyla kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında temizlendiğini unutmayın.
|isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi ise bölge içindir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](android-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, önbellekte veri varsa önbellekten döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum sırasında ağ isteklerini azaltmak amacıyla güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırıldığında veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywall'ları iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](android-use-fallback-paywalls). Paywall'ların daha hızlı getirilmesi için CDN, CDN'e erişilemeyen durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman en güncel paywall sürümünü almanızı garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşıldığında önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilen süreden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşuyor olabilir.
| Ürün ID'lerini hardcode etmeyin! Paywall'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zamanla değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız o 2 ürünü göstermelidir. Ancak daha sonra 3 ürün alırsanız, herhangi bir kod değişikliği gerektirmeden uygulamanız 3 ürünü de göstermelidir. Hardcode etmeniz gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün kimliklerinin listesi, paywall tanımlayıcısı, remote config ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://android.adapty.io/adapty/com.adapty.models/-adapty-paywall/) nesnesi. | ## Ürünleri getir \{#fetch-products\} Paywall'a sahip olduktan sonra, buna karşılık gelen ürün dizisini sorgulayabilirsiniz:isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve kullanım önerilerimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](android-localizations-and-locale-codes) bölümüne bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar her zaman en güncel veriye ulaşamayabilir; ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum sırasında gereksiz ağ isteklerinden kaçınmak için güvenle kullanılabilir.
Önbelleğin, uygulama yeniden başlatıldığında korunduğunu; yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında sıfırlandığını unutmayın.
|İstek başarılı olursa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/) nesnesi, kullanıcının uygulama içindeki access level'ları, abonelikleri ve abonelik dışı satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Apple'ın StoreKit sürümü v2.0'dan düşük ve Adapty SDK sürümü v2.9.0'dan düşükse, bunun yerine [Apple App Store paylaşımlı sırrı](app-store-connection-configuration#step-5-enter-app-store-shared-secret) sağlamanız gerekir. Bu yöntem Apple tarafından artık kullanım dışı bırakılmıştır. ::: ## Satın alma sırasında aboneliği değiştirme \{#change-subscription-when-making-a-purchase\} Bir kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu işlemin nasıl çalışacağı uygulama mağazasına göre değişir. Google Play'de abonelik otomatik olarak güncellenmez. Geçişi aşağıda açıklandığı şekilde mobil uygulama kodunuzda yönetmeniz gerekir. Android'de aboneliği başka bir abonelikle değiştirmek için `.makePurchase()` metodunu ek parametre ile çağırın:Bir [`AdaptyProfile`](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/) nesnesi. Bu model, access level, abonelik ve abonelik dışı satın alma bilgilerini içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level durumunu** kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: implement-observer-mode-android --- --- title: "Android SDK'da Observer modunu uygulama" description: "Android SDK'da kullanıcı abonelik olaylarını takip etmek için Adapty'de observer modunu uygulayın." --- Kendi satın alma altyapınız varsa ve Adapty'ye tam geçişe hazır değilseniz, [Observer modu](observer-vs-full-mode)'nu inceleyebilirsiniz. Temel haliyle Observer Modu, gelişmiş analitik ve attribution ile analitik sistemleriyle sorunsuz entegrasyon sunar. Bu sizin için yeterliyse yapmanız gerekenler: 1. `observerMode` parametresini `true` olarak ayarlayarak Adapty SDK'yı yapılandırırken Observer modunu açın. [Android](sdk-installation-android#activate-adapty-module-of-adapty-sdk) için kurulum talimatlarını takip edin. 2. Mevcut satın alma altyapınızdan Adapty'ye [işlemleri bildirin](report-transactions-observer-mode-android). ## Observer modu kurulumu \{#observer-mode-setup\} Satın almaları ve abonelik durumunu kendiniz yönetiyorsanız ve abonelik olayları ile analitik göndermek için Adapty kullanıyorsanız Observer modunu açın. :::important Observer modunda çalışırken Adapty SDK hiçbir işlemi kapatmaz; bu nedenle bunu kendiniz yönettiğinizden emin olun. :::1. `AdaptyUiObserverModeHandler`'ı uygulayın. `onPurchaseInitiated` olayı, kullanıcının bir satın alma işlemi başlattığını size bildirir. Bu callback'e yanıt olarak özel satın alma flow'unuzu tetikleyebilirsiniz:
1. `AdaptyUiObserverModeHandler`'ı uygulayın. `onPurchaseInitiated` olayı, kullanıcının bir satın alma işlemi başlattığını size bildirir. Bu callback'e yanıt olarak özel satın alma flow'unuzu tetikleyebilirsiniz:
iOS, StoreKit 1 için: bir [`SKPaymentTransaction`](https://developer.apple.com/documentation/storekit/skpaymenttransaction) nesnesi.
iOS, StoreKit 2 için: [Transaction](https://developer.apple.com/documentation/storekit/transaction) nesnesi.
Android için: Satın almanın billing library [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) sınıfının bir örneği olduğu satın almanın String tanımlayıcısı (`purchase.getOrderId()`).
|iOS, StoreKit1 için: bir [`SKPaymentTransaction`](https://developer.apple.com/documentation/storekit/skpaymenttransaction) nesnesi.
iOS, StoreKit 2 için: [Transaction](https://developer.apple.com/documentation/storekit/transaction) nesnesi.
Android için: Satın almanın billing library [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) sınıfının bir örneği olduğu satın almanın dize tanımlayıcısı (`purchase.getOrderId()`).
| Tam ekran modunda sistem çubuklarının kullanıcı arayüzünüzün bir bölümünü kapladığı durumlarda, inset'leri şu şekilde elde edin:phoneNumber
firstName
lastName
| String | | gender | Enum, izin verilen değerler: `female`, `male`, `other` | | birthday | Date | ### Özel kullanıcı özellikleri \{#custom-user-attributes\} Kendi özel özelliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanımıyla ilgilidir. Örneğin fitness uygulamaları için haftalık egzersiz sayısı, dil öğrenme uygulamaları için kullanıcının bilgi düzeyi gibi. Bu özellikleri, hedefli paywall'lar ve teklifler oluşturmak için segmentlerde kullanabilir; ayrıca hangi ürün metriklerinin geliri en çok etkilediğini anlamak için analitikte de değerlendirebilirsiniz.Bir [AdaptyProfile](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/) nesnesi. Genel olarak, kullanıcının uygulamaya premium erişimi olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu her zaman API'yi sorgulamaya çalıştığından en güncel sonucu sağlar. Herhangi bir nedenle (örneğin internet bağlantısı olmadığında) Adapty SDK sunucudan bilgi alamazsa, önbellekteki veriler döndürülür. Adapty SDK'nın bilgileri mümkün olduğunca güncel tutmak için `AdaptyProfile` önbelleğini düzenli olarak güncellediğini de belirtmek gerekir.
| `.getProfile()` metodu, kullanıcı profilini size sağlar ve bu profilden access level durumunu öğrenebilirsiniz. Uygulama başına birden fazla access level tanımlayabilirsiniz. Örneğin, bir gazete uygulamanız varsa ve farklı konulara bağımsız abonelikler satıyorsanız "sports" ve "science" gibi access level'lar oluşturabilirsiniz. Ancak çoğu durumda yalnızca bir access level'a ihtiyaç duyarsınız; bu durumda varsayılan "premium" access level'ı kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmeye yönelik bir örnek:isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa bunu döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel veriye her zaman ulaşamayabilir, ama internet bağlantısı ne kadar zayıf olursa olsun daha hızlı yükleme süreleriyle karşılaşırlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadığını, yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı çekmek için CDN, CDN'e erişilemeyen durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadiren bu metodun `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
Android için: `TimeInterval`'ı uzantı fonksiyonlarıyla oluşturabilirsiniz (örneğin `5.seconds`, burada `.seconds` `import com.adapty.utils.seconds`'dan gelir) ya da `TimeInterval.seconds(5)` kullanabilirsiniz. Sınır koymamak için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özellikleri içeren bir [`AdaptyOnboarding`](https://android.adapty.io/adapty/com.adapty.models/-adapty-onboarding/) nesnesi. | ## Varsayılan kitle onboarding'i ile onboarding çekmeyi hızlandırma \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Onboarding'ler genellikle neredeyse anında çekilir, dolayısıyla bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve onboarding'iniz olduğunda ve kullanıcılarınızın internet bağlantısı zayıf olduğunda, onboarding'i çekmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir onboarding görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın **All Users** kitlesi için onboarding'i çeken `getOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding'i Çekme](#fetch-onboarding) bölümünde açıklandığı gibi `getOnboarding` metodu ile onboarding çekmek olduğunu unutmamak önemlidir. :::warning `getOnboardingForDefaultAudience` yerine `getOnboarding` kullanmayı değerlendirin; çünkü ikincisinin önemli kısıtlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorun yaratabilir; geriye dönük uyumlu tasarımlar yapmanızı ya da eski sürümlerin yanlış görüntüleneceğini kabul etmenizi gerektirebilir. - **Kişiselleştirme yok**: Yalnızca "All Users" kitlesi için içerik gösterir; ülke, attribution veya özel niteliklere dayalı hedeflemeyi ortadan kaldırır. Kullanım durumunuzda daha hızlı çekme bu dezavantajlardan ağır basıyorsa aşağıda gösterildiği gibi `getOnboardingForDefaultAudience` kullanın. Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı gibi `getOnboarding` kullanın. ::: ```kotlin Adapty.getOnboardingForDefaultAudience("YOUR_PLACEMENT_ID") { result -> when (result) { is AdaptyResult.Success -> { val onboarding = result.value // Handle successful onboarding retrieval } is AdaptyResult.Error -> { val error = result.error // Handle error case } } } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa bunu döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel veriye her zaman ulaşamayabilir, ama internet bağlantısı ne kadar zayıf olursa olsun daha hızlı yükleme süreleriyle karşılaşırlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadığını, yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı çekmek için CDN, CDN'e erişilemeyen durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| --- # File: android-present-onboardings --- --- title: "Android SDK'da onboarding'leri göster" description: "Etkili kullanıcı etkileşimi için Android'de onboarding'leri nasıl sunacağınızı öğrenin." --- :::tip **SDK v4'ten itibaren**, onboarding'lere güçlü bir alternatif olarak [flow'lar](android-get-pb-paywalls) oluşturabilirsiniz. WebView içinde çalışan onboarding'lerin aksine, flow'lar cihazda yerel olarak render edilir; bu sayede daha akıcı animasyonlar, tutarlı bir Android görünümü, daha hızlı yükleme süreleri ve WebView çalışma zamanı bağımlılığı olmadan kullanım elde edersiniz. Başlamak için [Flow'ları ve paywall'ları al](android-get-pb-paywalls) ve [Flow'ları ve paywall'ları göster](android-present-paywalls) sayfalarına göz atın. ::: Başlamadan önce şunlardan emin olun: 1. [Adapty Android SDK](sdk-installation-android) 3.8.0 veya daha yeni bir sürümünü yüklediniz. 2. [Bir onboarding oluşturdunuz](create-onboarding). 3. Onboarding'i bir [placement](placements)'a eklediniz. Onboarding Builder ile bir onboarding özelleştirdiyseniz, bunu kullanıcıya göstermek için mobil uygulama kodunuzda render işlemiyle uğraşmanıza gerek yok. Bu tür bir onboarding, hem ne gösterileceğini hem de nasıl gösterileceğini içerir. Cihaz ekranında görsel onboarding'i gösterebilmek için önce yapılandırmanız gerekir. Bunu yapmak için `AdaptyUI.getOnboardingView()` metodunu çağırın veya `OnboardingView`'ı doğrudan oluşturun:
Örneğin, bir kullanıcı **Login** veya **Allow notifications** gibi özel bir düğmeye dokunduğunda, `onCustomAction` delegate metodu builder'daki eylem ID'siyle tetiklenir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
```kotlin showLineNumbers
class YourActivity : AppCompatActivity() {
private val eventListener = object : AdaptyOnboardingEventListener {
override fun onCustomAction(action: AdaptyOnboardingCustomAction, context: Context) {
when (action.actionId) {
"allowNotifications" -> {
// Request notification permissions
}
}
}
override fun onError(error: AdaptyOnboardingError, context: Context) {
// Handle errors
}
// ... other required delegate methods
}
}
```
Yerel yedek paywall JSON'ı geçerli değil.
Önce varsayılan İngilizce paywallınızı düzeltin, ardından geçersiz yerel paywallları değiştirin. Bir paywallın nasıl düzeltileceğine dair ayrıntılar için [Paywall'ı remote config ile özelleştirme](customize-paywall-with-remote-config) konusuna, yerel paywallların nasıl değiştirileceğine dair ayrıntılar için ise [Yerel yedek paywallları tanımlama](fallback-paywalls) konusuna bakın.
| |CURRENT_SUBSCRIPTION_TO_UPDATE
\_NOT_FOUND_IN_HISTORY
| Değiştirilmesi gereken orijinal abonelik, aktif abonelikler arasında bulunamadı. | | [BILLING_SERVICE_TIMEOUT](https://developer.android.com/google/play/billing/errors#service_timeout_error_code_-3) | Bu hata, Google Play yanıt veremeden isteğin maksimum zaman aşımına ulaştığını gösterir. Örneğin, Play Billing Library çağrısının talep ettiği işlemin gecikmesinden kaynaklanabilir. | | [FEATURE_NOT_SUPPORTED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#FEATURE_NOT_SUPPORTED()) | İstenen özellik, mevcut cihazda Play Store tarafından desteklenmiyor. | | [BILLING_SERVICE_DISCONNECTED](https://developer.android.com/google/play/billing/errors#service_disconnected_error_code_-1) | Bu hata, istemci uygulamanın `BillingClient` aracılığıyla Google Play Store hizmetiyle kurduğu bağlantının kesildiğini gösterir. | | [BILLING_SERVICE_UNAVAILABLE](https://developer.android.com/google/play/billing/errors#service_unavailable_error_code_2) | Bu hata, Google Play Billing hizmetinin şu anda kullanılamaz durumda olduğunu gösterir. Çoğu durumda bu, istemci cihaz ile Google Play Billing hizmetleri arasındaki bir noktada ağ bağlantısı sorunu olduğu anlamına gelir. | | [BILLING_UNAVAILABLE](https://developer.android.com/google/play/billing/errors#billing_unavailable_error_code_3) |Bu hata, satın alma işlemi sırasında bir faturalandırma sorunu oluştuğunu gösterir. Olası nedenler şunlardır:
1. Kullanıcının cihazındaki Play Store uygulaması eksik veya güncel değil.
2. Kullanıcı desteklenmeyen bir ülkede.
3. Kullanıcı, yöneticinin satın almaları devre dışı bıraktığı bir kurumsal hesabın parçası.
4. Google Play, kullanıcının ödeme yöntemini tahsil edemedi (örneğin süresi dolmuş bir kredi kartı).
5. Kullanıcı Play Store uygulamasında oturum açmamış.
| | [DEVELOPER_ERROR](https://developer.android.com/google/play/billing/errors#developer_error) | Bu hata, bir API'nin hatalı kullanıldığını gösterir. | | [BILLING_ERROR](https://developer.android.com/google/play/billing/errors#error_error_code_6) | Bu hata, Google Play'in kendi içinde bir sorun olduğunu gösterir. | | [ITEM_ALREADY_OWNED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#ITEM_ALREADY_OWNED()) | Ürün zaten satın alınmış. | | [ITEM_NOT_OWNED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#ITEM_NOT_OWNED()) | Bu hata, kullanıcının ürüne sahip olmadığı için istenen işlemin gerçekleştirilemediğini gösterir. | | [BILLING_NETWORK_ERROR](https://developer.android.com/google/play/billing/errors#network_error_error_code_12) | Bu hata, cihaz ile Play sistemleri arasındaki ağ bağlantısında bir sorun olduğunu gösterir. | | NO_PRODUCT_IDS_FOUND |Bu hata, paywallda yer alan ürünlerin hiçbirinin mağazada mevcut olmadığını gösterir.
Bu hatayla karşılaşıyorsanız sorunu çözmek için aşağıdaki adımları izleyin:
Siz yetkilendirmeden önce kodun süresi dolarsa veya **Deny** seçeneğine tıklarsanız, akışı yeniden başlatmak için şu komutu tekrar çalıştırın:
```bash
adapty auth login
```
## Kimlik doğrulamayı yönetme \{#manage-authentication\}
### Kimlik doğrulama durumunu kontrol etme \{#check-authentication-status\}
Mevcut kimlik doğrulama durumunuzu görmek için şunu çalıştırın:
```bash
adapty auth status
```
Kimlik doğrulaması yapıldığında, çıktıda e-posta adresiniz, maskelenmiş bir token öneki ve yerel yapılandırma dosyasının yolu gösterilir:
```
Email: you@example.com
Token: abcd1234****
Config: ~/.config/adapty/config.json
```
Kimlik doğrulaması yapılmadığında:
```
Not authenticated. Run `adapty auth login`.
```
### Tokenınızı doğrulama \{#verify-your-token\}
Tokenınızın geçerli olduğunu onaylamak ve hesap bilgilerinizi görmek için şunu çalıştırın:
```bash
adapty auth whoami
```
`adapty auth status` komutunun aksine, bu komut tokenı doğrulamak için sunucuya canlı bir istek gönderir.
### Çıkış yapma \{#log-out\}
Yerel olarak depolanan kimlik bilgilerinizi temizlemek için şunu çalıştırın:
```bash
adapty auth logout
```
Bu komut `~/.config/adapty/config.json` dosyasını temizler. Token, süresi dolana kadar sunucu tarafında geçerliliğini korur — hemen geçersiz kılmak istiyorsanız bunun yerine `adapty auth revoke` komutunu kullanın.
### Tokenınızı iptal etme \{#revoke-your-token\}
Tokeni sunucuda geçersiz kılmak ve yerel olarak temizlemek için şunu çalıştırın:
```bash
adapty auth revoke
```
Bir tokeni tamamen geçersiz kılmak istediğinizde bunu kullanın — örneğin kimlik bilgilerinizin ele geçirilmiş olabileceği durumlarda. İptal ettikten sonra yeniden kimlik doğrulaması yapmak için `adapty auth login` komutunu çalıştırın.
## Token hataları \{#token-errors\}
Bir token iptal edilirse veya geçersiz hale gelirse, CLI komutları 401 hatası döndürür. Yeniden kimlik doğrulaması yapmak için şunu çalıştırın:
```bash
adapty auth login
```
---
# File: developer-cli-reference
---
---
title: "Adapty Developer CLI için tam referans"
description: "Tüm Adapty Developer CLI komutları için eksiksiz referans."
---
:::link
Bir yapay zeka asistanı mı kullanıyorsunuz? LLM'lerin CLI ile çalışmasına yardımcı olmak için bir [Adapty CLI becerisi](https://github.com/adaptyteam/adapty-cli/tree/main/skills/adapty-cli) mevcuttur.
:::
Bu makalede tüm Adapty CLI komutları, argümanları, bayrakları ve kabul edilen değerleriyle birlikte listelenmiştir.
:::link
Kimlik doğrulama kurulumu ve token yönetimi için bkz. [Kimlik doğrulama](developer-cli-authentication).
:::
## Global bayraklar \{#global-flags\}
Bu bayraklar tüm komutlarda kullanılabilir.
| Bayrak | Açıklama |
|---|---|
| `--json` | Biçimlendirilmiş metin yerine JSON olarak çıktı verir |
| `--help` | Komut yardımını gösterir |
Tüm `list` komutları ayrıca sayfalama bayraklarını da kabul eder:
| Bayrak | Varsayılan | Açıklama |
|---|---|---|
| `--page` | `1` | Sayfa numarası |
| `--page-size` | `20` | Sayfa başına öğe sayısı (maks: 100) |
## Uygulamalar \{#apps\}
Adapty hesabınızdaki uygulamaları yönetin. Kontrol paneli tabanlı yapılandırma için bkz. [Uygulama ayarları](general).
### adapty apps list \{#adapty-apps-list\}
Adapty hesabınızdaki tüm uygulamaları listeler.
```bash
adapty apps list
```
[Sayfalama bayraklarını](#global-flags) kabul eder.
### adapty apps get \{#adapty-apps-get\}
Belirli bir uygulama için ayrıntıları getirir.
```bash
adapty apps get
:::note Abonelik olaylarını takip etmek için Adapty'deki [Webhook](webhook) entegrasyonunu kullanın ya da mevcut servisinizle doğrudan entegre edin. ::: ::: ## Durum 1: Web ve mobil arasında aboneleri senkronize etme \{#case-1-sync-subscribers-between-web-and-mobile\} Stripe, ChargeBee veya başka web ödeme sağlayıcıları kullanıyorsanız, abonelerinizi kolayca senkronize edebilirsiniz. İşte nasıl yapacağınız: 1.
Kullanıcının Adapty profil ID'si. [Adapty Dashboard -> **Profiles**](https://app.adapty.io/profiles/users) -> ilgili profil sayfasındaki **Adapty ID** alanında görüntülenir.
**adapty-customer-user-id** ile birbirinin yerine kullanılabilir; ikisinden birini tercih edebilirsiniz.
| | **adapty-customer-user-id** |Kullanıcının sisteminizde kayıtlı ID'si. [Adapty Dashboard -> **Profiles**](https://app.adapty.io/profiles/users) -> ilgili profil sayfasındaki **Customer user ID** alanında görüntülenir.
**adapty-profile-id** ile birbirinin yerine kullanılabilir; ikisinden birini tercih edebilirsiniz.
⚠️ Yalnızca uygulama kodunuzda Adapty SDK aracılığıyla kullanıcıları
### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin, uygulamanıza giriş yaptıktan veya kaydolduktan sonra), müşteri kullanıcı kimliğini ayarlamak için `identify` metodunu kullanın.
- Bu müşteri kullanıcı kimliğini **daha önce kullanmadıysanız**, Adapty bunu otomatik olarak mevcut profille ilişkilendirir.
- Bu müşteri kullanıcı kimliğini **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu müşteri kullanıcı kimliğiyle ilişkili profille çalışmaya geçer.
:::tip
Bir müşteri kullanıcı kimliği oluştururken, bunu kullanıcı verilerinizle birlikte kaydedin. Böylece yeni bir cihazdan giriş yaptıklarında veya uygulamayı yeniden yüklediklerinde aynı kimliği gönderebilirsiniz.
:::
Diğer SDK metodlarını çağırmadan önce her zaman `identify` metodunu `await` ile bekleyin. Eş zamanlı çağrılar `#3006 profileWasChanged` hatasına yol açar ya da anonim profile düşer. Daha fazla bilgi için bkz. [Capacitor SDK'da çağrı sırası](capacitor-sdk-call-order).
```typescript showLineNumbers
try {
await adapty.identify({ customerUserId: "YOUR_USER_ID" });
// successfully identified
} catch (error) {
// handle the error
}
```
### SDK etkinleştirme sırasında \{#during-the-sdk-activation\}
SDK'yı etkinleştirdiğinizde müşteri kullanıcı kimliğini zaten biliyorsanız, `identify` metodunu ayrıca çağırmak yerine doğrudan `activate` metodunda gönderebilirsiniz.
Müşteri kullanıcı kimliğini bilmenize rağmen bunu etkinleştirmeden sonra ayarlıyorsanız, etkinleştirme anında Adapty yeni bir boş profil oluşturur ve `identify` metodunu çağırdıktan sonra mevcut profile geçer.
Mevcut bir müşteri kullanıcı kimliği (daha önce kullandığınız) ya da yeni bir tane girebilirsiniz. Yeni bir tane girerseniz, aktivasyon sırasında oluşturulan yeni profil otomatik olarak müşteri kullanıcı kimliğine bağlanır.
:::tip
Oluşturulan boş profilleri kontrol paneli analizlerinden dışlamak için **App settings** bölümüne gidin ve [**Installs definition for analytics**](general#4-installs-definition-for-analytics) ayarını yapılandırın.
:::
```typescript showLineNumbers
await adapty.activate({
apiKey: "YOUR_PUBLIC_SDK_KEY",
params: {
customerUserId: "YOUR_USER_ID"
}
});
```
### Kullanıcı oturumunu kapatma \{#log-users-out\}
Kullanıcıların oturumunu kapatmak için bir butonunuz varsa, `logout` metodunu kullanın. Bu işlem kullanıcı için yeni bir anonim profil kimliği oluşturur.
```typescript showLineNumbers
try {
await adapty.logout();
// successful logout
} catch (error) {
// handle the error
}
```
:::info
Kullanıcıları uygulamaya tekrar giriş yaptırmak için `identify` metodunu kullanın.
:::
### Giriş yapmadan satın alma izni \{#allow-purchases-without-login\}
Kullanıcılarınız uygulamanıza giriş yapmadan önce de sonra da satın alma yapabiliyorsa, ek bir kurulum yapmanıza gerek yok:
İşte nasıl çalıştığı:
1. Oturumu kapalı bir kullanıcı satın alma yaptığında, Adapty bunu anonim profil ID'sine bağlar.
2. Kullanıcı hesabına giriş yaptığında, Adapty tanımlanmış profiliyle çalışmaya geçer.
- Mevcut bir customer user ID ise (customer user ID zaten bir profile bağlıysa), Adapty işlemleri otomatik olarak senkronize eder.
- Yeni bir customer user ID ise (örneğin, satın alma kayıt olmadan önce yapılmışsa), Adapty customer user ID'yi mevcut profile atar; böylece tüm satın alma geçmişi korunur.
---
# File: adapty-sdk-integration-skill-capacitor
---
---
title: "SDK entegrasyon becerisini kullanarak Adapty'yi Capacitor uygulamanıza entegre edin"
description: "AI kodlama aracınızla Adapty SDK'yı Capacitor uygulamanıza uçtan uca entegre etmek için adapty-sdk-integration becerisini kullanın."
---
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
:::important
Bu özellik beta aşamasındadır. Takılı kalır veya beklenmedik şekilde davranırsa, AI aracınızı her adımda doğru belgelerle yönlendiren [adım adım entegrasyon kılavuzunu](adapty-cursor-capacitor) takip edin.
:::
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
---
# File: adapty-cursor-capacitor
---
---
title: "Adapty'yi AI yardımıyla Capacitor uygulamanıza entegre edin"
description: "Cursor, Context7, ChatGPT, Claude veya diğer AI araçlarını kullanarak Adapty'yi Capacitor uygulamanıza entegre etmek için adım adım kılavuz."
---
Bu kılavuz, bir yapay zeka kodlama aracıyla Adapty'yi Capacitor uygulamanıza adım adım entegre etmenizi sağlar; bunun için doğru Adapty dokümanlarını doğru sırayla beslemeniz yeterli.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Başlamadan önce: kontrol paneli kurulumu \{#before-you-start-dashboard-setup\}
Adapty, herhangi bir SDK kodu yazmadan önce bazı kontrol paneli ayarlarının yapılmasını gerektirir. Bunu etkileşimli bir LLM aracıyla veya Kontrol Paneli üzerinden manuel olarak gerçekleştirebilirsiniz.
### Beceri yaklaşımı (önerilir) \{#skill-approach-recommended\}
Adapty CLI becerisi, LLM'inizin uygulamanızı, ürünlerinizi, access level'larınızı, paywalllarınızı ve placement'larınızı doğrudan ayarlamasına olanak tanır — her adım için Kontrol Paneli'ni açmanıza gerek kalmaz. Yalnızca [mağazalarınızı bağlamanız](integrate-payments) gerekir.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Beceri eklendikten sonra, ajansınızda `/adapty-cli` komutunu çalıştırın. Mağazalarınızı bağlamak için Kontrol Paneli'ni ne zaman açmanız gerektiği de dahil olmak üzere her adımda sizi yönlendirecektir.
### Kontrol paneli yaklaşımı \{#dashboard-approach\}
Eğer her şeyi manuel olarak yapılandırmayı tercih ediyorsanız, herhangi bir kod yazmadan önce almanız gerekenler şunlardır. LLM'iniz kontrol paneli değerlerini sizin için arayamaz — bunları kendiniz sağlamanız gerekecek.
1. **Uygulama mağazalarınızı bağlayın**: Adapty Kontrol Paneli'nde **App settings → General** bölümüne gidin. Capacitor uygulamanız her iki platformu da hedefliyorsa hem App Store hem de Google Play'i bağlayın. Bu, satın alma işlemlerinin çalışması için zorunludur.
[Uygulama mağazalarını bağla](integrate-payments)
2. **Public SDK anahtarınızı kopyalayın**: Adapty Kontrol Paneli'nde **App settings → General** bölümüne gidin, ardından **API keys** kısmını bulun. Kodda bu, `adapty.activate()` fonksiyonuna ilettiğiniz dizedir.
3. **En az bir ürün oluşturun**: Adapty Kontrol Paneli'nde **Products** sayfasına gidin. Ürünlere kodda doğrudan erişmezsiniz — Adapty bunları paywall'lar aracılığıyla iletir.
[Ürün ekle](quickstart-products)
4. **Bir paywall ve placement oluşturun**: Adapty Kontrol Paneli'nde **Paywalls** sayfasında bir paywall oluşturun, ardından **Placements** sayfasında bir placement'a atayın. Kodda, placement ID'si `adapty.getFlow()` fonksiyonuna geçirdiğiniz string değerdir.
[Paywall oluşturun](quickstart-paywalls)
5. **Access level'ları ayarlayın**: Adapty Kontrol Paneli'nde, **Products** sayfasında her ürün için yapılandırın. Kodda, `profile.accessLevels['premium']?.isActive` içinde kontrol edilen string budur. Varsayılan `premium` access level çoğu uygulama için yeterlidir. Ödeme yapan kullanıcılar, ürüne bağlı olarak farklı özelliklere erişiyorsa (örneğin `basic` plan ile `pro` plan), kodlamaya başlamadan önce [ek access level'lar oluşturun](assigning-access-level-to-a-product).
:::tip
Beşini de aldıktan sonra kod yazmaya hazırsınız. LLM'inize şunu söyleyin: "Public SDK anahtarım X, placement ID'm Y" — böylece doğru başlatma ve flow çekme kodunu üretebilir.
:::
### Hazır olduğunuzda yapılandırın \{#set-up-when-ready\}
Kodlamaya başlamak için bunlar zorunlu değil, ancak entegrasyonunuz olgunlaştıkça ihtiyaç duyacaksınız:
- **A/B testleri**: **Placements** sayfasından yapılandırın. Kod değişikliği gerekmez.
[A/B testleri](ab-tests)
- **Ek paywall'lar ve placement'lar**: Farklı placement ID'leriyle daha fazla `getPaywall` çağrısı ekleyin.
- **Analitik entegrasyonlar**: **Integrations** sayfasından yapılandırın. Kurulum entegrasyona göre değişir. Bkz. [analitik entegrasyonlar](analytics-integration) ve [attribution entegrasyonlar](attribution-integration).
## LLM'nize Adapty Dokümanlarını Besleyin \{#feed-adapty-docs-to-your-llm\}
### Context7'yi Kullanın (önerilen)
[Context7](https://context7.com), LLM'inize güncel Adapty belgelerine doğrudan erişim sağlayan bir MCP sunucusudur. LLM'iniz, ne sorduğunuza göre doğru belgeleri otomatik olarak getirir — manuel URL yapıştırmaya gerek yoktur.
Context7; **Cursor**, **Claude Code**, **Windsurf** ve diğer MCP uyumlu araçlarla çalışır. Kurulum için şunu çalıştırın:
```
npx ctx7 setup
```
Bu komut editörünüzü algılar ve Context7 sunucusunu yapılandırır. Manuel kurulum için [Context7 GitHub deposuna](https://github.com/upstash/context7) bakın.
Yapılandırıldıktan sonra, Adapty kütüphanesine prompt'larınızda referans verin:
```
Use the adaptyteam/adapty-docs library to look up how to install the Capacitor SDK
```
:::warning
Context7, belge bağlantılarını manuel olarak yapıştırma ihtiyacını ortadan kaldırsa da uygulama sırası önemlidir. Her şeyin doğru çalıştığından emin olmak için aşağıdaki [uygulama adımlarını](#implementation-walkthrough) sırayla takip edin.
:::
### Düz metin dokümanları kullanın \{#use-plain-text-docs\}
Her Adapty dokümanına düz metin Markdown olarak erişebilirsiniz. URL'nin sonuna `.md` ekleyin ya da makale başlığının altındaki **Copy for LLM** düğmesine tıklayın. Örneğin: [adapty-cursor-capacitor.md](https://adapty.io/docs/tr/adapty-cursor-capacitor.md).
Aşağıdaki [uygulama adım adım kılavuzundaki](#implementation-walkthrough) her aşama, yapıştırabileceğiniz `.md` bağlantılarını içeren bir "Bunu LLM'inize gönderin" bloğu içerir.
Aynı anda daha fazla dokümana ulaşmak için aşağıdaki [indeks dosyalarına ve platforma özgü alt kümelere](#plain-text-doc-index-files) bakın.
## Uygulama adım adım \{#implementation-walkthrough\}
Bu kılavuzun geri kalanı, Adapty entegrasyonunu uygulama sırasına göre adım adım ele alır. Her aşamada LLM'inize göndereceğiniz belgeler, tamamlandığında görmeniz gerekenler ve sık karşılaşılan sorunlar açıklanmaktadır.
### Entegrasyonu planlayın \{#plan-your-integration\}
Koda geçmeden önce LLM'inize projenizi analiz ettirin ve bir uygulama planı oluşturmasını isteyin. AI aracınız bir planlama modunu destekliyorsa (Cursor veya Claude Code'un plan modu gibi), LLM'in herhangi bir kod yazmadan önce hem proje yapınızı hem de Adapty dokümanlarını okuyabilmesi için bunu kullanın.
LLM'inize satın almalar için hangi yaklaşımı kullandığınızı söyleyin; bu, takip etmesi gereken kılavuzları etkiler:
- [**Adapty Flow Builder**](adapty-flow-builder): Flow'ları Adapty'nin no-code builder'ında oluşturursunuz, SDK bunları otomatik olarak işler.
- [**Manuel oluşturulan paywall'lar**](capacitor-making-purchases): Kendi paywall arayüzünüzü kodla oluşturursunuz, ancak ürünleri getirmek ve satın almaları yönetmek için Adapty'yi kullanırsınız.
- [**Observer modu**](observer-vs-full-mode): Mevcut satın alma altyapınızı korursunuz ve Adapty'yi yalnızca analitik ve entegrasyonlar için kullanırsınız.
Hangisini seçeceğinizden emin değil misiniz? [Hızlı başlangıçtaki karşılaştırma tablosunu](capacitor-quickstart-paywalls) okuyun.
### SDK'yı kurun ve yapılandırın \{#install-and-configure-the-sdk\}
npm ile Adapty SDK bağımlılığını ekleyin ve Public SDK anahtarınızla etkinleştirin. Bu, temel adımdır — diğer her şey buna bağlıdır.
**Rehber:** [Adapty SDK'yı kurun ve yapılandırın](sdk-installation-capacitor)
:::info
Bu rehber, Adapty Capacitor SDK v4 (beta) hedeflemektedir — API, [hızlı başlangıç](capacitor-quickstart-paywalls) kılavuzu tarafından anlatılmaktadır. v4 bir ön sürümdür, bu nedenle LLM'inizin en son kararlı 3.x sürümünü yüklemek yerine tam sürümü (`npm install @adapty/capacitor@4.0.0-beta.2`) sabitlediğinden emin olun. [SDK 4.0 kurulum bölümüne](sdk-installation-capacitor#adapty-sdk-40-beta) ve [geçiş kılavuzuna](migration-to-capacitor-sdk-v4) bakın.
:::
Bunu LLM'inize gönderin:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/tr/sdk-installation-capacitor.md
```
:::tip[Checkpoint]
- **Beklenen:** Uygulama hem iOS hem Android'de derlenir ve çalışır. Konsol, Adapty aktivasyon logunu gösterir.
- **Dikkat:** "Public API key is missing" → **App settings** sayfasından aldığınız gerçek anahtarla placeholder'ı değiştirdiğinizi kontrol edin.
:::
### Paywall'ları göster ve satın almaları yönet \{#show-paywalls-and-handle-purchases\}
Placement ID ile paywall çekip göster ve satın alma olaylarını yönet. İhtiyacın olan kılavuzlar, satın almaları nasıl yönettiğine bağlı.
Her satın almayı ilerlerken sandbox ortamında test et — sona bırakma. Kurulum talimatları için bkz. [Sandbox'ta satın alma testi](test-purchases-in-sandbox).
İsteğe bağlı `params` nesnesinin içinde iletilir. Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Bu varyantı kullanmanızı öneririz, çünkü kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağlar.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, mevcut olması durumunda önbelleğe alınmış veriyi döndürmek için `'return_cache_data_else_load'` kullanmayı değerlendirin. Bu senaryoda kullanıcılar her zaman en güncel verilere ulaşamayabilir; ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak amacıyla oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Paywall'ları daha hızlı getirmek için CDN, CDN'ye ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanırız. Bu sistem, paywall'larınızın her zaman en güncel sürümünü almanızı sağlarken internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği koruyacak şekilde tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |İsteğe bağlı `params` nesnesinin içinde iletilir. Bu değer, söz konusu yöntem için zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu yöntemin `loadTimeoutMs` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem, arka planda farklı isteklerden oluşabilir.
| **Ürün ID'lerini kodun içine gömmeyин.** Kodun içine gömmeniz gereken tek şey placement ID'sidir. Flow'lar ve paywall'lar uzaktan yapılandırıldığından, ürün sayısı ve mevcut teklifler her an değişebilir. Uygulamanız bu değişiklikleri dinamik olarak ele almalıdır; bir paywall bugün iki ürün döndürüyorsa ve yarın üç ürün döndürüyorsa, kod değişikliği yapmadan hepsini gösterin. Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | Flow'un tanımlayıcılarını (`id`, `variationId`), adını, placement'ını, paywall varyasyonlarını (`paywalls`) ve remote config'leri (`remoteConfigs`) içeren bir `AdaptyFlow` nesnesi. | ## Görünüm yapılandırmasını getir \{#fetch-the-view-configuration\} :::important Builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse, görünüm yapılandırması alınamaz. ::: Placement **Flow Builder** veya **Paywall Builder** ile tasarlandıysa, Adapty arayüzü sizin için oluşturur. `createFlowView` ile görünümü oluşturun, ardından [flow veya paywall'ı gösterin](capacitor-present-paywalls). Placement, Builder arayüzü olmayan özel bir paywall ise bunun yerine [remote config paywall olarak işleyin](present-remote-config-paywalls-capacitor). Capacitor SDK'sında, view yapılandırmasını önceden almanıza gerek yoktur; `createFlowView` metodunu doğrudan çağırabilirsiniz. :::warning `createFlowView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa `createFlowView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak hataya yol açabilir. ::: ```typescript showLineNumbers try { const view = await createFlowView(flow); } catch (error) { // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | zorunlu | İstenen flow/paywall için controller elde etmek üzere kullanılan `AdaptyFlow` nesnesi. | | **customTags** | opsiyonel | Özel etiketlerin ve çözümlenmiş değerlerinin bir sözlüğünü tanımlar. Özel etiketler, içerikteki yer tutucular olarak işlev görür ve flow/paywall içinde kişiselleştirilmiş içerik sunmak amacıyla belirli dizelerle dinamik olarak değiştirilir. Daha fazla ayrıntı için Paywall Builder'da özel etiketler konusuna bakın. | | **prefetchProducts** | opsiyonel | Ürünlerin ekranda gösterilme zamanlamasını optimize etmek için etkinleştirin. `true` olduğunda AdaptyUI gerekli ürünleri otomatik olarak çeker. Varsayılan: `true`. | | **android.enableSafeArea** | opsiyonel | Yalnızca Android (iOS'ta yoksayılır). `android` anahtarı altında yer alır. `true` olduğunda flow görünümü güvenli alan dolgularını uygular. Varsayılan: `true`. Varsayılan değer çoğu durum için uygundur. | :::note Birden fazla dil kullanıyorsanız, [flow yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi ve yerel ayar kodlarını nasıl doğru kullanacağınızı [buradan](capacitor-localizations-and-locale-codes) öğrenin. ::: Görünümü elde ettikten sonra [flow/paywall'ı gösterin](capacitor-present-paywalls). ## Varsayılan kitle için flow veya paywall getirerek daha hızlı yükleme sağlayın \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle flow'lar ve paywall'lar neredeyse anında getirilir, bu nedenle bu süreci hızlandırmak için endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve placement'ınız varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, bir flow veya paywall getirmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiçbir şey göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak amacıyla varsayılan bir flow veya paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın **All Users** kitlesi için flow veya paywall'ı getiren `getFlowForDefaultAudience` metodunu kullanabilirsiniz. Ancak şunu anlamak kritik önem taşır: önerilen yaklaşım, yukarıdaki [Flow/paywall getirme](#fetch-flowpaywall) bölümünde ayrıntılı olarak açıklanan `getFlow` metoduyla flow veya paywall'ı getirmektir. :::warning Neden `getFlow` kullanmanızı öneririz `getFlowForDefaultAudience` metodunun birkaç önemli dezavantajı vardır: - **Potansiyel geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri için (mevcut ve gelecekteki) farklı paywall'lar göstermeniz gerekirse, zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywall'lar tasarlamak zorunda kalırsınız ya da mevcut (eski) sürüme sahip kullanıcıların render edilemeyen paywall'larla sorun yaşayabileceğini kabul etmeniz gerekir. - **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görecektir; bu da ülkelere, pazarlama attribution'ına veya kendi özel niteliklerinize dayalı kişiselleştirilmiş hedeflemeyi kaybetmeniz anlamına gelir. Bu dezavantajları kabul ederek daha hızlı flow veya paywall yükleme işleminden yararlanmak istiyorsanız, `getFlowForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde [yukarıda](#fetch-flowpaywall) açıklanan `getFlow` metodunu kullanmaya devam edin. ::: ```typescript showLineNumbers try { const flow = await adapty.getFlowForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', }); // the requested flow/paywall } catch (error) { // handle the error } ``` | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | [Placement](placements) tanımlayıcısı. Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **fetchPolicy** | varsayılan: `'reload_revalidating_cache_data'` |İsteğe bağlı `params` nesnesi içinde iletilir. SDK varsayılan olarak sunucudan veri yüklemeye çalışır; hata durumunda önbellekteki veriyi döner. Bu seçeneği öneriyoruz çünkü kullanıcılarınızın her zaman en güncel veriye erişmesini sağlar.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `'return_cache_data_else_load'` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en son veriyi alamayabilir; ama internet bağlantısı ne kadar tutarsız olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellendiğinden, ağ isteklerini azaltmak amacıyla oturum boyunca güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini unutmayın; yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlenir.
| ## Varlıkları özelleştirme \{#customize-assets\} Flow/paywall'ınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görseller ve videolar, önceden tanımlanmış ID'lere sahiptir: `hero_image` ve `hero_video`. Özel bir varlık paketinde bu öğeleri ID'leri aracılığıyla hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video göstermek. - Uzaktaki ana görsel yüklenirken yerel bir önizleme görseli göstermek. - Video oynatılmadan önce bir önizleme görseli göstermek. İşte özel varlıkları basit bir sözlük aracılığıyla nasıl sağlayabileceğinize dair bir örnek: ```typescript showLineNumbers const customAssets: Recordisteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenir. İlk alt etiket dil için, ikincisi ise bölge için kullanılır.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) bölümüne bakın.
| | **params** | isteğe bağlı | Paywall'u getirmek için ek parametreler. | **Ürün ID'lerini sabit kodlamayın.** Sabit kodlamanız gereken tek ID, placement ID'sidir. Paywall'lar uzaktan yapılandırıldığından, ürün sayısı ve mevcut teklifler her an değişebilir. Uygulamanız bu değişiklikleri dinamik olarak ele almalıdır; bir paywall bugün iki ürün, yarın üç ürün döndürüyorsa, kod değişikliği yapmadan hepsini göstermelidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Ürün kimliklerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer birçok özelliği içeren bir [`AdaptyPaywall`](https://capacitor.adapty.io/interfaces/adaptypaywall) nesnesidir. | ## Paywall Builder ile tasarlanmış paywall'ın görünüm konfigürasyonunu alma \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse, görünüm konfigürasyonu alınamaz. ::: Paywall'ı aldıktan sonra, Paywall Builder kullanılarak oluşturulduğunu belirten `ViewConfiguration` içerip içermediğini kontrol edin. Bu, paywall'ı nasıl göstereceğiniz konusunda size yol gösterecektir. `ViewConfiguration` mevcutsa Paywall Builder paywall'ı olarak işleyin; değilse, [remote config paywall olarak ele alın](present-remote-config-paywalls-capacitor). Capacitor SDK'da, view configuration'ı manuel olarak önceden almadan doğrudan `createPaywallView` metodunu çağırın. :::warning `createPaywallView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa, `createPaywallView` metodunu yeniden çağırın. ::: ```typescript showLineNumbers if (paywall.hasViewConfiguration) { try { const view = await createPaywallView(paywall); } catch (error) { // handle the error } } else { // use your custom logic } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------- | :------- | :----------------------------------------------------------- | | **paywall** | zorunlu | İstenen paywall için bir controller elde etmek üzere kullanılan `AdaptyPaywall` nesnesi. | | **customTags** | isteğe bağlı | Özel etiketlerin ve çözümlenmiş değerlerinin bir sözlüğünü tanımlar. Özel etiketler, paywall içeriğinde yer tutucu olarak işlev görür ve paywall içinde kişiselleştirilmiş içerik sunmak için belirli dizelerle dinamik olarak değiştirilir. Daha fazla ayrıntı için Paywall builder'da özel etiketler konusuna bakın. | | **prefetchProducts** | isteğe bağlı | Ekranda ürünlerin görüntülenme zamanlamasını optimize etmek için etkinleştirin. `true` olarak ayarlandığında AdaptyUI, gerekli ürünleri otomatik olarak getirir. Varsayılan: `false`. | :::note Birden fazla dil kullanıyorsanız, [Paywall Builder yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi ve yerel ayar kodlarını doğru kullanmayı [buradan](capacitor-localizations-and-locale-codes) öğrenebilirsiniz. ::: Görünümü elde ettikten sonra [paywalli gösterin](capacitor-present-paywalls). ## Varsayılan kitle için paywallı daha hızlı getir \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle paywalllar neredeyse anında getirilir, bu yüzden bu süreci hızlandırmak için endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve paywallınız varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, bir paywallı getirmek istediğinizden daha uzun sürebilir. Bu durumlarda, hiç paywall göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın paywall'ını **All Users** kitlesi için getiren `getPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak şunu bilmeniz önemlidir: önerilen yaklaşım, paywall'ı yukarıdaki [Paywall Bilgisini Getirme](#fetch-paywall-designed-with-paywall-builder) bölümünde açıklandığı gibi `getPaywall` metoduyla getirmektir. :::warning Neden `getPaywall` kullanmanızı öneriyoruz `getPaywallForDefaultAudience` metodunun birkaç önemli dezavantajı vardır: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywall'lar göstermeniz gerekiyorsa, mevcut (eski) sürümü destekleyen paywall'lar tasarlamak ya da mevcut (eski) sürümdeki kullanıcıların oluşturulamayan paywall'larla sorun yaşayabileceğini kabul etmek zorunda kalırsınız. - **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görür; bu da ülkelere, pazarlama attribution'ına veya kendi özel özelliklerinize dayalı kişiselleştirilmiş hedeflemeyi kaybetmeniz anlamına gelir. Bu dezavantajları göze alarak daha hızlı paywall yüklemenin avantajından yararlanmak istiyorsanız, `getPaywallForDefaultAudience` metodunu aşağıdaki şekilde kullanın. Aksi takdirde [yukarıda](#fetch-paywall-designed-with-paywall-builder) açıklanan `getPaywall` metodunu kullanmaya devam edin. ::: ```typescript showLineNumbers try { const paywall = await adapty.getPaywallForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en', }); // istenen paywall } catch (error) { // hatayı işleyin } ``` | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | [Placement](placements) tanımlayıcısı. Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](capacitor-localizations-and-locale-codes) bölümüne bakın.
| | **params** | isteğe bağlı | Paywall'ı getirmek için ek parametreler. | ## Varlıkları özelleştirin \{#customize-assets\} Paywallınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görseller ve videoların önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir varlık paketinde bu öğeleri ID'lerine göre hedefleyerek davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID ayarlamanız](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterebilirsiniz. - Uzaktaki ana görsel yüklenirken yerel bir önizleme görseli gösterebilirsiniz. - Video başlamadan önce bir önizleme görseli gösterebilirsiniz. İşte özel varlıkları basit bir sözlük aracılığıyla nasıl sağlayabileceğinize dair bir örnek: ```typescript showLineNumbers const customAssets: Recordisteğe bağlı
varsayılan: `'reload_revalidating_cache_data'`
|SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `'return_cache_data_else_load'` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar düzensiz olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak amacıyla oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırıldığında veya manuel temizlik yapıldığında sıfırlandığını unutmayın.
Adapty SDK, flow'ları ve paywall'ları iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](capacitor-use-fallback-paywalls). Flow'ları ve paywall'ları daha hızlı getirmek için CDN, CDN'e ulaşılamadığında ise bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken flow'larınızın her zaman en güncel sürümünü almanızı garanti edecek şekilde tasarlanmıştır.
| | **params.loadTimeoutMs** |isteğe bağlı
varsayılan: 5000 ms
|Bu değer, metodun zaman aşımı süresini (milisaniye cinsinden) sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeoutMs` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| :::note v4'te `getFlow` artık `locale` parametresi almıyor. Özel paywalllar için mevcut tüm locale'ler, flow'un remote config'inde (`flow.remoteConfigs`) döndürülür; kullanıcının cihazına veya uygulama ayarına uyan olanı seçin. ::: Ürün ID'lerini kod içine sabit olarak yazmayın! Flow'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız o 2 ürünü göstermelidir. Ancak daha sonra 3 ürün alırsanız, herhangi bir kod değişikliği gerektirmeden uygulamanız 3 ürünü de göstermelidir. Tek sabit olarak yazmanız gereken şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Placement, tanımlayıcılar (`id`, `variationId`), ad, paywall varyasyonları (`paywalls`) ve yapılandırılmış her yerel ayar için bir giriş içeren `remoteConfigs` dizisini barındıran bir `AdaptyFlow` nesnesi. Flow için ürünleri getirmek üzere `getPaywallProducts({ flow })` çağrısını kullanın. | ## Ürünleri getir \{#fetch-products\} Flow'u aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```typescript showLineNumbers try { const products = await adapty.getPaywallProducts({ flow }); // the requested products list } catch (error) { console.error('Failed to fetch products:', error); } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer çeşitli özellikleri içeren [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) nesnesindeki bu özelliklere erişmeniz gerekecektir. Aşağıda en sık kullanılan özellikler gösterilmektedir; mevcut tüm özellikler için bağlantılı dokümana bakın. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Başlık** | Ürün başlığını göstermek için `product.localizedTitle` kullanın. Yerelleştirme, cihazın yerel ayarına değil, kullanıcının seçtiği mağaza ülkesine göre yapılır. | | **Fiyat** | Fiyatın yerelleştirilmiş halini göstermek için `product.price?.localizedString` kullanın. Bu yerelleştirme cihazın yerel ayarına göre yapılır. Fiyata sayısal olarak erişmek için `product.price?.amount` kullanabilirsiniz. Değer yerel para biriminde sunulur. İlgili para birimi sembolünü almak için `product.price?.currencySymbol` kullanın. | | **Abonelik Dönemi** | Dönemi (ör. hafta, ay, yıl vb.) göstermek için `product.subscription?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme cihazın yerel ayarına göre yapılır. Abonelik dönemine programatik olarak erişmek için `product.subscription?.subscriptionPeriod` kullanın. Buradan `unit` özelliğine erişerek uzunluğu (yani 'day', 'week', 'month', 'year' veya 'unknown') alabilirsiniz. `numberOfUnits` değeri ise dönem birimi sayısını verir. Örneğin üç aylık bir abonelikte `unit` özelliğinde `'month'`, `numberOfUnits` özelliğinde ise `3` görürsünüz. | | **Başlangıç Teklifi** | Bir aboneliğin başlangıç teklifi içerip içermediğini rozet veya başka bir gösterge ile belirtmek için `product.subscription?.offer?.phases` özelliğine bakın. Bu, ücretsiz deneme aşaması ve başlangıç fiyatı aşaması olmak üzere en fazla iki indirim aşaması içerebilen bir listedir. Her aşama nesnesi şu kullanışlı özellikleri içerir:isteğe bağlı
varsayılan: `'reload_revalidating_cache_data'`
|SDK, varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `'return_cache_data_else_load'` kullanmayı değerlendirin. Bu durumda kullanıcılar en son verilere her zaman ulaşamayabilir; fakat internet bağlantılarının kalitesinden bağımsız olarak daha hızlı yükleme süreleriyle karşılaşırlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum sırasında ağ isteklerinden kaçınmak amacıyla güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırılıp yeniden yüklendiğinde ya da manuel temizleme yapıldığında temizlendiğini unutmayın.
|isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve kullanım önerilerimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](capacitor-localizations-and-locale-codes) sayfasına bakın.
| | **params.fetchPolicy** |isteğe bağlı
varsayılan: `'reload_revalidating_cache_data'`
|Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve hata durumunda önbellekteki verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, varsa önbellekteki verileri döndürmek için `'return_cache_data_else_load'` kullanmayı düşünebilirsiniz. Bu durumda kullanıcılar en güncel verilere ulaşamayabilir, ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizleme yapıldığında sıfırlandığını unutmayın.
| | **params.loadTimeoutMs** |isteğe bağlı
varsayılan: 5000 ms
|Bu değer, metodun zaman aşımı süresini (milisaniye cinsinden) sınırlar. Zaman aşımına ulaşıldığında önbellekteki veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeoutMs`'de belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| **Ürün ID'lerini kodunuza sabit olarak yazmayın.** Kodunuza sabit olarak yazmanız gereken tek ID, placement ID'sidir. Paywalllar uzaktan yapılandırıldığından ürün sayısı ve mevcut teklifler her an değişebilir. Uygulamanız bu değişiklikleri dinamik olarak ele almalıdır; bugün iki ürün döndüren bir paywall yarın üç ürün döndürse bile kod değişikliği yapmadan hepsini göstermeniz gerekir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'leri listesi, paywall tanımlayıcısı, remote config ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://capacitor.adapty.io/interfaces/adaptypaywall) nesnesi. | ## Ürünleri çekme \{#fetch-products\} Paywallı aldıktan sonra ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```typescript showLineNumbers try { const products = await adapty.getPaywallProducts({ paywall }); // the requested products list } catch (error) { console.error('Failed to fetch products:', error); } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Ürün kimliği, ürün adı, fiyat, para birimi, abonelik süresi ve diğer çeşitli özellikleri içeren [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken, büyük olasılıkla [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) nesnesindeki bu özelliklere ihtiyaç duyacaksınız. Aşağıda en sık kullanılan özellikler gösterilmektedir; mevcut tüm özelliklere ilişkin ayrıntılar için bağlantılı belgeye başvurun. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Ürünün başlığını göstermek için `product.localizedTitle` kullanın. Yerelleştirmenin cihazın dilayarına değil, kullanıcının seçtiği mağaza ülkesine göre yapıldığını unutmayın. | | **Price** | Fiyatın yerelleştirilmiş halini göstermek için `product.price?.localizedString` kullanın. Bu yerelleştirme cihazın dil bilgisine göre yapılır. Fiyata sayısal olarak erişmek için `product.price?.amount` kullanabilirsiniz. Değer yerel para biriminde döner. İlgili para birimi sembolünü almak için `product.price?.currencySymbol` kullanın. | | **Subscription Period** | Dönemi (haftallık, aylık, yıllık vb.) göstermek için `product.subscription?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme cihazın diline göre yapılır. Abonelik dönemine programatik olarak erişmek için `product.subscription?.subscriptionPeriod` kullanın. Buradan `unit` özelliğiyle süre birimini ('day', 'week', 'month', 'year' veya 'unknown') alabilirsiniz. `numberOfUnits` değeri ise dönem birimi sayısını verir. Örneğin üç aylık bir abonelikte `unit` özelliğinde `'month'`, `numberOfUnits` özelliğinde `3` görürsünüz. | | **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerip içermediğini rozet veya başka bir göstergeyle belirtmek için `product.subscription?.offer?.phases` özelliğine bakın. Bu liste en fazla iki indirim aşaması içerebilir: ücretsiz deneme aşaması ve başlangıç fiyatı aşaması. Her aşama nesnesinde şu yararlı özellikler bulunur:isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve kullanım önerilerimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](capacitor-localizations-and-locale-codes) sayfasına bakın.
| | **params.fetchPolicy** |isteğe bağlı
varsayılan: `'reload_revalidating_cache_data'`
|Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve hata durumunda önbellekteki verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, varsa önbellekteki verileri döndürmek için `'return_cache_data_else_load'` kullanmayı düşünebilirsiniz. Bu durumda kullanıcılar en güncel verilere ulaşamayabilir, ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizleme yapıldığında sıfırlandığını unutmayın.
|isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **params.fetchPolicy** |isteğe bağlı
varsayılan: `'reload_revalidating_cache_data'`
|Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır ve hata durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, mevcut olduğunda önbelleğe alınmış verileri döndürmek için `'return_cache_data_else_load'` kullanmayı değerlendirin. Bu durumda kullanıcılar en son verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellendiğinden, ağ isteklerini önlemek amacıyla oturum sırasında kullanmak güvenlidir.
Önbelleğin, uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
| | **params.loadTimeoutMs** |isteğe bağlı
varsayılan: 5000 ms
|Bu değer, bu metot için zaman aşımını (milisaniye cinsinden) sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metot, `loadTimeoutMs` içinde belirtilenden biraz daha geç zaman aşımına uğrayabilir; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **onboarding** | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özellikleri içeren bir [`AdaptyOnboarding`](https://capacitor.adapty.io/interfaces/adaptyonboarding) nesnesi. | ## Varsayılan kitle onboarding'i ile onboarding getirmeyi hızlandırın \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Onboarding'ler genellikle neredeyse anında getirilir, bu nedenle bu süreci hızlandırmak için endişelenmenize gerek yoktur. Ancak çok sayıda kitleniz ve onboarding'iniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, bir onboarding'i getirmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak amacıyla varsayılan bir onboarding görüntülemek isteyebilirsiniz. Bu sorunu gidermek için, belirtilen placement'ın **Tüm Kullanıcılar** kitlesi için onboarding'i getiren `getOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding'i Getirme](#fetch-onboarding) bölümünde açıklandığı şekilde `getOnboarding` metoduyla onboarding getirmek olduğunu anlamak önemlidir. :::warning `getOnboardingForDefaultAudience` yerine `getOnboarding` kullanmayı değerlendirin; çünkü ikincisinin önemli sınırlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorunlara yol açabilir; geriye dönük uyumlu tasarımlar yapmanızı ya da eski sürümlerin hatalı görüntülenebileceğini kabul etmenizi gerektirir. - **Kişiselleştirme yok**: Yalnızca "Tüm Kullanıcılar" kitlesi için içerik gösterir; ülke, attribution veya özel niteliklere dayalı hedeflemeyi ortadan kaldırır. Kullanım durumunuzda daha hızlı getirme bu dezavantajlardan daha önemliyse aşağıda gösterildiği gibi `getOnboardingForDefaultAudience` kullanın. Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı gibi `getOnboarding` kullanın. ::: ```typescript showLineNumbers try { const onboarding = await adapty.getOnboardingForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en', params: { fetchPolicy: 'reload_revalidating_cache_data' // Load from server, fallback to cache } }); console.log('Default audience onboarding fetched successfully'); } catch (error) { console.error('Failed to fetch default audience onboarding:', error); } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **params.fetchPolicy** |isteğe bağlı
varsayılan: `'reload_revalidating_cache_data'`
|Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır ve hata durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, mevcut olduğunda önbelleğe alınmış verileri döndürmek için `'return_cache_data_else_load'` kullanmayı değerlendirin. Bu durumda kullanıcılar en son verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellendiğinden, ağ isteklerini önlemek amacıyla oturum sırasında kullanmak güvenlidir.
Önbelleğin, uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
| --- # File: capacitor-present-onboardings --- --- title: "Capacitor SDK'da onboarding'leri sunma" description: "Dönüşümleri ve geliri artırmak için Capacitor'da onboarding'lerin nasıl sunulacağını keşfedin." --- :::warning **Onboarding'ler SDK v4'te kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır.** Artık hata düzeltmesi veya iyileştirme almamaktadır. Bunun yerine [flow'ları](capacitor-get-pb-paywalls) kullanın: WebView içinde çalışan onboarding'lerin aksine, flow'lar cihazda yerel olarak render edilir — bu sayede daha akıcı animasyonlar, tutarlı bir yerel görünüm, daha hızlı yükleme süreleri ve WebView bağımlılığı olmadan çalışma imkânı sunar. Başlamak için [Flow'ları ve paywallları edinin](capacitor-get-pb-paywalls) ve [Flow'ları ve paywallları görüntüleyin](capacitor-present-paywalls) sayfalarına bakın. ::: Onboarding'i builder ile özelleştirdiyseniz, kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render işlemi yapmanıza gerek yoktur. Böyle bir onboarding, hem onboarding içinde gösterilecekleri hem de bunların nasıl gösterileceğini içerir. Başlamadan önce şunları tamamladığınızdan emin olun: 1. Bir [onboarding oluşturdunuz](create-onboarding). 2. Onboarding'i bir [placement](placements)'a eklediniz. ## Onboarding'i sunma \{#present-onboarding\} Bir onboarding'i görüntülemek için `createOnboardingView` metodu ile oluşturulan `view` üzerinde `view.present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Onboarding'i tekrar görüntülemeniz gerekiyorsa, yeni bir `view` örneği oluşturmak için `createOnboardingView`'ı bir kez daha çağırın. :::warning Aynı `view`'ı yeniden oluşturmadan tekrar kullanmak hataya yol açabilir. ::: ```typescript showLineNumbers try { const view = await createOnboardingView(onboarding); view.setEventHandlers({ onClose: (actionId, meta) => { console.log('Onboarding closed:', actionId); return true; // Allow the onboarding to close }, onCustom: (actionId, meta) => { console.log('Custom action:', actionId); return false; // Don't close the onboarding } }); await view.present(); console.log('Onboarding presented successfully'); } catch (error) { console.error('Failed to present onboarding:', error); } ``` ## iOS sunum stilini yapılandırma \{#configure-ios-presentation-style\} `present()` metoduna `iosPresentationStyle` parametresini geçirerek onboarding'in iOS'ta nasıl sunulacağını yapılandırın. Parametre `'full_screen'` (varsayılan) veya `'page_sheet'` değerlerini kabul eder. ```typescript showLineNumbers await view.present({ iosPresentationStyle: 'page_sheet' }); ``` ## Onboardinglerde bağlantıların nasıl açıldığını özelleştirin \{#customize-how-links-open-in-onboardings\} :::important Onboardinglerde bağlantıların nasıl açıldığını özelleştirme özelliği Adapty SDK v3.15 sürümünden itibaren desteklenmektedir. ::: Varsayılan olarak, onboardinglerdeki bağlantılar uygulama içi tarayıcıda açılır. Bu, web sayfalarını uygulamanız içinde göstererek kullanıcıların uygulama değiştirmeden görüntülemesine olanak tanır ve kesintisiz bir kullanıcı deneyimi sağlar. Bağlantıların bunun yerine harici tarayıcıda açılmasını tercih ediyorsanız, `openIn` parametresini `browser_out_app` olarak ayarlayarak bu davranışı özelleştirebilirsiniz: ```typescript showLineNumbers await view.present({ openIn: 'browser_out_app' }); // default — browser_in_app ``` ## Sonraki adımlar \{#next-steps\} Onboarding'inizi sunduktan sonra [kullanıcı etkileşimlerini ve olayları ele almayı](capacitor-handling-onboarding-events) öğrenebilirsiniz. Kullanıcı eylemlerine yanıt vermek ve analizleri takip etmek için onboarding olaylarının nasıl işleneceğini öğrenin. --- # File: capacitor-handling-onboarding-events --- --- title: "Capacitor SDK'da onboarding olaylarını yönetin" description: "Adapty kullanarak Capacitor'da onboarding ile ilgili olayları yönetin." --- :::warning **Onboardings, SDK v4'te kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır.** Artık hata düzeltmesi veya iyileştirme almamaktadır. Bunun yerine [flow](capacitor-get-pb-paywalls)'ları kullanın: onboarding'lerin WebView içinde çalışmasının aksine, flow'lar cihazda yerel olarak render edilir — bu sayede daha akıcı animasyonlar, tutarlı bir native görünüm, daha hızlı yükleme süreleri ve WebView runtime bağımlılığı ortadan kalkar. Başlamak için [Flow ve paywall'ları alma](capacitor-get-pb-paywalls) ve [Flow ve paywall'ları gösterme](capacitor-present-paywalls) konularına bakın. ::: Oluşturucuyla yapılandırılan onboarding'ler, uygulamanızın yanıt verebileceği olaylar üretir. Bağımsız ekran sunumu için bu olayları işlemek amacıyla `setEventHandlers` metodunu kullanın. Başlamadan önce şunları yaptığınızdan emin olun: 1. [Bir onboarding oluşturdunuz](create-onboarding). 2. Onboarding'i bir [placement](placements)'a eklediniz. ## Olay işleyicilerini ayarlama \{#set-up-event-handlers\} Onboarding olaylarını işlemek için `view.setEventHandlers` metodunu kullanın: ```typescript showLineNumbers try { const view = await createOnboardingView(onboarding); view.setEventHandlers({ onAnalytics(event, meta) { console.log('Analytics event:', event); }, onClose(actionId, meta) { console.log('Onboarding closed:', actionId); return true; // Allow the onboarding to close }, onCustom(actionId, meta) { console.log('Custom action:', actionId); return false; // Don't close the onboarding }, onPaywall(actionId, meta) { console.log('Paywall action:', actionId); view.dismiss().then(() => { openPaywall(actionId); }); }, onStateUpdated(action, meta) { console.log('State updated:', action); }, onFinishedLoading(meta) { console.log('Onboarding finished loading'); }, onError(error) { console.error('Onboarding error:', error); }, }); await view.present(); } catch (error) { console.error('Failed to present onboarding:', error); } ``` ## Olay türleri \{#event-types\} Aşağıdaki bölümler, yönetebileceğiniz farklı olay türlerini açıklamaktadır. ### Özel eylemleri yönetme \{#handle-custom-actions\} Builder'da bir düğmeye **özel** eylem ekleyebilir ve ona bir ID atayabilirsiniz.
Bu ID'yi kodunuzda kullanarak özel bir eylem olarak işleyebilirsiniz. Örneğin, kullanıcı **Login** veya **Allow notifications** gibi özel bir butona dokunduğunda, event handler `actionId` parametresiyle tetiklenir ve bu parametre builder'daki **Action ID** değeriyle eşleşir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
```typescript showLineNumbers
view.setEventHandlers({
onCustom(actionId, meta) {
switch (actionId) {
case 'login':
console.log('Login action triggered');
break;
case 'allow_notifications':
console.log('Allow notifications action triggered');
break;
}
return false; // Don't close the onboarding
},
});
```
:::important
Kullanıcı onboarding'i kapattığında ne olacağını yönetmeniz gerektiğini unutmayın. Örneğin, onboarding'in kendisini göstermeyi durdurmanız gerekir.
:::
```typescript showLineNumbers
view.setEventHandlers({
onClose(actionId, meta) {
console.log('Onboarding closed:', actionId);
return true; // Onboarding'in kapanmasına izin ver
},
});
```
Kullanıcının ödeme isteğini iptal ettiğini belirtir.
Herhangi bir işlem yapmanız gerekmez; ancak iş mantığı açısından kullanıcıya indirim teklif edebilir veya daha sonra hatırlatabilirsiniz.
| | paymentInvalid | 3 | Ödeme parametrelerinden birinin mağaza tarafından tanınmadığını belirtir. | | paymentNotAllowed | 4 |Kullanıcının ödeme yapmasına izin verilmediğini belirtir. Olası nedenler:
- Kullanıcının bulunduğu ülkede ödemeler desteklenmiyor.
- Kullanıcı reşit değil.
| | storeProductNotAvailable | 5 | İstenen ürünün App Store'da mevcut olmadığını belirtir. Ürünün kullanılan ülke için geçerli olduğundan emin olun. | | cloudServicePermissionDenied | 6 | Kullanıcının Cloud servisi bilgilerine erişime izin vermediğini belirtir. | | cloudServiceNetworkConnectionFailed | 7 | Cihazın ağa bağlanamadığını belirtir. | | cloudServiceRevoked | 8 | Kullanıcının bu cloud servisini kullanma iznini iptal ettiğini belirtir. | | privacyAcknowledgementRequired | 9 | Kullanıcının mağaza gizlilik politikasını henüz onaylamadığını belirtir. | | unauthorizedRequestData | 10 | İsteğin hatalı oluşturulduğunu belirtir. | | invalidOfferIdentifier | 11 |Teklif tanımlayıcısı geçerli değil. Olası nedenler:
- App Store'da bu tanımlayıcıyla bir teklif oluşturmadınız.
- Teklifi iptal ettiniz.
- Teklif ID'sini yanlış girdiniz.
| | invalidSignature | 12 | Ödeme indirimindeki imzanın geçerli olmadığını belirtir. **In-app purchase Key ID** alanını doldurduğunuzdan ve **In-App Purchase Private Key** dosyasını yüklediğinizden emin olun. Ayrıntılar için [App Store entegrasyonunu yapılandırma](app-store-connection-configuration) konusuna bakın. | | missingOfferParams | 13 |Bu hata, Adapty entegrasyonuyla veya tekliflerle ilgili sorunlara işaret eder.
Nasıl yapılandırılacağı hakkında ayrıntılar için [App Store entegrasyonunu yapılandırma](app-store-connection-configuration) ve [Teklifler](offers) konularına bakın.
| | invalidOfferPrice | 14 | Mağazada belirlediğiniz fiyatın artık geçerli olmadığını belirtir. Teklifler her zaman indirimli bir fiyatı temsil etmelidir. | ## Özel Android Kodları \{#custom-android-codes\} | Hata | Kod | Açıklama | |-----|----|-----------| | adaptyNotInitialized | 20 | Adapty SDK'yı `Adapty.activate` metoduyla düzgün şekilde yapılandırmanız gerekiyor. [React Native için](sdk-installation-reactnative) nasıl yapılacağını öğrenin. | | productNotFound | 22 | Satın alınmak istenen ürünün mağazada mevcut olmadığını belirtir. | | invalidJson | 23 | Paywall JSON'ı geçerli değil. Adapty Kontrol Paneli'nde düzeltin. Nasıl düzeltileceği hakkında ayrıntılar için [Paywall'u remote config ile özelleştirme](customize-paywall-with-remote-config) konusuna bakın. | | currentSubscriptionToUpdateNotFoundInHistory | 24 | Yenilenmesi gereken orijinal abonelik geçmişte bulunamadı. | | pendingPurchase | 25 | Satın alma durumunun tamamlanmış değil, beklemede olduğunu belirtir. Ayrıntılar için Android Developer belgelerindeki [Bekleyen işlemleri yönetme](https://developer.android.com/google/play/billing/integrate#pending) sayfasına bakın. | | billingServiceTimeout | 97 | Google Play'in yanıt veremeden önce isteğin maksimum zaman aşımına ulaştığını belirtir. Bu durum, örneğin Play Billing Library çağrısının istenen işlemi yürütmesinde gecikme yaşanmasından kaynaklanabilir. | | featureNotSupported | 98 | İstenen özellik, mevcut cihazda Play Store tarafından desteklenmiyor. | | billingServiceDisconnected | 99 | Bu kritik hata, istemci uygulamanın `BillingClient` aracılığıyla Google Play Store servisine olan bağlantısının kesildiğini belirtir. | | billingServiceUnavailable | 102 | Bu geçici hata, Google Play Billing servisinin şu anda kullanılamadığını belirtir. Çoğu durumda bu, istemci cihaz ile Google Play Billing servisleri arasında herhangi bir noktada ağ bağlantısı sorunu olduğu anlamına gelir. | | billingUnavailable | 103 |Satın alma işlemi sırasında kullanıcı kaynaklı bir faturalama hatası oluştuğunu belirtir. Bu hatanın oluşabileceği durumlar şunlardır:
1\. Kullanıcının cihazındaki Play Store uygulaması güncel değil.
2. Kullanıcı desteklenmeyen bir ülkede.
3. Kullanıcı bir kurumsal hesap kullanıyor ve kurumsal yönetici satın alma işlemlerini devre dışı bırakmış.
4. Google Play, kullanıcının ödeme yöntemini tahsil edemiyor. Örneğin, kullanıcının kredi kartı süresi dolmuş olabilir.
5. Kullanıcı Play Store uygulamasında oturum açmamış.
| | developerError | 105 | Bu kritik hata, bir API'nin yanlış kullanıldığını belirtir. | | billingError | 106 | Bu kritik hata, Google Play'in kendi içinde bir sorun olduğunu belirtir. | | itemAlreadyOwned | 107 | Consumable ürün zaten satın alınmış. | | itemNotOwned | 108 | İstenen işlemin öğe üzerinde başarısız olduğunu belirtir. | ## Özel StoreKit Kodları \{#custom-storekit-codes\} | Hata | Kod | Açıklama | |-----|----|-----------| | noProductIDsFound | 1000 |Paywall'daki ürünlerin hiçbirinin mağazada mevcut olmadığını belirtir.
Bu hatayla karşılaşıyorsanız çözmek için aşağıdaki adımları izleyin:
1. Tüm ürünlerin Adapty Kontrol Paneli'ne eklenip eklenmediğini kontrol edin.
2. Uygulamanızın Bundle ID'sinin Apple Connect'tekiyle eşleştiğinden emin olun.
3. Uygulama mağazalarındaki ürün tanımlayıcılarının Kontrol Paneli'ne eklediğinizle eşleştiğini doğrulayın. Tanımlayıcıların, mağazada zaten dahil değilse Bundle ID içermemesi gerektiğine dikkat edin.
4. Apple vergi ayarlarında uygulamanın ücretli durumunun aktif olduğunu onaylayın. Vergi bilgilerinizin güncel ve sertifikalarınızın geçerli olduğundan emin olun.
5. Uygulamanın monetizasyona uygun olabilmesi için bir banka hesabının bağlı olup olmadığını kontrol edin.
6. Ürünlerin tüm bölgelerde kullanılabilir olup olmadığını kontrol edin. Ayrıca ürünlerinizin **"Ready to Submit"** durumunda olduğundan emin olun.
| | productRequestFailed | 1002 |Şu anda mevcut ürünler alınamıyor. Olası neden:
- Henüz önbellek oluşturulmamış ve aynı zamanda internet bağlantısı yok.
| | cantMakePayments | 1003 | Bu cihazda Uygulama İçi Satın Almalara izin verilmiyor. | | noPurchasesToRestore | 1004 | Google Play'in geri yüklenecek satın alma bulamadığını belirtir. | | cantReadReceipt | 1005 |Cihazda geçerli bir makbuz yok. Bu durum sandbox testleri sırasında sorun oluşturabilir.
Herhangi bir işlem yapmanız gerekmez; ancak iş mantığı açısından kullanıcıya indirim teklif edebilir veya daha sonra hatırlatabilirsiniz.
| | productPurchaseFailed | 1006 | Ürün satın alımı başarısız oldu. Bu hata, altta yatan bir StoreKit hatasını sarmalamaktadır — gerçek nedeni öğrenmek için sarmalanan hatayı okuyun (veya konsolda görmek için ayrıntılı logları etkinleştirin). Sarmalanan hata genellikle yukarıdaki tablodaki 0–14 arasındaki StoreKit kodlarından biridir; en yaygın olanları `paymentCancelled`, `paymentInvalid`, `paymentNotAllowed` veya `invalidOfferPrice`'tır. Belirli bir neden tespit edemiyorsanız yeni bir [sandbox profili](test-purchases-in-sandbox) deneyin; sorun devam ederse Apple desteğiyle iletişime geçin. | | refreshReceiptFailed | 1010 | Makbuzun alınamadığını belirtir. Yalnızca StoreKit 1 için geçerlidir. | | receiveRestoredTransactionsFailed | 1011 | Satın alma geri yükleme başarısız oldu. | ## Özel Ağ Kodları \{#custom-network-codes\} | Hata | Kod | Açıklama | | :------------------- | :--- | :----------------------------------------------------------- | | notActivated | 2002 | Adapty SDK'yı `Adapty.activate` metoduyla düzgün şekilde yapılandırmanız gerekiyor. [React Native için](sdk-installation-reactnative) nasıl yapılacağını öğrenin. | | badRequest | 2003 | Hatalı istek. | | serverError | 2004 | Sunucu hatası. | | networkFailed | 2005 | Ağ isteği başarısız oldu. | | decodingFailed | 2006 | Yanıt kod çözme işleminin başarısız olduğunu belirtir. | | encodingFailed | 2009 | İstek kodlama işleminin başarısız olduğunu belirtir. | | analyticsDisabled | 3000 | Analytics olaylarını işleyemiyoruz çünkü bu özelliği devre dışı bıraktınız. Ayrıntılar için [Analytics entegrasyonu](analytics-integration) konusuna bakın. | | wrongParam | 3001 | Bazı parametrelerinizin hatalı olduğunu belirtir: boş bırakılamayacak alanlar boş bırakılmış ya da yanlış türde değer girilmiş olabilir. | | activateOnceError | 3005 | `.activate` metodu birden fazla kez çağrılamaz. | | profileWasChanged | 3006 | İşlem sırasında kullanıcı profili değiştirildi. | | fetchTimeoutError | 3101 | Paywall'un belirlenen süre içinde alınamadığını belirtir. Bu durumu önlemek için [yerel yedekler ayarlayın](fetch-paywalls-and-products). | | operationInterrupted | 9000 | Bu işlem sistem tarafından kesildi. | --- # File: capacitor-sdk-migration-guides --- --- title: "Capacitor SDK Geçiş Kılavuzları" description: "Adapty Capacitor SDK sürümleri için geçiş kılavuzları." --- Bu sayfa, Adapty Capacitor SDK için tüm geçiş kılavuzlarını içermektedir. Ayrıntılı talimatlar için geçmek istediğiniz sürümü seçin: - **[v4.0'a geçiş (beta)](migration-to-capacitor-sdk-v4)** - [**v3.16'ya geçiş**](migration-to-capacitor-316) --- # File: migration-to-capacitor-sdk-v4 --- --- title: "Adapty Capacitor SDK'yı v. 4.0'a Geçirme" description: "Adapty Capacitor SDK v4.0'a (beta) geçiş yapın: paywall API'lerini flow API'leriyle değiştirin; hem Flow Builder hem de Paywall Builder ile uyumludur." --- Adapty Capacitor SDK 4.0 (beta), flow'ları tanıtır ve paywall API'lerini buna göre yeniden adlandırır. Yeni API'ler hem yeni Flow Builder hem de mevcut Paywall Builder ile çalışır — Adapty Kontrol Paneli tarafında herhangi bir kurulum değişikliği gerekmez. ## Hızlı Başvuru \{#quick-reference\} | v3 | v4 | |---|---| | `adapty.getPaywall({ placementId, locale?, params? })` | `adapty.getFlow({ placementId, params? })` | | `adapty.getPaywallForDefaultAudience({ placementId, locale?, params? })` | `adapty.getFlowForDefaultAudience({ placementId, params? })` | | `adapty.getPaywallProducts({ paywall })` | `adapty.getPaywallProducts({ flow })` | | `adapty.logShowPaywall({ paywall })` | `adapty.logShowFlow({ flow })` | | `AdaptyPaywall` (tür) | `AdaptyFlow` + `AdaptyFlowPaywall` | | `createPaywallView(paywall, params?)` | `createFlowView(flow, params?)` | | `PaywallViewController` | `FlowViewController` | | `EventHandlers` (tür) | `FlowEventHandlers` | | `CreatePaywallViewParamsInput` | `CreateFlowViewParamsInput` | | `onRenderingFailed` | `onError` | `AdaptyPaywallProduct` adını korur — ürünler hâlâ bir flow'a ait olmaya devam eder ve `getPaywallProducts` de adını korur, artık bir `AdaptyFlow` alır. `getFlow` ve `getFlowForDefaultAudience` metodları artık `locale` parametresi almaz. Satın alma ve profil API'leri (`makePurchase`, `restorePurchases`, `getProfile`, `identify`, `updateProfile`) ve `setFallback` aracılığıyla yedekler değişmeden kalır. `present`, `dismiss`, `setEventHandlers` ve `showDialog` gibi görünüm metodları ile `onCloseButtonPress`, `onUrlPress`, `onCustomAction`, `onProductSelected`, `onPurchaseStarted`, `onPurchaseCompleted`, `onPurchaseFailed`, `onRestoreStarted`, `onRestoreCompleted`, `onRestoreFailed`, `onLoadingProductsFailed`, `onWebPaymentNavigationFinished` ve `onAndroidSystemBack` olay işleyicileri v3'tekiyle aynı adları korur. Onboarding metodları çalışmaya devam eder ancak kullanımdan kaldırılmıştır — bkz. [Onboarding API kullanımdan kaldırma](#onboarding-api-deprecation). Bazı varsayılan davranışlar değişti — bkz. [Varsayılan davranış değişiklikleri](#default-behavior-changes). ## Minimum versions \{#minimum-versions\} Çalışma zamanı gereksinimleri v3.16+'dan bu yana değişmedi: **iOS 15.0**, **Android minSdk 24** ve **Capacitor 8**. Deployment target ayarlarında herhangi bir değişiklik gerekmez. Bir yeni derleme gereksinimi var: **Xcode 26 veya üzeri** — bu sürümle birlikte gelen yerel Adapty iOS SDK 4.0.0-beta.2, Swift tools 6.2 kullanıyor. v4, yerel Adapty SDK'larından iOS 4.0.0-beta.2 ve Android BOM 4.0.0-beta.1'i içeriyor. ## Kurulum \{#installation\} ### Paketi güncelleyin \{#update-the-package\} v4.0 bir ön sürüm olduğundan, tam sürümü sabitleyin — npm, şapka/tilde aralıklarıyla ön sürüm sürümlerini seçmez: ```bash showLineNumbers npm install @adapty/capacitor@4.0.0-beta.2 ``` Ardından yerel projeleri senkronize edin: ```bash showLineNumbers npx cap sync ``` ### iOS: Yalnızca Swift Package Manager [CocoaPods'ın spec repo'su Aralık 2026'da salt okunur hale geliyor](https://blog.cocoapods.org/CocoaPods-Specs-Repo/); bu nedenle v4 itibarıyla `AdaptyCapacitor.podspec` kaldırılmıştır ve SDK, iOS'ta **yalnızca Swift Package Manager (SPM)** üzerinden kurulmaktadır. Uygulamanızın iOS projesinin Capacitor'ın SPM entegrasyonunu kullanması gerekir: - Yeni uygulamalar için iOS platformunu SPM paket yöneticisiyle ekleyin: ```bash showLineNumbers npx cap add ios --packagemanager SPM ``` - Mevcut CocoaPods tabanlı uygulamalar: [Capacitor'ın mevcut bir projede SPM kullanma kılavuzu](https://capacitorjs.com/docs/ios/spm#using-spm-in-an-existing-capacitor-project)nu izleyerek iOS projesini taşıyın. Tam kurulum için [Adapty SDK'yı Yükle](sdk-installation-capacitor) sayfasına bakın. ## Flow'ları Getirme \{#fetching-flows\} ### getPaywall → getFlow Döndürülen tür `AdaptyPaywall`'dan `AdaptyFlow`'a değişiyor ve `locale` seçeneği kaldırılıyor — bir flow render ettiğinizde locale otomatik olarak çözümlenir; özel paywalllar için tüm locale'ler `flow.remoteConfigs` içinde döndürülür: ```diff showLineNumbers - const paywall = await adapty.getPaywall({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en' }); + const flow = await adapty.getFlow({ placementId: 'YOUR_PLACEMENT_ID' }); ``` `getPaywallForDefaultAudience` de aynı şekilde yeniden adlandırılıyor: ```diff showLineNumbers - const paywall = await adapty.getPaywallForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en' }); + const flow = await adapty.getFlowForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID' }); ``` ### getPaywallProducts(paywall) → getPaywallProducts(flow) `getPaywallProducts` adını korur ancak artık bir `AdaptyFlow` alır: ```diff showLineNumbers - const products = await adapty.getPaywallProducts({ paywall }); + const products = await adapty.getPaywallProducts({ flow }); ``` ## Veri modeli \{#data-model\} `getFlow`, `AdaptyPaywall` yerine bir `AdaptyFlow` döndürür ve nesne yapısı değişti: | v3 `AdaptyPaywall` alanı | v4 `AdaptyFlow` alanı | İşlem | |---|---|---| | `remoteConfig?` (tekil) | `remoteConfigs?: AdaptyRemoteConfig[]` (dizi) | Bir flow, yapılandırılmış her dil için bir remote config taşır. Kullanıcıyla eşleşeni okuyun: `flow.remoteConfigs?.find((c) => c.lang === 'en')`. | | `products` | `flow.paywalls[i].productIdentifiers` | Ürün tanımlayıcıları artık flow üzerinde değil, her flow varyasyonunda yer alır. | | `webPurchaseUrl?` | `flow.paywalls[i].webPurchaseUrl` | Flow'dan her paywall varyasyonuna taşındı. | | `version?: number` | `flowVersionId?: string` | Yeniden adlandırıldı ve tür `number`'dan `string`'e değişti. | | `hasViewConfiguration` | kaldırıldı | `hasViewConfiguration` kontrolünü kodunuzdan kaldırın — `createFlowView` artık bunun yerine hata fırlatır (bkz. [Flow'ları görüntüleme](#displaying-flows)). | | `requestLocale` | kaldırıldı | Locale artık modelin bir parçası değildir. | | _(yeni)_ | `paywalls: AdaptyFlowPaywall[]` | Her giriş, flow'daki bir paywall varyasyonudur. | | _(yeni)_ | `responseCreatedAt: number` | Sunucu yanıt zaman damgası, milisaniye cinsinden. | `hasViewConfiguration` ve `requestLocale`, `AdaptyOnboarding` üzerinde kalmaya devam eder — yalnızca flow modeli bunları kaldırır. Ürün tanımlayıcıları flow'dan her varyasyona taşındı: ```diff showLineNumbers - const ids = paywall.products; + const ids = flow.paywalls[0].productIdentifiers; ``` ## Web paywall yöntemleri \{#web-paywall-methods\} `openWebPaywall` ve `createWebPaywallUrl` adlarını korur, ancak `paywallOrProduct` seçeneği artık `AdaptyPaywall` yerine `AdaptyFlowPaywall` (bir flow varyasyonu) alır. Yine de `AdaptyPaywallProduct` geçirebilirsiniz. İlk girişi okumadan önce `flow.paywalls` öğesinin boş olmadığını kontrol edin: ```diff showLineNumbers const flow = await adapty.getFlow({ placementId: 'YOUR_PLACEMENT_ID' }); - await adapty.openWebPaywall({ paywallOrProduct: paywall }); + await adapty.openWebPaywall({ paywallOrProduct: flow.paywalls[0] }); ``` ## Flow görüntülemelerini takip etme \{#tracking-flow-views\} ### logShowPaywall → logShowFlow `logShowPaywall`, `logShowFlow` olarak yeniden adlandırıldı ve artık bir `AdaptyFlow` alıyor. Olay hâlâ aynı varyasyon üzerinden kaydedildiği için mevcut dönüşüm hunisi ve A/B testi metrikleri kontrol panelinde herhangi bir değişiklik yapılmadan çalışmaya devam eder. ```diff showLineNumbers - await adapty.logShowPaywall({ paywall }); + await adapty.logShowFlow({ flow }); ``` v3'te olduğu gibi, [Flow Builder](adapty-flow-builder) veya [Paywall Builder](adapty-paywall-builder) tarafından oluşturulan flow'ları ya da paywallları görüntülerken bu metodu çağırmanıza gerek yoktur; Adapty bu görüntülemeleri otomatik olarak takip eder. ## Flow'ları Görüntüleme \{#displaying-flows\} ### createPaywallView → createFlowView Factory fonksiyonunu yeniden adlandırın ve `AdaptyFlow`'u geçirin. Döndürülen controller, `PaywallViewController`'dan `FlowViewController`'a yeniden adlandırıldı; ancak metodları (`present`, `dismiss`, `setEventHandlers`, `showDialog`) değişmedi. Params tipi `CreatePaywallViewParamsInput`'tan `CreateFlowViewParamsInput`'a yeniden adlandırıldı: ```diff showLineNumbers - import { createPaywallView } from '@adapty/capacitor'; + import { createFlowView } from '@adapty/capacitor'; - const view = await createPaywallView(paywall); + const view = await createFlowView(flow); await view.present(); ``` `createFlowView`, flow için yapılandırılmış bir view yoksa `AdaptyError` fırlatır — bu, v3'teki `hasViewConfiguration` kontrolünün yerini alır: ```diff showLineNumbers - if (paywall.hasViewConfiguration) { - const view = await createPaywallView(paywall); - await view.present(); - } + try { + const view = await createFlowView(flow); + await view.present(); + } catch (error) { + // the flow has no view configured, or view creation failed + } ``` :::note Bir flow view tek kullanımlıktır: `dismiss()` çağırdıktan sonra view yok edilir ve olay işleyicileri temizlenir; flow'u tekrar göstermek için `createFlowView`'ı yeniden çağırmanız gerekir. ::: ### Android güvenli alan dolguları \{#android-safe-area-paddings\} `CreateFlowViewParamsInput`, çalışma zamanında Android güvenli alan dolgularını kontrol eden yeni bir `enableSafeArea` parametresi ekler. Bu parametre, `android` anahtarı altında yer alır ve varsayılan değeri `true`'dur: ```typescript showLineNumbers const view = await createFlowView(flow, { android: { enableSafeArea: true }, }); ``` ## Olayları yönetme \{#handling-events\} Olay işleyici arayüzü `EventHandlers` yerine `FlowEventHandlers` olarak yeniden adlandırıldı ve bir callback yeniden adlandırıldı. Mevcut işleyici gövdelerinde kod değişikliği gerekmez — sadece yeniden adlandırın: ```diff showLineNumbers - onRenderingFailed: (error) => { /* … */ }, + onError: (error) => { /* … */ }, ``` Diğer tüm event handler'lar isimlerini korur. İki tanesi ayrıca ikinci bir argüman kazanır: `onPurchaseCompleted` artık `(purchaseResult, product)` ve `onPurchaseFailed` artık `(error, product)` şeklindedir; burada `product`, işleme dahil olan `AdaptyPaywallProduct`'tır. Tam liste için [Flow ve paywall event'lerini yönetme](capacitor-handling-events) sayfasına bakın. v4 ayrıca isteğe bağlı olarak etkinleştirebileceğiniz birkaç yeni özellik ekler: - `adapty.openWebUrl({ url, openIn })` ve `adapty.requestAppReview()` metodları — bunlar varsayılan `onUrlPress` ve `onRequestAppReview` işleyicilerini destekler; bu sayede URL'ler ve uygulama değerlendirme istemleri kutudan çıkar çıkmaz yerel olarak yönetilir. Bu işleyicileri geçersiz kıldığınızda doğrudan çağırın. - Flow'lar içinde Observer modu satın alma yönetimi, yeni `onObserverPurchaseInitiated` / `onObserverRestoreInitiated` işleyicileri aracılığıyla yapılır. Bkz. [Flow'ları Observer modunda sunma](capacitor-present-flows-in-observer-mode). ## Varsayılan davranış değişiklikleri \{#default-behavior-changes\} Bu değişiklikler derleme hatası oluşturmaz, bu nedenle çalışma zamanında test edin: - **`onAndroidSystemBack`**: Varsayılan davranış, görünümü kapatmaktan açık tutmaya değişti. Önceki davranışı geri yüklemek için handler'dan `true` döndürün. - **`onPurchaseCompleted`**: Varsayılan davranış, satın alma iptal edilmediği sürece görünümü kapatmaktan her zaman açık tutmaya değişti. Önceki davranışı geri yüklemek için handler'dan `purchaseResult.type !== 'user_cancelled'` döndürün. - **`onRestoreCompleted`**: Varsayılan davranış, başarılı bir geri yüklemenin ardından görünümü kapatmaktan açık tutmaya değişti. Önceki davranışı geri yüklemek için handler'dan `true` döndürün. - **`onUrlPress`**: Varsayılan artık URL'yi yerel katman aracılığıyla açıyor; kontrol panelindeki uygulama içi veya harici tarayıcı ayarına göre davranıyor. URL'leri kendiniz açmak için handler'ı geçersiz kılın. - **Görünümler tek kullanımlıktır**: `dismiss()` çağrıldıktan sonra görünüm yok edilir. Flow'u tekrar göstermek için `createFlowView`'ı yeniden çağırın. ## Kaldırılan API'ler \{#removed-apis\} ### Kaldırılan exportlar \{#removed-exports\} Bu semboller artık `@adapty/capacitor`'dan export edilmiyor. İlgili importları kaldırın: - **`AdaptyPaywall`**: Bunun yerine `AdaptyFlow` ve `AdaptyFlowPaywall` kullanın. - **`ProductReference`**: Bunun yerine `AdaptyProductIdentifier` kullanın; `flow.paywalls[i].productIdentifiers` üzerinden okuyun. - **`AdaptyPaywallBuilder`**: Kaldırıldı. Flow'lar ve paywall'lar artık native olarak render edilir. - **`AdaptyAndroidSubscriptionUpdateParameters`**: İç içe geçmiş `android` satın alma parametre yapısını kullanın (aşağıya bakın). ### activate: lockMethodsUntilReady `lockMethodsUntilReady` (v3'te zaten kullanımdan kaldırılmış ve işlevsiz hale getirilmişti) kaldırıldı. `activate` çağrınızdan bu parametreyi kaldırın — aksi hâlde artık derlenmez: ```diff showLineNumbers - await adapty.activate({ apiKey: 'PUBLIC_SDK_KEY', params: { lockMethodsUntilReady: true } }); + await adapty.activate({ apiKey: 'PUBLIC_SDK_KEY' }); ``` ### makePurchase: Android parametreleri \{#makepurchase-android-parameters\} `MakePurchaseParamsInput`'ın kullanımdan kaldırılmış düz Android yapısı kaldırıldı — yalnızca iç içe geçmiş form geçerlidir. Android satın alma parametrelerini `params: { android: { ... } }` içine taşıyın. Tam örnek için [Satın alma yapma](capacitor-making-purchases) sayfasına bakın. ## Onboarding API kullanımdan kaldırılması \{#onboarding-api-deprecation\} Eski onboarding API'si v4.0'da [Flow Builder](adapty-flow-builder) lehine kullanımdan kaldırıldı. Hâlâ çalışmaya devam etmektedir, ancak gelecekteki bir sürümde kaldırılacaktır; bu nedenle onboarding'lerinizi Flow Builder'a taşımayı planlayın. Kullanımdan kaldırılan semboller: `getOnboarding`, `getOnboardingForDefaultAudience`, `createOnboardingView` ve `OnboardingViewController`. --- # File: migration-to-capacitor-316 --- --- title: "Adapty Capacitor SDK'sını v3.16'ya Geçir" description: "Daha iyi performans ve yeni monetizasyon özellikleri için Adapty Capacitor SDK v3.16'ya geçin." --- Adapty SDK v3.16.0'dan itibaren Capacitor 8 gereklidir. Capacitor 7'ye ihtiyaç duyuyorsanız Adapty SDK v3.15'i kullanın. Capacitor SDK v3.16'ya yükseltmek için projenizin Capacitor 8 kullandığından emin olun. Hâlâ Capacitor 7 kullanıyorsanız iki seçeneğiniz var: 1. **Capacitor 8'e Yükseltin**: Projenizi güncellemek için [resmi Capacitor taşıma kılavuzunu](https://capacitorjs.com/docs/updating/8-0) takip edin, ardından Adapty SDK v3.16'yı yükleyin. 2. **Adapty SDK v3.15'te Kalın**: Capacitor 8'e yükseltmek mümkün değilse, Capacitor 7'yi destekleyen Adapty SDK v3.15'i kullanmaya devam edin. --- # End of Documentation _Generated on: 2026-07-24T13:02:34.287Z_ _Successfully processed: 45/45 files_ # FLUTTER - Adapty Documentation (Full Content) This file contains the complete content of all documentation pages for this platform. Locale: tr Generated on: 2026-07-24T13:02:34.289Z Total files: 44 --- # File: sdk-installation-flutter --- --- title: "Flutter SDK'yı Yükleyin ve Yapılandırın" description: "Flutter için Adapty SDK'yı abonelik tabanlı uygulamalara adım adım yükleme rehberi." --- Adapty SDK, Flutter uygulamanıza sorunsuz entegrasyon için iki temel modül içerir: - **Core Adapty**: Bu temel SDK, Adapty'nin uygulamanızda düzgün çalışması için gereklidir. - **AdaptyUI**: [Adapty Paywall Builder](adapty-paywall-builder)'ı kullanıyorsanız bu modüle ihtiyaç duyarsınız. Paywall Builder, platformlar arası paywall'lar oluşturmayı kolaylaştıran, kod gerektirmeyen kullanıcı dostu bir araçtır. :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Paywall gösterme, satın alma yapma ve diğer temel işlevleri kapsayan tam kurulumu içeren [örnek uygulamamıza](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example) göz atın. ::: ## Gereksinimler \{#requirements\} Adapty SDK, iOS 13.0+ sürümünü destekler; ancak paywall builder ile oluşturulan paywallların düzgün çalışması için iOS 15.0+ gereklidir. [Flow Builder](adapty-flow-builder) desteği ekleyen Adapty Flutter SDK 4.0, minimum gereksinimleri **iOS 15.0+**, **Xcode 26+** ve **Flutter 3.32.0+** (Dart 3.8.0+) olarak yükseltmektedir. Kurulum ayrıntıları için aşağıdaki [Adapty SDK 4.0](#adapty-sdk-40-swift-package-manager) bölümüne bakın. :::info Adapty, Google Play Billing Library 8.x sürümüne kadar uyumludur. Varsayılan olarak Adapty, Google Play Billing Library v7.0.0 ile çalışır; ancak daha yeni bir sürümü zorlamak istiyorsanız [bağımlılığı manuel olarak ekleyebilirsiniz](https://developer.android.com/google/play/billing/integrate#dependency). ::: :::info SDK'yı yüklemek, Adapty kurulumunun 5. adımıdır. Uygulamanızda satın almalar çalışmadan önce uygulamanızı mağazalara bağlamanız, ardından Adapty Kontrol Paneli'nde ürünler, bir paywall ve bir placement oluşturmanız gerekir. [Hızlı başlangıç kılavuzu](quickstart) tüm gerekli adımları anlatmaktadır. ::: ## Adapty SDK'yı Yükleme \{#install-adapty-sdk\} [](https://github.com/adaptyteam/AdaptySDK-Flutter/releases) :::important Aşağıdaki adımlar en son kararlı SDK'yı (3.x) yükler. [Flow Builder](adapty-flow-builder) için gerekli olan ve [hızlı başlangıç](flutter-quickstart-paywalls) kılavuzunda kullanılan v4'e ihtiyacınız varsa, bunun yerine aşağıdaki [Adapty SDK 4.0: Swift Package Manager](#adapty-sdk-40-swift-package-manager) bölümünü izleyin. ::: 1. Adapty'yi `pubspec.yaml` dosyanıza ekleyin: ```yaml showLineNumbers title="pubspec.yaml" dependencies: adapty_flutter: ^
### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin, uygulamanıza giriş yaptıktan veya kaydolduktan sonra), customer user ID'yi ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty bunu otomatik olarak mevcut profille ilişkilendirir.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı kimlikleri her kullanıcı için benzersiz olmalıdır. Parametre değerini sabit kodlarsanız, tüm kullanıcılar tek bir kullanıcı olarak kabul edilir.
:::
Diğer SDK metodlarını çağırmadan önce her zaman `identify` işlemini `await` ile bekleyin. Eş zamanlı çağrılar `#3006 profileWasChanged` hatasına yol açar veya anonim profile düşer. Bkz. [Flutter SDK'da çağrı sırası](flutter-sdk-call-order).
```dart showLineNumbers
try {
await Adapty().identify(customerUserId); // Her kullanıcı için benzersiz
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
}
```
### SDK etkinleştirmesi sırasında \{#during-the-sdk-activation\}
SDK'yı etkinleştirdiğinizde zaten bir customer user ID biliyorsanız, `identify` metodunu ayrıca çağırmak yerine bunu `activate` metodunda gönderebilirsiniz.
Bir customer user ID bilseniz de bunu yalnızca etkinleştirmeden sonra ayarlarsanız, etkinleştirme sırasında Adapty yeni bir anonim profil oluşturacak ve yalnızca `identify` çağrısından sonra mevcut profile geçecektir.
Mevcut bir customer user ID (daha önce kullandığınız) veya yeni bir tane geçirebilirsiniz. Yeni bir tane geçirirseniz, etkinleştirme sırasında oluşturulan yeni profil otomatik olarak customer user ID ile ilişkilendirilir.
:::note
Varsayılan olarak, anonim profil oluşturmak analitik kontrol panellerini etkilemez çünkü kurulumlar cihaz kimliklerine göre sayılır.
Bir cihaz kimliği, bir cihazdaki mağazadan tek bir uygulama kurulumunu temsil eder ve yalnızca uygulama yeniden yüklendikten sonra yeniden oluşturulur.
Bu, bunun birinci mi yoksa tekrarlanan bir kurulum mu olduğuna, ya da mevcut bir customer user ID kullanılıp kullanılmadığına bağlı değildir.
Profil oluşturma (SDK etkinleştirmesinde veya oturum kapatmada), giriş yapma veya uygulamayı yeniden yüklemeden yükseltme ek kurulum olayları oluşturmaz.
Kurulumları benzersiz kullanıcılara göre saymak istiyorsanız, **App settings** sayfasına gidin ve [**Installs definition for analytics**](general#4-installs-definition-for-analytics) seçeneğini yapılandırın.
:::
```dart showLineNumbers"
try {
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
..withCustomerUserId(YOUR_CUSTOMER_USER_ID) // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
);
} catch (e) {
// handle the error
}
```
### Kullanıcıları oturumu kapatma \{#log-users-out\}
Kullanıcıların oturumunu kapatmak için bir düğmeniz varsa, `logout` metodunu kullanın.
:::important
Kullanıcıların oturumunu kapatmak, kullanıcı için yeni bir anonim profil oluşturur.
:::
```dart showLineNumbers
try {
await Adapty().logout();
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle unknown error
}
```
:::info
Kullanıcıları uygulamaya tekrar giriş yaptırmak için `identify` metodunu kullanın.
:::
### Giriş yapmadan satın alma yapılmasına izin verme \{#allow-purchases-without-login\}
Kullanıcılarınız uygulamanıza giriş yapmadan önce ve sonra satın alma yapabiliyorsa, giriş yaptıktan sonra erişimlerini korumalarını sağlamanız gerekir:
1. Oturum açmamış bir kullanıcı satın alma yaptığında, Adapty bunu anonim profil kimliğiyle ilişkilendirir.
2. Kullanıcı hesabına giriş yaptığında, Adapty tanımlanmış profiliyle çalışmaya geçer.
- Yeni bir customer user ID ise (örneğin, satın alma kayıt öncesinde yapılmışsa), Adapty customer user ID'yi mevcut profile atar; böylece tüm satın alma geçmişi korunur.
- Mevcut bir customer user ID ise (customer user ID zaten bir profille bağlantılıysa), profil geçişinden sonra gerçek access level'ı almanız gerekir. Tanımlamanın hemen ardından [`getProfile`](flutter-check-subscription-status) çağrısı yapabilir veya veriler otomatik olarak senkronize olsun diye [profil güncellemelerini dinleyebilirsiniz](flutter-check-subscription-status).
## Sonraki adımlar \{#next-steps\}
Tebrikler! Uygulamanızda uygulama içi ödeme mantığını başarıyla uyguladınız! Uygulama gelir elde etme sürecinizde başarılar dileriz!
Adapty'den daha fazla yararlanmak için şu konuları inceleyebilirsiniz:
- [**Test etme**](troubleshooting-test-purchases): Her şeyin beklendiği gibi çalıştığından emin olun
- [**Onboardinglar**](flutter-onboardings): Onboardinglarla kullanıcıları etkileyin ve elde tutmayı artırın
- [**Entegrasyonlar**](configuration): Pazarlama attribution ve analitik hizmetleriyle tek satır kodla entegre edin
- [**Özel profil özellikleri ayarlama**](flutter-setting-user-attributes): Kullanıcı profillerine özel özellikler ekleyin ve segmentler oluşturun; böylece A/B testleri başlatabilir veya farklı kullanıcılara farklı paywalllar gösterebilirsiniz
---
# File: adapty-sdk-integration-skill-flutter
---
---
title: "SDK entegrasyon becerisini kullanarak Adapty'yi Flutter uygulamanıza entegre edin"
description: "Adapty SDK'sını Flutter uygulamanıza baştan sona entegre etmek için AI kodlama aracınızla adapty-sdk-integration becerisini kullanın."
---
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
:::important
Bu beceri beta aşamasındadır. Takılıp kalır veya beklenmedik şekilde davranırsa, AI aracınıza her aşamayı doğru belgelerle adım adım anlatan [adım adım entegrasyon kılavuzunu](adapty-cursor-flutter) izleyin.
:::
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
---
# File: adapty-cursor-flutter
---
---
title: "Adapty'yi Flutter uygulamanıza yapay zeka yardımıyla entegre etme"
description: "Cursor, Context7, ChatGPT, Claude veya diğer yapay zeka araçlarını kullanarak Adapty'yi Flutter uygulamanıza adım adım entegre etme rehberi."
---
Bu rehber, bir yapay zeka kodlama aracıyla Adapty'yi Flutter uygulamanıza adım adım entegre etme sürecini anlatır — doğru Adapty dokümanlarını doğru sırada besleyerek ilerlersiniz.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Başlamadan önce: kontrol paneli kurulumu \{#before-you-start-dashboard-setup\}
Adapty, herhangi bir SDK kodu yazmadan önce biraz kontrol paneli yapılandırması gerektirir. Bunu etkileşimli bir LLM becerisini kullanarak ya da Kontrol Paneli üzerinden manuel olarak yapabilirsiniz.
### Beceri yaklaşımı (önerilir) \{#skill-approach-recommended\}
Adapty CLI becerisi, LLM'inizin uygulamanızı, ürünlerinizi, access level'larınızı, paywall'larınızı ve placement'larınızı doğrudan — her adım için Kontrol Paneli'ni açmadan — kurmasına olanak tanır. Yalnızca Kontrol Paneli'nde [mağazalarınızı bağlamanız](integrate-payments) gerekir.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Beceri eklendikten sonra, ajanınızda `/adapty-cli` komutunu çalıştırın. Mağazalarınızı bağlamak için Kontrol Paneli'ni ne zaman açacağınız dahil her adımda sizi yönlendirecektir.
### Kontrol Paneli Yaklaşımı \{#dashboard-approach\}
Her şeyi manuel olarak yapılandırmayı tercih ediyorsanız, herhangi bir kod yazmadan önce şunlara ihtiyacınız var. LLM'iniz kontrol paneli değerlerini sizin için arayamaz; bunları kendiniz sağlamanız gerekir.
1. **Uygulama mağazalarınızı bağlayın**: Adapty Kontrol Paneli'nde **App settings → General** bölümüne gidin. Flutter uygulamanız her iki platformu da hedefliyorsa hem App Store hem de Google Play'i bağlayın. Bu, satın almaların çalışması için zorunludur.
[Uygulama mağazalarını bağlayın](integrate-payments)
2. **Public SDK anahtarınızı kopyalayın**: Adapty Kontrol Paneli'nde **App settings → General** sayfasına gidin ve **API keys** bölümünü bulun. Kodda bu, Adapty yapılandırmasına geçtiğiniz dizedir.
3. **En az bir ürün oluşturun**: Adapty Kontrol Paneli'nde **Products** sayfasına gidin. Ürünlere kodda doğrudan başvurmazsınız — Adapty onları paywall'lar aracılığıyla iletir.
[Ürün ekleyin](quickstart-products)
4. **Paywall ve placement oluşturun**: Adapty Kontrol Paneli'nde **Paywalls** sayfasında bir paywall oluşturun, ardından **Placements** sayfasında bunu bir placement'a atayın. Kodda, placement ID, `Adapty().getPaywall()` fonksiyonuna geçirdiğiniz string değerdir.
[Paywall oluştur](quickstart-paywalls)
5. **Access level'ları ayarlayın**: Adapty Kontrol Paneli'nde, **Products** sayfasında her ürün için yapılandırın. Kodda, `profile.accessLevels['premium']?.isActive` içinde kontrol edilen string'dir. Varsayılan `premium` access level çoğu uygulama için yeterlidir. Ödeme yapan kullanıcılar ürüne bağlı olarak farklı özelliklere erişiyorsa (örneğin `basic` plan ile `pro` plan), kodlamaya başlamadan önce [ek access level'lar oluşturun](assigning-access-level-to-a-product).
:::tip
Beş bilgiye de sahip olduğunuzda kod yazmaya hazırsınız. LLM'inize şunu söyleyin: "Public SDK anahtarım X, placement ID'im Y" — böylece doğru başlatma ve paywall çekme kodunu üretebilir.
:::
### Hazır olduğunuzda ayarlayın \{#set-up-when-ready\}
Kodlamaya başlamak için bunlar zorunlu değildir, ancak entegrasyonunuz olgunlaştıkça ihtiyaç duyacaksınız:
- **A/B testleri**: **Placements** sayfasından yapılandırın. Kod değişikliğine gerek yoktur.
[A/B testleri](ab-tests)
- **Ek paywall'lar ve placement'lar**: Farklı placement ID'leriyle daha fazla `getPaywall` çağrısı ekleyin.
- **Analitik entegrasyonları**: **Integrations** sayfasından yapılandırın. Kurulum, entegrasyona göre değişir. Bkz. [analitik entegrasyonları](analytics-integration) ve [attribution entegrasyonları](attribution-integration).
## LLM'nize Adapty Dokümanlarını Besleyin \{#feed-adapty-docs-to-your-llm\}
### Context7'yi Kullanın (önerilir)
[Context7](https://context7.com), LLM'inize güncel Adapty belgelerine doğrudan erişim sağlayan bir MCP sunucusudur. LLM'iniz, ne sorduğunuza göre doğru belgeleri otomatik olarak getirir — manuel URL yapıştırmaya gerek yok.
Context7; **Cursor**, **Claude Code**, **Windsurf** ve diğer MCP uyumlu araçlarla çalışır. Kurulum için şunu çalıştırın:
```
npx ctx7 setup
```
Bu komut, editörünüzü algılayarak Context7 sunucusunu yapılandırır. Manuel kurulum için [Context7 GitHub deposuna](https://github.com/upstash/context7) bakın.
Yapılandırdıktan sonra, Adapty kütüphanesini prompt'larınızda referans alın:
```
Use the adaptyteam/adapty-docs library to look up how to install the Flutter SDK
```
:::warning
Context7, belge bağlantılarını manuel olarak yapıştırma ihtiyacını ortadan kaldırsa da uygulama sırası önemlidir. Her şeyin düzgün çalıştığından emin olmak için aşağıdaki [uygulama adımlarını](#implementation-walkthrough) sırayla takip edin.
:::
### Düz metin dokümanlara erişin \{#use-plain-text-docs\}
Her Adapty dokümanına düz metin Markdown olarak erişebilirsiniz. URL'nin sonuna `.md` ekleyin ya da makale başlığının altındaki **Copy for LLM** düğmesine tıklayın. Örneğin: [adapty-cursor-flutter.md](https://adapty.io/docs/tr/adapty-cursor-flutter.md).
Aşağıdaki [uygulama adım adım rehberi](#implementation-walkthrough)'nin her aşaması, yapıştırabileceğiniz `.md` bağlantılarıyla birlikte "Bunu LLM'nize gönderin" bloğu içerir.
Aynı anda daha fazla doküman için aşağıdaki [dizin dosyalarına ve platforma özgü alt kümelere](#plain-text-doc-index-files) bakın.
## Uygulama adım adım rehberi \{#implementation-walkthrough\}
Bu rehberin geri kalanı, Adapty entegrasyonunu uygulama sırasına göre ele alır. Her aşamada LLM'inize göndereceğiniz belgeler, tamamlandığında ne görmeniz gerektiği ve sık karşılaşılan sorunlar açıklanmaktadır.
### Entegrasyonunuzu Planlayın \{#plan-your-integration\}
Koda geçmeden önce, LLM'inize projenizi analiz etmesini ve bir uygulama planı oluşturmasını söyleyin. AI aracınız bir planlama modunu destekliyorsa (Cursor'ın veya Claude Code'un plan modu gibi), bunu kullanın; böylece LLM herhangi bir kod yazmadan önce hem proje yapınızı hem de Adapty dokümanlarını okuyabilir.
LLM'inize satın almalar için hangi yaklaşımı kullandığınızı söyleyin — bu, takip etmesi gereken kılavuzları etkiler:
- [**Adapty Paywall Builder**](adapty-paywall-builder): Adapty'nin no-code editöründe paywall'lar oluşturursunuz; SDK bunları otomatik olarak render eder.
- [**Manuel oluşturulan paywall'lar**](flutter-making-purchases): Kendi paywall arayüzünüzü kod ile oluşturursunuz, ancak ürünleri çekmek ve satın almaları yönetmek için yine Adapty'yi kullanırsınız.
- [**Observer mode**](observer-vs-full-mode): Mevcut satın alma altyapınızı korursunuz ve Adapty'yi yalnızca analitik ve entegrasyonlar için kullanırsınız.
Hangisini seçeceğinizden emin değil misiniz? [Quickstart'taki karşılaştırma tablosuna](flutter-quickstart-paywalls) göz atın.
### SDK'yı Yükleyin ve Yapılandırın \{#install-and-configure-the-sdk\}
`flutter pub add` komutunu kullanarak Adapty SDK bağımlılığını ekleyin ve Public SDK anahtarınızla etkinleştirin. Bu, temel adımdır — geri kalan her şey buna bağlıdır.
**Kılavuz:** [Adapty SDK'yı Yükleyin ve Yapılandırın](sdk-installation-flutter)
Bunu LLM'inize gönderin:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/tr/sdk-installation-flutter.md
```
:::tip[Kontrol Noktası]
- **Beklenen:** Uygulama hem iOS hem Android'de derlenir ve çalışır. Hata ayıklama konsolu Adapty aktivasyon logunu gösterir.
- **Dikkat:** "Public API key is missing" → yer tutucuyu **App settings** bölümündeki gerçek anahtarınızla değiştirdiğinizi kontrol edin.
:::
### Paywall'ları göster ve satın almaları yönet \{#show-paywalls-and-handle-purchases\}
Placement ID'ye göre bir paywall getir, görüntüle ve satın alma olaylarını yönet. İhtiyacınız olan kılavuzlar, satın almaları nasıl yönettiğinize bağlıdır.
Her satın almayı ilerledikçe sandbox'ta test et — sona kadar bekleme. Kurulum talimatları için [Sandbox'ta satın almaları test et](test-purchases-in-sandbox) bölümüne bakın.
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirebilirsiniz. Bu senaryoda kullanıcılar en son veriye ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum süresince ağ isteklerini azaltmak için güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizleme yapıldığında sıfırlandığını unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı getirmek için CDN, CDN'e erişilemediği durumlarda ise bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda dahi güvenilirliği korurken her zaman paywalllarınızın en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu metodun zaman aşımını sınırlayan bir `Duration` değeri. Zaman aşımına ulaşıldığında önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşuyor olabilir.
| ## Yanıt parametreleri \{#response-parameters\} | Parametre | Açıklama | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | Flow'un tanımlayıcılarını (`instanceIdentity`, `variationId`), adını, placement'ını, paywall varyasyonlarını (`paywalls`) ve remote config'leri (`remoteConfigs`) içeren bir `AdaptyFlow` nesnesi. | ## View konfigürasyonunu getirme \{#fetch-the-view-configuration\} :::important Builder'da **Show on device** geçiş düğmesini etkinleştirdiğinizden emin olun. Bu seçenek açık değilse, view konfigürasyonu getirilemez. ::: Eğer placement **Flow Builder** veya **Paywall Builder** ile tasarlandıysa, Adapty kullanıcı arayüzünü sizin için oluşturur — alınan flow'un `hasViewConfiguration` özelliği `true` olur. `createFlowView` ile görünümü oluşturun, ardından [flow veya paywall'ı gösterin](flutter-present-paywalls). Eğer placement, Builder arayüzü olmayan özel bir paywall ise (`hasViewConfiguration` değeri `false`), bunun yerine [remote config paywall olarak ele alın](present-remote-config-paywalls-flutter). :::warning `createFlowView` metodunun sonucu yalnızca bir kez sunulabilir. Tekrar sunmanız gerekiyorsa `createFlowView` metodunu yeniden çağırın. ::: ```dart showLineNumbers try { final view = await AdaptyUI().createFlowView(flow: flow); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | zorunlu | İstenen flow/paywall için bir görünüm elde etmek üzere kullanılan `AdaptyFlow` nesnesi. | | **customTags** | opsiyonel | Özel etiketlerin ve çözümlenmiş değerlerinin bir haritasını tanımlar. Özel etiketler içerikte yer tutucu işlevi görerek flow/paywall içindeki kişiselleştirilmiş içerik için belirli dizelerle dinamik olarak değiştirilir. Daha fazla ayrıntı için [Paywall Builder'da özel etiketler](custom-tags-in-paywall-builder) konusuna bakın. | | **preloadProducts** | opsiyonel | Ekranda ürünlerin gösterilme zamanlamasını optimize etmek için etkinleştirin. `true` olduğunda AdaptyUI gerekli ürünleri otomatik olarak getirir. Varsayılan: `false`. | | **loadTimeout** | opsiyonel | Görünüm yapılandırmasının yüklenme süresini sınırlayan bir `Duration`. Zaman aşımına ulaşıldığında önbelleğe alınmış veriler veya yerel yedek kullanılır. | :::note Birden fazla dil kullanıyorsanız, [flow yerelleştirmesi eklemeyi](add-paywall-locale-in-adapty-paywall-builder) ve yerel ayar kodlarını doğru kullanmayı [buradan](flutter-localizations-and-locale-codes) öğrenin. ::: Görünümü elde ettikten sonra, [flow/paywall'ı gösterin](flutter-present-paywalls). ## Varsayılan kitle için bir flow veya paywall alın, daha hızlı getirmek için \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle flow'lar ve paywall'lar neredeyse anında getirilir, bu yüzden bu süreci hızlandırmak için endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve placement'a sahip olduğunuz ve kullanıcılarınızın zayıf bir internet bağlantısı bulunduğu durumlarda, bir flow veya paywall getirmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiçbir şey göstermek yerine sorunsuz bir kullanıcı deneyimi sağlamak amacıyla varsayılan bir flow veya paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın **Tüm Kullanıcılar** kitlesi için flow veya paywall'ı getiren `getFlowForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Flow/paywall getirme](#fetch-flowpaywall) bölümünde ayrıntılı olarak açıklandığı üzere, `getFlow` metoduyla flow veya paywall getirmek olduğunu anlamak kritik önem taşır. :::warning Neden `getFlow` kullanmanızı öneriyoruz `getFlowForDefaultAudience` metodunun birkaç önemli dezavantajı vardır: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywall'lar göstermeniz gerekiyorsa, bazı zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywall'lar tasarlamanız gerekecek ya da mevcut (eski) sürümdeki kullanıcıların render edilemeyen paywall'larla karşılaşabileceğini kabul etmek durumunda kalacaksınız. - **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görecektir; bu da kişiselleştirilmiş hedeflemeyi (ülkelere, pazarlama attribution'ına veya kendi özel özelliklerinize göre) kaybetmeniz anlamına gelir. Bu dezavantajları kabul etmeye hazırsanız ve daha hızlı flow veya paywall yüklemenin avantajlarından yararlanmak istiyorsanız, `getFlowForDefaultAudience` yöntemini aşağıdaki gibi kullanın. Aksi takdirde [yukarıda](#fetch-flowpaywall) açıklanan `getFlow` yöntemini kullanmaya devam edin. ::: ```dart showLineNumbers try { final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); // the requested flow/paywall } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | [Placement](placements) tanımlayıcısı. Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Bu seçeneği öneriyoruz çünkü kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağlar.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar her zaman en son verilere ulaşamayabilir; ancak internet bağlantısı ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini azaltmak amacıyla oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
| ## Öğeleri özelleştir \{#customize-assets\} Flow/paywall'ınızdaki görsel ve videoları özelleştirmek için özel öğeleri uygulayın. Hero görseller ve videolar önceden tanımlanmış ID'lere sahiptir: `hero_image` ve `hero_video`. Özel bir öğe paketinde, bu öğeleri ID'leri üzerinden hedefleyerek davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterme. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterme. - Video başlamadan önce bir önizleme görseli gösterme. Here's an example of how you can provide custom assets via a simple dictionary: ```dart final customAssets = { // Show a local image using a custom ID 'custom_image': AdaptyCustomAsset.localImageAsset( assetId: 'assets/images/image_name.png', ), // Show a local video with a preview image 'hero_video': AdaptyCustomAsset.localVideoAsset( assetId: 'assets/videos/custom_video.mp4', ), }; try { final view = await AdaptyUI().createFlowView( flow: flow, customAssets: customAssets, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` :::note Bir varlık bulunamazsa, flow/paywall varsayılan görünümüne geri döner. ::: ## Geliştirici tanımlı zamanlayıcıları ayarlama \{#set-up-developer-defined-timers\} Mobil uygulamanızda özel zamanlayıcılar kullanmak için `createFlowView` metoduna bir `customTimers` map'i geçirin. Her map anahtarı bir zamanlayıcı ID'si, değeri ise zamanlayıcının ne zaman sona ereceğini tanımlayan bir `DateTime` nesnesidir. İşte bir örnek: ```dart showLineNumbers try { final view = await AdaptyUI().createFlowView( flow: flow, customTimers: { 'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)), 'CUSTOM_TIMER_NY': DateTime(2027, 1, 1), // New Year 2027 }, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Bu örnekte, `CUSTOM_TIMER_NY` ve `CUSTOM_TIMER_6H`, Adapty Kontrol Paneli'nde ayarladığınız geliştirici tanımlı zamanlayıcıların **Timer ID**'leridir. `customTimers` haritası, uygulamanızın her zamanlayıcıyı doğru değerle dinamik olarak güncellemesini sağlar. Örneğin: - `CUSTOM_TIMER_NY`: Zamanlayıcının bitiş zamanına (örneğin Yılbaşı Günü) kalan süre. - `CUSTOM_TIMER_6H`: Kullanıcının flow'u açtığı andan itibaren başlayan 6 saatlik sürede kalan zaman.isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametrenin eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil için, ikincisi ise bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](flutter-localizations-and-locale-codes) bölümüne bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığı için bu seçeneği öneriyoruz.
Ancak, kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, varsa önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda, kullanıcılar en son veriyi alamayabilir; ancak internet bağlantıları ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek için oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Paywall'ları daha hızlı getirmek için CDN kullanıyoruz ve CDN'e ulaşılamadığında bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının kısıtlı olduğu durumlarda bile güvenilirliği sağlarken paywall'larınızın her zaman en son sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, bu metot için zaman aşımını sınırlar. Zaman aşımına ulaşılırsa, önbellekteki veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
Android için: `TimeInterval`'ı uzantı fonksiyonlarıyla oluşturabilirsiniz (örneğin `5.seconds`, burada `.seconds`, `import com.adapty.utils.seconds`'dan gelir) veya `TimeInterval.seconds(5)` kullanabilirsiniz. Sınır koymamak için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün kimliklerinin listesini, paywall tanımlayıcısını, remote config'i ve birçok diğer özelliği içeren bir [`AdaptyPaywall`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywall-class.html) nesnesi. | ## Paywall Builder ile tasarlanan paywall'ın görünüm konfigürasyonunu getirme \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse, görünüm konfigürasyonu alınamaz. ::: Paywall'ı aldıktan sonra, Paywall Builder kullanılarak oluşturulduğunu gösteren bir `ViewConfiguration` içerip içermediğini kontrol edin. Bu, paywall'ın nasıl gösterileceği konusunda size rehberlik edecektir. `ViewConfiguration` mevcutsa, bunu bir Paywall Builder paywall'ı olarak değerlendirin; değilse, [remote config paywall olarak ele alın](present-remote-config-paywalls-flutter). ```dart showLineNumbers try { final view = await AdaptyUI().createPaywallView( paywall: paywall, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Görünümü aldıktan sonra [paywall'ı sunun](flutter-present-paywalls). ## Daha hızlı getirmek için varsayılan kitle paywall'ını alma \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle paywall'lar neredeyse anında getirilir, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve paywall'ınız varsa ve kullanıcılarınızın zayıf bir internet bağlantısı varsa, bir paywall'ı getirmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç paywall göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir paywall göstermek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın **All Users** kitlesi için paywall'ı getiren `getPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak, önerilen yaklaşımın yukarıdaki [Paywall Bilgisini Getirme](flutter-get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) bölümünde ayrıntılı olarak açıklandığı gibi `getPaywall` metoduyla paywall'ı getirmek olduğunu anlamak çok önemlidir. :::warning `getPaywall` kullanmanızı neden öneriyoruz `getPaywallForDefaultAudience` metodunun birkaç önemli dezavantajı vardır: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywall'lar göstermeniz gerekiyorsa, zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywall'lar tasarlamanız gerekecek ya da mevcut (eski) sürüme sahip kullanıcıların render edilmeyen paywall'larla sorun yaşayabileceğini kabul etmeniz gerekecektir. - **Hedeflemenin kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görecek; bu, kişiselleştirilmiş hedeflemeyi (ülkelere, marketing attribution veya kendi özel niteliklerinize dayalı hedefleme dahil) kaybetmeniz anlamına gelir. Daha hızlı paywall getirme avantajından yararlanmak için bu dezavantajları kabul etmeye hazırsanız, aşağıdaki şekilde `getPaywallForDefaultAudience` metodunu kullanın. Aksi takdirde [yukarıda](#fetch-paywall-designed-with-paywall-builder) açıklanan `getPaywall`'a bağlı kalın. ::: ```dart showLineNumbers try { final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` :::note `getPaywallForDefaultAudience` metodu Flutter SDK 3.2.0 sürümünden itibaren kullanılabilir. ::: | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametrenin eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil için, ikincisi ise bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) bölümüne bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığı için bu seçeneği öneriyoruz.
Ancak, kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, varsa önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda, kullanıcılar en son veriyi alamayabilir; ancak internet bağlantıları ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek için oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
| ## Varlıkları özelleştirme \{#customize-assets\} Paywall'ınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görseller ve videolar önceden tanımlanmış kimliklere sahiptir: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri kimliklerine göre hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir kimlik ayarlamanız](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterin. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterin. - Bir video çalıştırmadan önce önizleme görseli gösterin. :::important Bu özelliği kullanmak için Adapty Flutter SDK'yı 3.8.0 veya daha yüksek bir sürüme güncelleyin. ::: İşte basit bir sözlük aracılığıyla özel varlıkları nasıl sağlayabileceğinize dair bir örnek: ```dart final customAssets = { // Show a local image using a custom ID 'custom_image': AdaptyCustomAsset.localImageAsset( assetId: 'assets/images/image_name.png', ), // Show a local video with a preview image 'hero_video': AdaptyCustomAsset.localVideoAsset( assetId: 'assets/videos/custom_video.mp4', ), }; try { final view = await AdaptyUI().createPaywallView( paywall: paywall, customAssets: customAssets, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` :::note Bir varlık bulunamazsa, paywall varsayılan görünümüne geri döner. ::: ## Geliştirici tanımlı zamanlayıcıları ayarlama \{#set-up-developer-defined-timers\} Mobil uygulamanızda özel zamanlayıcılar kullanmak için `createPaywallView` metoduna bir `customTimers` haritası geçirin. Haritadaki her anahtar bir zamanlayıcı ID'sidir ve değeri zamanlayıcının ne zaman sona ereceğini tanımlayan bir `DateTime` nesnesidir. İşte bir örnek: ```dart showLineNumbers try { final view = await AdaptyUI().createPaywallView( paywall: paywall, customTimers: { 'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)), 'CUSTOM_TIMER_NY': DateTime(2025, 1, 1), // New Year 2025 }, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Bu örnekte, `CUSTOM_TIMER_NY` ve `CUSTOM_TIMER_6H`, Adapty Kontrol Paneli'nde ayarladığınız geliştirici tanımlı zamanlayıcıların **Timer ID**'leridir. `customTimers` haritası, uygulamanızın her zamanlayıcıyı doğru değerle dinamik olarak güncellemesini sağlar. Örneğin: - `CUSTOM_TIMER_NY`: Yeni Yıl Günü gibi zamanlayıcının bitiş anına kadar kalan süre. - `CUSTOM_TIMER_6H`: Kullanıcının paywall'ı açtığı andan itibaren başlayan 6 saatlik sürede kalan zaman.
## Paywall görüntülenme sayısı çok yüksek \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntülenme sayısı beklenenin iki katını gösteriyor.
**Neden**: Kodunuzda `logShowFlow` (Flutter SDK v4+) / `logShowPaywall` çağırıyor olabilirsiniz; Paywall Builder veya Flow Builder kullanıyorsanız bu, görüntülenme sayısını iki katına çıkarır. Bu araçlarla oluşturulan flow'lar ve paywall'lar için analitikler otomatik olarak takip edilir; bu nedenle söz konusu metodu kullanmanıza gerek yoktur.
**Çözüm**: Paywall Builder veya Flow Builder kullanıyorsanız kodunuzda `logShowFlow` (Flutter SDK v4+) / `logShowPaywall` çağırmadığınızdan emin olun.
## Diğer sorunlar \{#other-issues\}
**Sorun**: Yukarıda ele alınmayan başka Paywall Builder kaynaklı sorunlar yaşıyorsunuz.
**Çözüm**: Gerekirse [migration rehberlerini](flutter-sdk-migration-guides) kullanarak SDK'yı en son sürüme güncelleyin. Pek çok sorun yeni SDK sürümlerinde giderilmiştir.
---
# File: flutter-present-flows-in-observer-mode
---
---
title: "Flutter SDK'da Observer modunda flow'ları sunma"
description: "Flutter uygulamanızda Observer modunda flow'ları ve Paywall Builder paywall'larını sunun; satın almaları kendi kodunuzla yönetin."
---
Builder'ı kullanarak bir flow veya paywall özelleştirdiyseniz, bunu kullanıcıya göstermek için mobil uygulama kodunuzda render etme konusunda endişelenmenize gerek yoktur. Böyle bir flow veya paywall, hem ne gösterileceğini hem de nasıl gösterileceğini içerir.
:::warning
Bu bölüm yalnızca [Observer mode](observer-vs-full-mode) için geçerlidir. Observer mode'da çalışmıyorsanız, [Flow'ları ve paywall'ları görüntüleme](flutter-present-paywalls) konusuna bakın.
:::
:::info
Bu özellik Adapty Flutter SDK 4.0 veya sonrasını gerektirir — daha önce yalnızca native iOS ve Android SDK'larında mevcuttu. Yükseltmek için [migration kılavuzuna](migration-to-flutter-sdk-v4) bakın.
:::
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en güncel verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum sırasında ağ isteklerini önlemek amacıyla güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywall'ları iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve [yedek paywall'lar](flutter-use-fallback-paywalls). Paywall'ları daha hızlı yüklemek için CDN, CDN'e ulaşılamadığı durumlar için ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman paywall'larınızın en güncel sürümünü almanızı garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşıldığında önbellekteki veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilen süreden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşuyor olabilir.
| :::note v4'te `getFlow`, `locale` parametresi almaz. Özel paywalllar için tüm mevcut yerelleştirmeler flow'un remote config'lerinde (`flow.remoteConfigs`) döner — kullanıcının cihaz veya uygulama ayarıyla eşleşeni seçin. Bkz. [Yerelleştirmeler ve locale kodları](flutter-localizations-and-locale-codes). ::: Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Flow'un tanımlayıcılarını (`instanceIdentity`, `variationId`), adını, placement'ını, paywall varyasyonlarını (`paywalls`) ve remote config'leri (`remoteConfigs`) içeren bir `AdaptyFlow` nesnesi. | ## Ürünleri getir \{#fetch-products\} Flow'u aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```dart showLineNumbers try { final products = await Adapty().getPaywallProducts(flow: flow); // the requested products array } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Ürün tanımlayıcısını, ürün adını, fiyatı, para birimini, abonelik süresini ve diğer çeşitli özellikleri içeren [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) nesnesindeki bu özelliklere ihtiyaç duyacaksınız. Aşağıda en sık kullanılan özellikler gösterilmektedir; tüm mevcut özellikler için bağlantılı belgeye başvurun. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Başlık** | Ürünün başlığını görüntülemek için `product.localizedTitle` kullanın. Yerelleştirmenin, cihazın yerel ayarına değil, kullanıcının seçtiği mağaza ülkesine göre yapıldığını unutmayın. | | **Fiyat** | Fiyatın yerelleştirilmiş halini görüntülemek için `product.price.localizedString` kullanın. Bu yerelleştirme, cihazın yerel ayar bilgisine göre yapılır. Fiyata sayısal olarak erişmek için `product.price.amount` kullanabilirsiniz. Değer yerel para biriminde sağlanır. İlgili para birimi sembolünü almak için `product.price.currencySymbol` kullanın. | | **Abonelik Dönemi** | Dönemi (örn. hafta, ay, yıl vb.) görüntülemek için `product.subscription?.localizedPeriod` kullanın. Bu yerelleştirme, cihazın yerel ayarına göre yapılır. Abonelik dönemine programatik olarak erişmek için `product.subscription?.period` kullanın. Buradan `unit` enum'una erişerek uzunluğu (gün, hafta, ay, yıl veya bilinmeyen) alabilirsiniz. `numberOfUnits` değeri ise dönem birimi sayısını verir. Örneğin, üç aylık bir abonelik için unit özelliğinde `AdaptyPeriodUnit.month`, numberOfUnits özelliğinde ise `3` görürsünüz. | | **Başlangıç Teklifi** | Aboneliğin başlangıç teklifi içerdiğini gösteren bir rozet veya başka bir gösterge eklemek için `product.subscription?.offer?.phases` özelliğine bakın. Bu liste, ücretsiz deneme aşaması ve başlangıç fiyatı aşaması olmak üzere iki adede kadar indirim aşaması içerebilir. Her aşama nesnesi şu yararlı özellikleri içerir:SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en son verilere ulaşamayabilir; ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum boyunca gereksiz ağ isteklerini önlemek amacıyla güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında temizlendiğini unutmayın.
|isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesi anlamına gelir.
Yerel ayar kodları ve önerilen kullanım şekli hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](flutter-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak verileri sunucudan yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Bu yaklaşımı öneriyoruz çünkü kullanıcılarınızın her zaman en güncel verilere erişmesini sağlar.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanmayı değerlendirin. Bu durumda kullanıcılar en güncel verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerini azaltmak amacıyla oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırıldığında veya manuel olarak temizlendiğinde silindiğini unutmayın.
Adapty SDK, paywallları iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve [yedek paywalllar](flutter-use-fallback-paywalls). Ayrıca paywallları daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman en güncel paywall sürümünü almanızı garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbellekteki veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun, `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini koda gömmeyIn! Paywalllar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz denemeler gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız bu 2 ürünü göstermelidir. Ancak daha sonra 3 ürün alırsanız, kod değişikliği gerektirmeden uygulamanız 3 ürünü de göstermelidir. Koda gömmeniz gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'lerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywall-class.html) nesnesi. | ## Ürünleri çekme \{#fetch-products\} Paywallı aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```dart showLineNumbers try { final products = await Adapty().getPaywallProducts(paywall: paywall); // the requested products array } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer çeşitli özelliklerle birlikte [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken, [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) nesnesindeki bu özelliklere ihtiyaç duyacaksınız. Aşağıda en sık kullanılan özellikler gösterilmektedir; mevcut tüm özellikler hakkında ayrıntılı bilgi için bağlantılı belgeye bakın. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Başlık** | Ürünün başlığını göstermek için `product.localizedTitle` kullanın. Yerelleştirme, cihazın dilini değil, kullanıcının seçtiği mağaza ülkesini baz alır. | | **Fiyat** | Fiyatın yerelleştirilmiş halini göstermek için `product.price.localizedString` kullanın. Bu yerelleştirme cihazın dil ayarlarına göre yapılır. Fiyata sayısal olarak erişmek için `product.price.amount` kullanabilirsiniz. Değer yerel para birimi cinsinden döner. İlgili para birimi sembolünü almak için `product.price.currencySymbol` kullanın. | | **Abonelik Periyodu** | Periyodu (ör. hafta, ay, yıl vb.) göstermek için `product.subscription?.localizedPeriod` kullanın. Bu yerelleştirme cihazın diline göre yapılır. Abonelik periyodunu programatik olarak almak için `product.subscription?.period` kullanın. Buradan `unit` enum'una erişerek uzunluğu (yani gün, hafta, ay, yıl veya bilinmiyor) öğrenebilirsiniz. `numberOfUnits` değeri ise dönem birimi sayısını verir. Örneğin üç aylık bir abonelik için `unit` özelliğinde `AdaptyPeriodUnit.month`, `numberOfUnits` özelliğinde ise `3` görürsünüz. | | **Başlangıç Teklifi** | Bir aboneliğin başlangıç teklifi içerip içermediğini göstermek amacıyla rozet veya başka bir gösterge eklemek için `product.subscription?.offer?.phases` özelliğine bakın. Bu liste, ücretsiz deneme aşaması ve başlangıç fiyatı aşaması olmak üzere en fazla iki indirim aşaması içerebilir. Her aşama nesnesinde şu kullanışlı özellikler bulunur:isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesi anlamına gelir.
Yerel ayar kodları ve önerilen kullanım şekli hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](flutter-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak verileri sunucudan yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Bu yaklaşımı öneriyoruz çünkü kullanıcılarınızın her zaman en güncel verilere erişmesini sağlar.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanmayı değerlendirin. Bu durumda kullanıcılar en güncel verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerini azaltmak amacıyla oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırıldığında veya manuel olarak temizlendiğinde silindiğini unutmayın.
|İstek başarılı olursa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html) nesnesi, kullanıcının uygulama içindeki access level'ları, abonelikleri ve tek seferlik satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Apple'ın StoreKit sürümü v2.0'ın altında ve Adapty SDK sürümü v2.9.0'ın altında kullanıyorsanız, bunun yerine [Apple App Store paylaşılan sırrı](app-store-connection-configuration#step-5-enter-app-store-shared-secret) sağlamanız gerekir. Bu yöntem şu anda Apple tarafından kullanımdan kaldırılmıştır. ::: ## Satın alma sırasında aboneliği değiştirme \{#change-subscription-when-making-a-purchase\} Bir kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu işlemin nasıl gerçekleşeceği uygulama mağazasına göre değişir: - App Store'da abonelik, abonelik grubu içinde otomatik olarak güncellenir. Kullanıcı bir gruptan abonelik satın alırken başka bir gruptan aktif aboneliği varsa, her iki abonelik de aynı anda aktif olur. - Google Play'de abonelik otomatik olarak güncellenmez. Geçişi aşağıda açıklandığı şekilde mobil uygulama kodunuzda yönetmeniz gerekir. Android'de aboneliği başka bir abonelikle değiştirmek için `.makePurchase()` metodunu ek parametre ile çağırın: ```dart showLineNumbers try { final subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters( 'OLD_PRODUCT_ID', AdaptyAndroidSubscriptionUpdateReplacementMode.immediateWithTimeProration, ); final result = await Adapty().makePurchase( product: product, parameters: AdaptyPurchaseParameters( subscriptionUpdateParams: subscriptionUpdateParams, ), ); // başarılı çapraz yükseltme } on AdaptyError catch (adaptyError) { // Hatayı işle } catch (e) { // Hatayı işle } ``` Ek istek parametresi: | Parametre | Zorunluluk | Açıklama | | :--------------------------- | :------- |:--------------------------------------------------------------------------------------------------------| | **parameters** | zorunlu | `subscriptionUpdateParams` alanı bir [`AdaptyAndroidSubscriptionUpdateParameters`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyAndroidSubscriptionUpdateParameters-class.html) nesnesine ayarlanmış `AdaptyPurchaseParameters` nesnesi. | Google Developer belgelerinde abonelikler ve değiştirme modları hakkında daha fazla bilgi edinebilirsiniz: - [Değiştirme modları hakkında](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Google'ın değiştirme modları için önerileri](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Değiştirme modu [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Not: bu yöntem yalnızca abonelik yükseltmeleri için kullanılabilir. Düşürme işlemleri desteklenmez. - Değiştirme modu [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Not: Gerçek abonelik değişikliği yalnızca mevcut abonelik faturalandırma dönemi sona erdiğinde gerçekleşir. ## iOS'ta teklif kodlarını kullanma \{#redeem-offer-codes-in-ios\}Bir [`AdaptyProfile`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html) nesnesi. Bu model, access level'lar, abonelikler ve abonelik dışı satın almalar hakkında bilgi içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level** durumunu kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: implement-observer-mode-flutter --- --- title: "Flutter SDK'da Observer modunu uygulayın" description: "Adapty'de observer modunu uygulayarak Flutter SDK'da kullanıcı abonelik etkinliklerini takip edin." --- Kendi satın alma altyapınız zaten varsa ve Adapty'ye tamamen geçmeye hazır değilseniz, [Observer mode](observer-vs-full-mode)'u inceleyebilirsiniz. Temel haliyle Observer Mode, gelişmiş analizler ve attribution ile analitik sistemleriyle sorunsuz entegrasyon sunar. Bu ihtiyacınızı karşılıyorsa, yalnızca şunları yapmanız gerekir: 1. Adapty SDK'yı yapılandırırken `observerMode` parametresini `true` olarak ayarlayarak etkinleştirin. Kurulum talimatları için [Flutter](sdk-installation-flutter#activate-adapty-module-of-adapty-sdk) sayfasına bakın. 2. Mevcut satın alma altyapınızdan Adapty'ye [işlemleri bildirin](report-transactions-observer-mode-flutter). ## Observer modu kurulumu \{#observer-mode-setup\} Satın alma işlemlerini ve abonelik durumunu kendiniz yönetiyorsanız ve Adapty'yi abonelik olayları ile analitik göndermek için kullanıyorsanız Observer modunu etkinleştirin. :::important Observer modunda çalışırken Adapty SDK hiçbir işlemi kapatmaz; bu nedenle işlemleri kendiniz yönettiğinizden emin olun. ::: ```dart showLineNumbers title="main.dart" await Adapty().activate( configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY') ..withObserverMode(true) // Enable observer mode ..withLogLevel(AdaptyLogLevel.verbose), ); ``` Parametreler: | Parametre | Açıklama | | --------------------------- | ------------------------------------------------------------ | | observerMode | [Observer modunu](observer-vs-full-mode) kontrol eden bir boolean değeri. Varsayılan değer `false`'tur. | ## Observer Mode'da Adapty paywall'larını kullanma \{#using-adapty-paywalls-in-observer-mode\} Adapty'nin paywall'larını ve A/B testi özelliklerini de kullanmak istiyorsanız bunu yapabilirsiniz; ancak Observer mode'da bazı ek kurulum adımları gerekir. Yukarıdaki adımlara ek olarak şunları yapmanız gerekecek: 1. [Remote config paywall'lar](present-remote-config-paywalls-flutter) için paywall'ları her zamanki gibi gösterin. 3. Satın alma işlemlerini paywall'larla [ilişkilendirin](report-transactions-observer-mode-flutter). :::tip SDK v4'te, Observer mode'da Adapty tarafından render edilen flow'ları ve paywall'ları da sunabilirsiniz: bir kullanıcı ilgili butona dokunduğunda kendi kodunuzla satın alma veya geri yükleme işlemini gerçekleştirmek için bir `AdaptyUIObserverModeResolver` kaydedin. Bkz. [Observer mode'da flow sunma](flutter-present-flows-in-observer-mode). ::: --- # File: report-transactions-observer-mode-flutter --- --- title: "Flutter SDK'da Observer Mode'da işlemleri raporlama" description: "Flutter SDK'da Adapty Observer Mode'da kullanıcı içgörüleri ve gelir takibi için satın alma işlemlerini raporlayın." ---phoneNumber
firstName
lastName
| String | | gender | Enum, izin verilen değerler: `female`, `male`, `other` | | birthday | Date | ### Özel kullanıcı öznitelikleri \{#custom-user-attributes\} Kendi özel özniteliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanımıyla ilgilidir. Örneğin fitness uygulamalarında haftalık egzersiz sayısı, dil öğrenme uygulamalarında kullanıcının bilgi seviyesi gibi. Bu öznitelikleri segmentlerde hedefli paywall'lar ve teklifler oluşturmak için kullanabilirsiniz; ayrıca hangi ürün metriklerinin geliri en çok etkilediğini bulmak için analizlerde de işe yarar. ```dart showLineNumbers try { final builder = AdaptyProfileParametersBuilder() ..setCustomStringAttribute('value1', 'key1') ..setCustomDoubleAttribute(1.0, 'key2'); await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` Mevcut bir anahtarı kaldırmak için `.withRemoved(customAttributeForKey:)` metodunu kullanın: ```dart showLineNumbers try { final builder = AdaptyProfileParametersBuilder() ..removeCustomAttribute('key1') ..removeCustomAttribute('key2'); await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` Bazen önceden hangi özel özniteliklerin ayarlandığını öğrenmeniz gerekebilir. Bunun için `AdaptyProfile` nesnesinin `customAttributes` alanını kullanın. :::warning `customAttributes` değerinin güncel olmayabileceğini aklınızda bulundurun; kullanıcı öznitelikleri farklı cihazlardan herhangi bir anda gönderilebileceğinden, sunucudaki öznitelikler son senkronizasyondan bu yana değişmiş olabilir. ::: ### Sınırlamalar \{#limits\} - Kullanıcı başına en fazla 30 özel öznitelik - Anahtar adları en fazla 30 karakter uzunluğunda olabilir. Anahtar adı alfanümerik karakterler ve şunlardan herhangi birini içerebilir: `_` `-` `.` - Değer, en fazla 50 karakterden oluşan bir string veya float olabilir. --- # File: flutter-listen-subscription-changes --- --- title: "Flutter SDK'da abonelik durumunu kontrol etme" description: "Flutter uygulamanızda müşteri tutundurma oranını artırmak için Adapty'de kullanıcı abonelik durumunu takip edin ve yönetin." --- Adapty ile abonelik durumunu takip etmek oldukça kolaydır. Kodunuza manuel olarak ürün ID'leri eklemenize gerek yoktur. Bunun yerine, aktif bir [access level](access-level) olup olmadığını kontrol ederek kullanıcının abonelik durumunu zahmetsizce doğrulayabilirsiniz.Bir [AdaptyProfile](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html) nesnesi. Genellikle, kullanıcının uygulamada premium erişime sahip olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu her zaman API'yi sorgulamaya çalıştığından en güncel sonucu döndürür. Herhangi bir nedenle (örneğin internet bağlantısı olmaması), Adapty SDK sunucudan bilgi alamazsa önbellekteki veriler döndürülür. Adapty SDK'nın bilgileri mümkün olduğunca güncel tutmak için `AdaptyProfile` önbelleğini düzenli olarak güncellediğini de belirtmek gerekir.
| `.getProfile()` metodu, access level durumunu öğrenebileceğiniz kullanıcı profilini döndürür. Uygulama başına birden fazla access level tanımlayabilirsiniz. Örneğin bir gazete uygulamanız varsa ve farklı konulara abonelikleri bağımsız olarak satıyorsanız, "sports" ve "science" gibi access level'lar oluşturabilirsiniz. Ancak çoğu durumda tek bir access level yeterlidir; bu durumda varsayılan "premium" access level'ını kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmek için bir örnek: ```dart showLineNumbers try { final profile = await Adapty().getProfile(); if (profile?.accessLevels['premium']?.isActive ?? false) { // grant access to premium features } } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` ### Abonelik durumu güncellemelerini dinleme \{#listening-for-subscription-status-updates\} Kullanıcının aboneliği her değiştiğinde Adapty bir olay tetikler. Adapty'den mesaj alabilmek için birkaç ek yapılandırma yapmanız gerekmektedir: ```dart showLineNumbers Adapty().didUpdateProfileStream.listen((profile) { // handle any changes to subscription state }); ``` Adapty ayrıca uygulama başlangıcında da bir olay tetikler. Bu durumda önbellekteki abonelik durumu iletilir. ### Abonelik durumu önbelleği \{#subscription-status-cache\} Adapty SDK'daki önbellek, profilin abonelik durumunu saklar. Bu sayede sunucu erişilemez olsa bile profilin abonelik durumuyla ilgili bilgilere önbellekten ulaşılabilir. Ancak önbellekten doğrudan veri isteği yapılamadığını belirtmek gerekir. SDK, profille ilgili güncellemeleri veya değişiklikleri kontrol etmek için sunucuyu her dakika periyodik olarak sorgular. Yeni işlemler veya başka güncellemeler gibi değişiklikler söz konusu olduğunda, önbellekteki verilerin sunucuyla senkronize kalması için bu değişiklikler önbelleğe gönderilir. --- # File: flutter-deal-with-att --- --- title: "Flutter SDK'da ATT ile Başa Çıkma" description: "Abonelik kurulumu ve yönetimini kolaylaştırmak için Flutter'da Adapty'yi kullanmaya başlayın." --- Uygulamanız AppTrackingTransparency çerçevesini kullanıyor ve kullanıcıya uygulama takip yetkilendirme isteği sunuyorsa, [yetkilendirme durumunu](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) Adapty'ye göndermeniz gerekir. ```dart showLineNumbers final builder = AdaptyProfileParametersBuilder() ..setAppTrackingTransparencyStatus(AdaptyIOSAppTrackingTransparencyStatus.authorized); try { await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { // handle unknown error } ``` :::warning Bu değeri, değiştiği anda mümkün olan en kısa sürede göndermenizi kesinlikle öneririz. Ancak bu şekilde veriler, yapılandırdığınız entegrasyonlara zamanında iletilir. ::: --- # File: kids-mode-flutter --- --- title: "Flutter SDK'da Kids Mode" description: "Apple ve Google politikalarına uymak için Kids Mode'u kolayca etkinleştirin. Flutter SDK'da IDFA, GAID veya reklam verisi toplanmaz." --- Flutter uygulamanız çocuklara yönelikse [Apple](https://developer.apple.com/kids/) ve [Google](https://support.google.com/googleplay/android-developer/answer/9893335) politikalarına uymanız gerekir. Adapty SDK kullanıyorsanız, birkaç basit adımla bu politikaları karşılayacak ve uygulama mağazası incelemelerinden geçecek şekilde yapılandırabilirsiniz. ## Ne yapılması gerekiyor? \{#whats-required\} Adapty SDK'yı aşağıdaki verilerin toplanmasını devre dışı bırakacak şekilde yapılandırmanız gerekir: - [IDFA (Identifier for Advertisers)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Advertising ID (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [IP adresi](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) Bunlara ek olarak, customer user ID kullanımında dikkatli olmanızı öneririz. `isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenir. İlk alt etiket dil için, ikincisi ise bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` ise Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veriler mevcutsa bunları döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar düzensiz olursa olsun daha hızlı yükleme süreleriyle karşılaşırlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN ve CDN'e erişilemediğinde kullanılan bağımsız bir yedek sunucu da kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en son sürümünü almanızı garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlandırır. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özelliklerle birlikte bir [`AdaptyOnboarding`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyOnboarding-class.html) nesnesi. | ## Varsayılan kitle onboarding'iyle onboarding getirmeyi hızlandırma \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Genellikle onboarding'ler neredeyse anında getirilir, bu yüzden bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitleniz ve onboarding'iniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, bir onboarding getirmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir onboarding görüntülemek isteyebilirsiniz. Bu sorunu çözmek için `getOnboardingForDefaultAudience` metodunu kullanabilirsiniz; bu metot, belirtilen placement'ın **All Users** kitlesi için onboarding'i getirir. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding'i Getirme](#fetch-onboarding) bölümünde ayrıntılı olarak açıklandığı gibi `getOnboarding` metoduyla onboarding'i getirmek olduğunu anlamak son derece önemlidir. :::warning `getOnboardingForDefaultAudience` yerine `getOnboarding` kullanmayı değerlendirin; çünkü ikincisinin önemli sınırlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorunlara yol açabilir; ya geriye dönük uyumlu tasarımlar gerektirir ya da eski sürümlerin yanlış görüntülenebileceğini kabul etmek zorunda kalırsınız. - **Kişiselleştirme yok**: Yalnızca "All Users" kitlesi için içerik gösterir; ülke, attribution veya özel niteliklere dayalı hedeflemeyi kaldırır. Kullanım durumunuz için daha hızlı getirme bu dezavantajlardan daha önemliyse, aşağıda gösterildiği gibi `getOnboardingForDefaultAudience` kullanın. Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı gibi `getOnboarding` kullanın. ::: ```dart showLineNumbers try { final onboarding = await Adapty().getOnboardingForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |-----------------|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenir. İlk alt etiket dil için, ikincisi ise bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` ise Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veriler mevcutsa bunları döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar düzensiz olursa olsun daha hızlı yükleme süreleriyle karşılaşırlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN ve CDN'e erişilemediğinde kullanılan bağımsız bir yedek sunucu da kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en son sürümünü almanızı garanti edecek şekilde tasarlanmıştır.
| --- # File: flutter-present-onboardings --- --- title: "Flutter SDK'da onboarding'leri gösterme" description: "Dönüşümleri artırmak için onboarding'leri etkili biçimde nasıl göstereceğinizi öğrenin." --- :::warning **Onboardings, SDK v4'te kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır.** Artık hata düzeltmesi veya iyileştirme almamaktadır. Bunun yerine [flow'ları](flutter-get-pb-paywalls) kullanın: onboarding'lerin WebView içinde çalışmasının aksine, flow'lar cihazda doğrudan native olarak render edilir; bu sayede daha akıcı animasyonlar, tutarlı bir native görünüm, daha hızlı yükleme süreleri ve WebView bağımlılığı ortadan kalkar. Başlamak için [Flow'ları ve paywall'ları edinin](flutter-get-pb-paywalls) ve [Flow'ları ve paywall'ları görüntüleyin](flutter-present-paywalls) sayfalarına bakın. ::: Builder ile bir onboarding oluşturduysanız, bunu Flutter uygulama kodunuzda kullanıcıya göstermek için ayrıca render etmeniz gerekmez. Bu tür bir onboarding, hem neyin gösterileceğini hem de nasıl gösterileceğini içerir. Başlamadan önce şunları kontrol edin: 1. [Adapty Flutter SDK](sdk-installation-flutter) 3.8.0 veya daha yeni bir sürümü yüklemiş olmanız. 2. Bir [onboarding oluşturmuş](create-onboarding) olmanız. 3. Onboarding'i bir [placement](placements)'a eklemiş olmanız. Adapty Flutter SDK, onboarding'leri sunmak için iki yöntem sunar: - **Bağımsız ekran** - **Gömülü widget** ## Bağımsız ekran olarak göster \{#present-as-standalone-screen\} Bir onboarding'i bağımsız bir ekran olarak görüntülemek için, `createOnboardingView` metoduyla oluşturulan `onboardingView` üzerinde `onboardingView.present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Onboarding'i tekrar göstermeniz gerekiyorsa, yeni bir `onboardingView` örneği oluşturmak için `createOnboardingView` metodunu bir kez daha çağırın. :::warning Aynı `onboardingView`'ı yeniden oluşturmadan tekrar kullanmak, `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```dart showLineNumbers title="Flutter" try { await onboardingView.present(); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ### Onboarding'i kapatma \{#dismiss-the-onboarding\} Onboarding'i programatik olarak kapatmanız gerektiğinde `dismiss()` metodunu kullanın: ```dart showLineNumbers title="Flutter" try { await onboardingView.dismiss(); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ### iOS sunum stilini yapılandırma \{#configure-ios-presentation-style\} `present()` metoduna `iosPresentationStyle` parametresini geçirerek onboarding'in iOS'ta nasıl sunulacağını yapılandırın. Parametre `AdaptyUIIOSPresentationStyle.fullScreen` (varsayılan) veya `AdaptyUIIOSPresentationStyle.pageSheet` değerlerini kabul eder. ```dart showLineNumbers try { await onboardingView.present(iosPresentationStyle: AdaptyUIIOSPresentationStyle.pageSheet); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ## Widget hiyerarşisine yerleştirme \{#embed-in-widget-hierarchy\} Bir onboarding'i mevcut widget ağacınıza gömmek için `AdaptyUIOnboardingPlatformView` widget'ını doğrudan Flutter widget hiyerarşinizde kullanın. ```dart showLineNumbers title="Flutter" AdaptyUIOnboardingPlatformView( onboarding: onboarding, // The onboarding object you fetched onDidFinishLoading: (meta) { }, onDidFailWithError: (error) { }, onCloseAction: (meta, actionId) { }, onPaywallAction: (meta, actionId) { }, onCustomAction: (meta, actionId) { }, onStateUpdatedAction: (meta, elementId, params) { }, onAnalyticsEvent: (meta, event) { }, ) ``` :::note Android platform view'ın çalışması için `MainActivity`'nizin `FlutterFragmentActivity`'yi genişlettiğinden emin olun: ```kotlin showLineNumbers title="Kotlin" class MainActivity : FlutterFragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } } ``` ::: ## Onboarding sırasında yükleme ekranı \{#loader-during-onboarding\} Bir onboarding sunarken, arka planda görünüm başlatılırken açılış ekranı ile onboarding arasında kısa bir yükleme ekranı görebilirsiniz. Bunu ihtiyacınıza göre farklı şekillerde ele alabilirsiniz. #### onDidFinishLoading kullanarak açılış ekranını kontrol etme \{#control-splash-screen-using-ondidfinishloading\} :::note Bu yaklaşım yalnızca onboarding bir widget olarak yerleştirildiğinde kullanılabilir. Bağımsız ekran sunumu için mevcut değildir. ::: Önerilen platformlar arası yaklaşım, onboarding tam olarak yüklenene kadar splash ekranını veya özel overlay'inizi görünür tutmak, ardından manuel olarak gizlemektir. Gömülü widget kullanırken, kendi widget'ınızı onun üzerine yerleştirin ve `onDidFinishLoading` tetiklendiğinde overlay'i gizleyin: ```dart showLineNumbers title="Flutter" AdaptyUIOnboardingPlatformView( onboarding: onboarding, onDidFinishLoading: (meta) { // Hide your custom splash screen or overlay here }, // ... other callbacks ) ``` ### Yerel yükleyiciyi özelleştirme \{#customize-native-loader\} :::important Bu yaklaşım platforma özgüdür ve yerel UI kodunun bakımını gerektirir. Uygulamanızda zaten ayrı yerel katmanlar kullanmıyorsanız önerilmez. ::: Varsayılan yükleyiciyi özelleştirmeniz gerekiyorsa platforma özgü layout'larla değiştirebilirsiniz. Bu yaklaşım Android ve iOS için ayrı uygulamalar gerektirir: - **iOS**: Xcode projenize `AdaptyOnboardingPlaceholderView.xib` ekleyin - **Android**: `res/layout` klasöründe `adapty_onboarding_placeholder_view.xml` oluşturun ve burada bir yer tutucu tanımlayın ## Onboarding'lerde bağlantıların nasıl açılacağını özelleştirme \{#customize-how-links-open-in-onboardings\} :::important Onboarding'lerde bağlantıların nasıl açılacağını özelleştirme özelliği Adapty SDK v3.15.1 sürümünden itibaren desteklenmektedir. ::: Varsayılan olarak, onboarding'lerdeki bağlantılar uygulama içi tarayıcıda açılır. Bu, web sayfalarını uygulamanızın içinde göstererek kullanıcıların başka bir uygulamaya geçmeden içeriği görüntülemesine olanak tanır ve kesintisiz bir kullanıcı deneyimi sunar. Bağlantıların bunun yerine harici tarayıcıda açılmasını tercih ediyorsanız, `externalUrlsPresentation` parametresini `AdaptyWebPresentation.externalBrowser` olarak ayarlayarak bu davranışı özelleştirebilirsiniz:
Ardından bu ID'yi kodunuzda kullanarak özel eylem olarak işleyebilirsiniz. Örneğin, bir kullanıcı **Login** veya **Allow notifications** gibi özel bir butona dokunduğunda, `onboardingController` delegate metodu `.custom(id:)` durumuyla tetiklenecek ve `actionId` parametresi builder'daki **Action ID** olacaktır. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
```dart
// Full-screen presentation
void onboardingViewOnCustomAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
String actionId,
) {
switch (actionId) {
case 'login':
_login();
break;
case 'allow_notifications':
_allowNotifications();
break;
}
}
// Embedded widget
onCustomAction: (meta, actionId) {
_handleCustomAction(actionId);
}
```
:::important
Bir kullanıcı onboarding'i kapattığında ne olacağını yönetmeniz gerektiğini unutmayın. Örneğin, onboarding'in kendisini görüntülemeyi durdurmanız gerekir.
:::
```dart showLineNumbers title="Flutter"
// Full-screen presentation
void onboardingViewOnCloseAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
String actionId,
) {
await view.dismiss();
}
// Embedded widget
onCloseAction: (meta, actionId) {
Navigator.of(context).pop();
}
```
2. Abonelik grubu adına tıklayın. Ürünlerinizi **Subscriptions** bölümünün altında listelenmiş olarak göreceksiniz.
3. Test ettiğiniz ürünün **Ready to Submit** olarak işaretlendiğinden emin olun.
4. Tablodaki ürün ID'sini Adapty Kontrol Paneli'ndeki [**Products**](https://app.adapty.io/products) sekmesiyle karşılaştırın. ID'ler eşleşmiyorsa ürün ID'sini tablodan kopyalayıp Adapty Kontrol Paneli'nde bu ID ile [bir ürün oluşturun](create-product).
## Adım 3. Ürün kullanılabilirliğini kontrol edin \{#step-4-check-product-availability\}
1. **App Store Connect**'e geri dönün ve aynı **Subscriptions** bölümünü açın.
2. Ürünlerinizi görüntülemek için abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Availability** bölümüne kaydırın ve gereken tüm ülke ve bölgelerin listelendiğini doğrulayın.
## Adım 4. Ürün fiyatlarını kontrol edin \{#step-5-check-product-prices\}
1. **App Store Connect**'te **Monetization** → **Subscriptions** bölümüne tekrar gidin.
2. Abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Subscription Pricing** bölümüne kaydırın ve **Current Pricing for New Subscribers** bölümünü genişletin.
5. Gerekli tüm fiyatların listelendiğinden emin olun.
## Adım 5. Uygulamanın ücretli durumunu, banka hesabını ve vergi formlarının aktif olduğunu kontrol edin \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) ana sayfasında **Business**'a tıklayın.
2. Şirketinizin adını seçin.
3. Aşağı kaydırın ve **Paid Apps Agreement**, **Bank Account** ile **Tax forms** bölümlerinin hepsinin **Active** olarak göründüğünü doğrulayın.
Bu adımları izleyerek `InvalidProductIdentifiers` uyarısını çözebilir ve ürünlerinizi mağazada yayına alabilirsiniz.
## Adım 6. Takılı kaldıysa ürünü yeniden oluşturun \{#step-6-recreate-the-product-if-its-stuck\}
1–5. adımların hepsi geçiyor olabilir — `Approved` durumu, eşleşen Bundle ID, geçerli API anahtarı — ama SDK yine de `1000 noProductIDsFound` döndürüyor olabilir. Bu durumda ürün Apple'ın kayıt defterinde takılı kalmış olabilir. Apple'ın ürün kayıt defteri zaman zaman bir ürünün App Store Connect arayüzünde var olduğu ancak StoreKit arama yoluna açık olmadığı bir duruma girebilir.
Ürünü App Store Connect'te silin ve aynı ürün ID'siyle yeniden oluşturun. Yayılma için yeniden oluşturulduktan sonra 24 saate kadar bekleyin.
---
# File: cantMakePayments-flutter
---
---
title: "Flutter SDK'da Code-1003 cantMakePayment hatasının çözümü"
description: "Adapty'de abonelikleri yönetirken ödeme yapma hatasını çözün."
---
1003 hatası, `cantMakePayments`, bu cihazda uygulama içi satın alımların yapılamayacağını belirtir.
`cantMakePayments` hatasıyla karşılaşıyorsanız, bu genellikle şu nedenlerden biriyle ilgilidir:
- Cihaz kısıtlamaları: Bu hata Adapty ile ilgili değildir. Aşağıdaki çözüm yollarına bakın.
- Observer mode yapılandırması: `makePurchase` metodu ve observer mode aynı anda kullanılamaz. Aşağıdaki bölüme bakın.
## Sorun: Cihaz kısıtlamaları \{#issue-device-restrictions\}
| Sorun | Çözüm |
|------------------------------|------------------------------------------------------------------------------------------------------------------------------|
| Ekran Süresi kısıtlamaları | [Ekran Süresi](https://support.apple.com/en-us/102470) ayarlarında Uygulama İçi Satın Alım kısıtlamalarını devre dışı bırakın |
| Hesap askıya alındı | Hesap sorunlarını çözmek için Apple Destek ile iletişime geçin |
| Bölgesel kısıtlamalar | Desteklenen bir bölgeden App Store hesabı kullanın |
## Sorun: Observer mode ve makePurchase'ı birlikte kullanmak \{#issue-using-both-observer-mode-and-makepurchase\}
Satın alımları yönetmek için `makePurchases` kullanıyorsanız Observer mode'u kullanmanıza gerek yoktur. [Observer mode](observer-vs-full-mode), yalnızca satın alma mantığını kendiniz uyguladığınızda gereklidir.
Dolayısıyla `makePurchase` kullanıyorsanız, SDK etkinleştirme kodundan Observer mode'u etkinleştiren kısmı güvenle kaldırabilirsiniz.
---
# File: migration-to-flutter-sdk-v4
---
---
title: "Adapty Flutter SDK'yı v. 4.0'a Geçirin"
description: "Adapty Flutter SDK v4.0'a geçiş yapın: paywall API'lerini flow API'leriyle değiştirin; hem Flow Builder hem de Paywall Builder ile uyumludur."
---
Adapty Flutter SDK 4.0, flow'ları tanıtır ve paywall API'lerini buna göre yeniden adlandırır. Yeni API'ler hem yeni Flow Builder hem de mevcut Paywall Builder ile çalışır — Adapty Kontrol Paneli tarafında herhangi bir kurulum değişikliği gerekmez.
## Hızlı başvuru \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty().getPaywall(placementId: id)` | `Adapty().getFlow(placementId: id)` |
| `Adapty().getPaywallForDefaultAudience(placementId: id)` | `Adapty().getFlowForDefaultAudience(placementId: id)` |
| `Adapty().getPaywallProducts(paywall: paywall)` | `Adapty().getPaywallProducts(flow: flow)` |
| `Adapty().logShowPaywall(paywall: paywall)` | `Adapty().logShowFlow(flow: flow)` |
| `AdaptyPaywall` (tür) | `AdaptyFlow` |
| `AdaptyPaywallFetchPolicy` (tür) | `AdaptyFlowFetchPolicy` |
| `AdaptyUI().createPaywallView(paywall: paywall)` | `AdaptyUI().createFlowView(flow: flow)` |
| `AdaptyUIPaywallView` (tür) | `AdaptyUIFlowView` |
| `AdaptyUIPaywallPlatformView` (widget) | `AdaptyUIFlowPlatformView` |
| `AdaptyUI().presentPaywallView(view)` / `dismissPaywallView(view)` | `AdaptyUI().presentFlowView(view)` / `dismissFlowView(view)` |
| `AdaptyUIPaywallsEventsObserver` | `AdaptyUIFlowsEventsObserver` |
| `AdaptyUI().setPaywallsEventsObserver(observer)` | `AdaptyUI().setFlowsEventsObserver(observer)` |
| `paywallViewDid*` callback'leri | `flowViewDid*` callback'leri |
| `paywallViewDidFailRendering` | `flowViewDidReceiveError` |
`AdaptyPaywallProduct` adını korur — ürünler hâlâ bir flow'a aittir ve `getPaywallProducts` artık bir `AdaptyFlow` alır. Bir flow çekerken artık `locale` geçirmenize gerek yoktur. Satın alma ve profil API'leri (`makePurchase`, `restorePurchases`, `getProfile`, `identify` vb.) değişmeden kalmıştır; `present`, `dismiss` ve `showDialog` view metodları da aynı şekilde. Bazı varsayılan davranışlar değişti — bkz. [Varsayılan davranış değişiklikleri](#default-behavior-changes).
## Minimum sürümler \{#minimum-versions\}
Adapty Flutter SDK 4.0, minimum gereksinimleri yükseltiyor:
- **iOS 15.0** — minimum iOS deployment target, iOS 13.0'dan yükseltildi.
- **Xcode 26** veya daha yenisi — yerel iOS SDK'sı Swift tools 6.2 kullanıyor.
- **Flutter 3.32.0** (Dart 3.8.0) veya daha yenisi.
## Kurulum \{#installation\}
### Paketi güncelleyin \{#update-the-package\}
Hangi paketi yükleyeceğiniz, uygulamanızın Kids Mode kullanıp kullanmadığına bağlıdır.
Çoğu uygulama için `pubspec.yaml` dosyanızda `adapty_flutter` paketini v4.0'a güncelleyin:
```yaml showLineNumbers title="pubspec.yaml"
dependencies:
adapty_flutter: 4.0.0
```
Uygulamanız Kids Mode kullanıyorsa bunun yerine `adapty_flutter_kids` belirtin:
```yaml showLineNumbers title="pubspec.yaml"
dependencies:
adapty_flutter_kids: 4.0.0
```
Bu **bağımsız** paket, App Store gereksinimlerine uymak için IDFA ve reklam takip kodlarını kaldırır. Dart import yolunu `package:adapty_flutter_kids/adapty_flutter.dart` olarak güncelleyin. Bunun dışında, migration işlemi normal paketle tamamen aynıdır.
Kids Mode ayrıca Adapty Kontrol Paneli'nde IP adresi toplamanın devre dışı bırakılmasını gerektirir — tam kurulum için [Kids Mode](kids-mode-flutter) sayfasına bakın.
### iOS: yerel SDK'lar artık Swift Package Manager üzerinden geliyor \{#ios-native-sdks-now-come-through-swift-package-manager\}
[CocoaPods'ın spec deposu Aralık 2026'da salt okunur hale geliyor](https://blog.cocoapods.org/CocoaPods-Specs-Repo/), bu nedenle v4 itibarıyla yerel iOS SDK'sı **artık CocoaPods üzerinden dağıtılmıyor** — eklenti bunu yalnızca **Swift Package Manager** aracılığıyla çekiyor.
Flutter 3.32–3.43 kullanıyorsanız, Swift Package Manager desteğini bir kez etkinleştirin:
```bash
flutter config --enable-swift-package-manager
```
Flutter 3.44 ve sonrası Swift Package Manager'ı varsayılan olarak etkinleştiriyor, dolayısıyla bu sürümlerde herhangi bir işlem yapmanıza gerek yok.
## Flow'ları getirme \{#fetching-flows\}
### getPaywall → getFlow
Dönen tür `AdaptyPaywall` yerine `AdaptyFlow` olarak değişti ve artık `locale` parametresi geçmiyorsunuz — bir flow render ettiğinizde yerelleştirme otomatik olarak çözümlenir; özel paywalllar için yapılandırılmış tüm locale'lar `flow.remoteConfigs` içinde döner:
```diff showLineNumbers
- final paywall = await Adapty().getPaywall(placementId: 'YOUR_PLACEMENT_ID', locale: 'en');
+ final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
```
`getPaywallForDefaultAudience` da aynı şekilde yeniden adlandırıldı:
```diff showLineNumbers
- final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID', locale: 'en');
+ final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
```
Fetch policy türü `AdaptyPaywallFetchPolicy`'den `AdaptyFlowFetchPolicy`'ye yeniden adlandırıldı; seçenekleri (`reloadRevalidatingCacheData`, `returnCacheDataElseLoad`, `returnCacheDataIfNotExpiredElseLoad`) değişmedi.
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` adını korur ancak artık `flow` parametresi aracılığıyla bir `AdaptyFlow` alır:
```diff showLineNumbers
- final products = await Adapty().getPaywallProducts(paywall: paywall);
+ final products = await Adapty().getPaywallProducts(flow: flow);
```
## Veri modeli \{#data-model\}
`getFlow`, `AdaptyPaywall` yerine bir `AdaptyFlow` döndürür ve nesne yapısı değişti:
| v3 `AdaptyPaywall` üyesi | v4 `AdaptyFlow` üyesi | İşlem |
|---|---|---|
| `remoteConfig` (tekil, nullable) | `remoteConfigs` (liste) | Bir flow, yapılandırılmış her dil için bir remote config taşır. `remoteConfig` getter'ı hâlâ mevcuttur ve ilk girişi döndürür; belirli bir dil seçmek için `remoteConfigs` içinde `locale` değerine göre arama yapın. |
| `productIdentifiers` | `productIdentifiers` | Korundu, ancak artık flow'un tüm paywall varyasyonlarından derleniyor. Varyasyon bazındaki tanımlayıcılar `flow.paywalls[i].productIdentifiers` üzerinde bulunur. |
| `hasViewConfiguration` | `hasViewConfiguration` | Değişmedi. |
| `placementId` (kullanımdan kalktı) | kaldırıldı | `flow.placement.id` kullanın. |
| `revision` (kullanımdan kalktı) | kaldırıldı | `flow.placement.revision` kullanın. |
| `vendorProductIds` (kullanımdan kalktı) | kaldırıldı | `productIdentifiers` kullanın. |
| _(yeni)_ | `paywalls` (`AdaptyFlowPaywall` listesi) | Her giriş, flow içindeki bir paywall varyasyonunu temsil eder ve kendine ait `name`, `variationId` ve `productIdentifiers` değerlerine sahiptir. |
`AdaptyPaywallViewConfiguration` artık açık değil — görünüm yapılandırması artık opak. Bu türe yapılan tüm referansları kaldırın.
## Web paywall metodları \{#web-paywall-methods\}
`openWebPaywall` ve `createWebPaywallUrl` isimlerini korur, ancak `paywall` parametresi artık `AdaptyPaywall` yerine `AdaptyFlowPaywall` (bir flow varyasyonu) alır. Yine de bunun yerine `AdaptyPaywallProduct` geçirebilirsiniz.
```diff showLineNumbers
final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
- await Adapty().openWebPaywall(paywall: paywall);
+ if (flow.paywalls.isNotEmpty) {
+ await Adapty().openWebPaywall(paywall: flow.paywalls[0]);
+ }
```
## Flow görüntülemelerini takip etme \{#tracking-flow-views\}
### logShowPaywall → logShowFlow
`logShowPaywall`, `logShowFlow` olarak yeniden adlandırıldı ve artık bir `AdaptyFlow` alıyor. Olay aynı varyasyon üzerinden kaydedilmeye devam eder; bu sayede mevcut funnel ve A/B testi metrikleri kontrol panelinde herhangi bir değişiklik yapmadan çalışmayı sürdürür.
```diff showLineNumbers
- await Adapty().logShowPaywall(paywall: paywall);
+ await Adapty().logShowFlow(flow: flow);
```
v3'te olduğu gibi, [Flow Builder](adapty-flow-builder) veya [Paywall Builder](adapty-paywall-builder) tarafından oluşturulan flow'ları ya da paywall'ları görüntülerken bu metodu çağırmanıza gerek yoktur — Adapty bu görüntülemeleri otomatik olarak takip eder.
## Flow'ları görüntüleme \{#displaying-flows\}
### createPaywallView → createFlowView
Metodu yeniden adlandırın ve `AdaptyFlow`'u `flow` parametresi aracılığıyla geçirin. Diğer parametreler (`loadTimeout`, `preloadProducts`, `customTags`, `customTimers`, `customAssets`, `productPurchaseParams`) ve view metodları `present`, `dismiss` ve `showDialog` değişmeden kalır:
```diff showLineNumbers
- final view = await AdaptyUI().createPaywallView(paywall: paywall);
+ final view = await AdaptyUI().createFlowView(flow: flow);
await view.present();
```
### AdaptyUIPaywallView → AdaptyUIFlowView
Görünüm türü yeniden adlandırıldı. Kullanımdan kaldırılmış `paywallVariationId` özelliği kaldırıldı — bunun yerine `variationId` kullanın:
```diff showLineNumbers
- void flowViewDidAppear(AdaptyUIPaywallView view) {
+ void flowViewDidAppear(AdaptyUIFlowView view) {
```
### AdaptyUIPaywallPlatformView → AdaptyUIFlowPlatformView
Görünümü widget ağacınıza widget olarak gömmek istiyorsanız, adını değiştirin ve `flow` parametresini geçin. Olay callback'leri (`onDidAppear`, `onDidFinishPurchase` vb.) aynı isimlerini korur:
```diff showLineNumbers
- AdaptyUIPaywallPlatformView(
- paywall: paywall,
+ AdaptyUIFlowPlatformView(
+ flow: flow,
onDidFinishPurchase: (view, product, purchaseResult) { /* … */ },
)
```
:::note
`createFlowView` ile oluşturulan bir flow görünümü tek kullanımlıktır: `dismiss()` çağrıldıktan sonra görünüm bellekten serbest bırakılır ve bir daha gösterilemez — flow'u tekrar göstermek için `createFlowView`'ı yeniden çağırın.
:::
## Olayları Yönetme \{#handling-events\}
Observer sınıfı `AdaptyUIPaywallsEventsObserver`'dan `AdaptyUIFlowsEventsObserver`'a, kayıt metodu `setPaywallsEventsObserver`'dan `setFlowsEventsObserver`'a ve tüm `paywallViewDid*` callback'leri `flowViewDid*`'e yeniden adlandırıldı:
```diff showLineNumbers
- class MyObserver extends AdaptyUIPaywallsEventsObserver {
+ class MyObserver extends AdaptyUIFlowsEventsObserver {
@override
- void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action) {
+ void flowViewDidPerformAction(AdaptyUIFlowView view, AdaptyUIAction action) {
// …
}
}
- AdaptyUI().setPaywallsEventsObserver(this);
+ AdaptyUI().setFlowsEventsObserver(this);
```
Artık üç callback **zorunludur** — bunlar olmadan observer'ınız derlenmez:
- **`flowViewDidFinishPurchase`**: v3'te isteğe bağlıydı; varsayılan davranış satın alma sonrasında görünümü kapatıyordu. Artık ne olacağına siz karar veriyorsunuz: flow'a devam edin ya da `view.dismiss()` çağırın.
- **`flowViewDidFinishRestore`**: v3'te olduğu gibi zorunludur.
- **`flowViewDidReceiveError`**: `paywallViewDidFailRendering` yerine gelir ve artık diğer görünüm hatalarını da alır.
İki küçük değişiklik daha:
- `setFlowsEventsObserver` (ve `setOnboardingsEventsObserver`) artık önceden ayarlanmış bir observer'ı ayırmak için `null` kabul ediyor; bu sayede SDK artık onu tutmuyor.
- Yeni isteğe bağlı `flowViewDidReceiveAnalyticEvent` callback'i, bir flow'dan gelen özel analitik olaylar için ayrılmıştır. Flow'lar henüz bu olayları kodunuza iletmiyor, dolayısıyla bunu uygulamanız gerekmiyor.
v4 ayrıca isteğe bağlı olarak kullanabileceğiniz yeni özellikler ekliyor:
- `AdaptyUI().setObserverModeResolver(...)` ile birlikte `AdaptyUIObserverModeResolver` — SDK [Observer mode](implement-observer-mode-flutter) olarak çalışırken flow'lardan başlatılan satın alma ve geri yüklemeleri yönetir. Daha önce bu yalnızca native iOS ve Android SDK'larında kullanılabiliyordu. Bkz. [Flow'ları Observer mode'da sunma](flutter-present-flows-in-observer-mode).
- `AdaptyUI().setSystemRequestsHandler(...)` ile birlikte `AdaptyUISystemRequestsHandler` — bir flow'dan gelen sistem istekleri (işletim sistemi izin istemleri ve App Store inceleme istekleri) için ayrılmıştır. Flow'lar henüz bu istekleri tetiklemediğinden bir handler kaydetmeniz gerekmez.
## Kaldırılan API'lar \{#removed-apis\}
Bu semboller 3.x sürümünde kullanımdan kaldırılmıştı ve v4'te tamamen kaldırılmıştır:
### setFallbackPaywalls → setFallback
```diff showLineNumbers
- await Adapty().setFallbackPaywalls(assetId);
+ await Adapty().setFallback(assetId);
```
### withIdfaCollectionDisabled → withAppleIdfaCollectionDisabled
```diff showLineNumbers
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
- ..withIdfaCollectionDisabled(true),
+ ..withAppleIdfaCollectionDisabled(true),
```
### Kaldırılan diğer üyeler \{#other-removed-members\}
- **`AdaptyPurchaseResultSuccess.jwsTransaction`**: `appleJwsTransaction` kullanın.
- **`AdaptyUIFlowView.paywallVariationId`**: `variationId` kullanın.
- **`AdaptyUIObserver` ve `AdaptyUI().setObserver(...)`**: `AdaptyUIFlowsEventsObserver` ve `setFlowsEventsObserver(...)` kullanın.
## Varsayılan davranış değişiklikleri \{#default-behavior-changes\}
Bu değişiklikler derleme hatası oluşturmaz, bu nedenle çalışma zamanında test edin:
- **Başarılı satın alma**: v3'te varsayılan `paywallViewDidFinishPurchase` görünümü kapatıyordu. v4'te `flowViewDidFinishPurchase` zorunludur ve varsayılan davranışı yoktur — bu davranışı istiyorsanız görünümü kendiniz kapatın.
- **Android sistem geri tuşu**: Artık varsayılan olarak bir flow'u kapatmaz. Eylem, `AndroidSystemBackAction` olarak `flowViewDidPerformAction`'a iletilir — geri tuşunun flow'u kapatmasını istiyorsanız bunu orada ele alın.
- **URL açma**: Varsayılan `flowViewDidPerformAction` artık `OpenUrlAction`'ı URL'yi yerel olarak açarak işler (kontrol panelindeki uygulama içi veya harici tarayıcı ayarına uyar); `CloseAction`'da ise görünümü kapatmaya devam eder. URL'leri kendiniz işlemek istiyorsanız callback'i geçersiz kılın.
- **Görünüm hataları**: `flowViewDidReceiveError` zorunludur ve kapatma işlemi sizin implementasyonunuza bağlıdır. v3 entegrasyonunuz render hatalarında görünümün otomatik olarak kapanmasına dayanıyorsa, bu callback içinde `view.dismiss()` çağırın.
- **Görünüm yaşam döngüsü**: Bir flow veya onboarding görünümünü kapatmak, onu bellekten serbest bırakır. Kapatılmış bir görünüm artık yeniden gösterilemez — bunun yerine yeni bir tane oluşturun.
## Onboarding API'sinin kullanımdan kaldırılması \{#onboarding-api-deprecation\}
Eski onboarding API'si, v4.0'da [Flow Builder](adapty-flow-builder) lehine kullanımdan kaldırılmıştır. Çalışmaya devam etmektedir; IDE'niz `@Deprecated` anotasyonları aracılığıyla kullanımdan kaldırılan sembolleri işaretler — çalışma zamanında herhangi bir uyarı gösterilmez. Bu semboller gelecekteki bir sürümde kaldırılacağından, onboarding'lerinizi Flow Builder'a taşımayı planlamanız önerilir.
Kullanımdan kaldırılan semboller: `getOnboarding`, `getOnboardingForDefaultAudience`, `createOnboardingView`, `presentOnboardingView`, `dismissOnboardingView`, `setOnboardingsEventsObserver`, `AdaptyOnboarding`, `AdaptyUIOnboardingView`, `AdaptyUIOnboardingPlatformView`, `AdaptyUIOnboardingsEventsObserver` ve onboarding durum, girdi ile analitik modelleri.
---
# File: flutter-migration-guide-310
---
---
title: "Flutter Adapty SDK 3.10.0 için Geçiş Rehberi"
description: ""
---
Adapty SDK 3.10.0, bazı geliştirmeler içeren büyük bir sürümdür. Bu değişiklikler için aşağıdaki geçiş adımlarını uygulamanız gerekebilir:
1. `makePurchase` metodunu, tek tek parametreler yerine `AdaptyPurchaseParameters` kullanacak şekilde güncelleyin.
2. `AdaptyPaywall` modelinde `vendorProductIds` yerine `productIdentifiers` kullanın.
## makePurchase metodunu güncelleyin \{#update-makepurchase-method\}
`makePurchase` metodu artık ayrı ayrı `subscriptionUpdateParams` ve `isOfferPersonalized` argümanları yerine `AdaptyPurchaseParameters` kullanıyor. Bu değişiklik daha iyi tip güvenliği sağlar ve satın alma parametrelerinin gelecekte genişletilmesine olanak tanır.
```diff showLineNumbers
- final purchaseResult = await adapty.makePurchase(
- product: product,
- subscriptionUpdateParams: subscriptionUpdateParams,
- isOfferPersonalized: true,
- );
+ final parameters = AdaptyPurchaseParametersBuilder()
+ ..setSubscriptionUpdateParams(subscriptionUpdateParams)
+ ..setIsOfferPersonalized(true)
+ ..setObfuscatedAccountId('your-account-id')
+ ..setObfuscatedProfileId('your-profile-id');
+ final purchaseResult = await adapty.makePurchase(
+ product: product,
+ parameters: parameters.build(),
+ );
```
Ek parametreye ihtiyaç duymuyorsanız şu şekilde kullanabilirsiniz:
```dart showLineNumbers
final purchaseResult = await adapty.makePurchase(
product: product,
);
```
## AdaptyPaywall model kullanımını güncelleyin \{#update-adaptyapaywall-model-usage\}
`vendorProductIds` özelliği kullanımdan kaldırılmış olup yerini `productIdentifiers` almıştır. Yeni özellik, düz string'ler yerine `AdaptyProductIdentifier` nesneleri döndürerek daha yapılandırılmış ürün bilgisi sunar.
```diff showLineNumbers
- paywall.vendorProductIds.map((vendorId) =>
- ListTextTile(title: vendorId)
- ).toList()
+ paywall.productIdentifiers.map((productId) =>
+ ListTextTile(title: productId.vendorProductId)
+ ).toList()
```
`AdaptyProductIdentifier` nesnesi, `vendorProductId` özelliği aracılığıyla vendor ürün kimliğine erişim sağlar; mevcut işlevselliği korurken gelecekteki geliştirmeler için daha iyi bir yapı sunar.
## Geriye dönük uyumluluk \{#backward-compatibility\}
Her iki değişiklik de geriye dönük uyumluluğu korumaktadır:
- `makePurchase` içindeki eski parametreler kullanımdan kaldırılmış olsa da çalışmaya devam eder
- `vendorProductIds` özelliği kullanımdan kaldırılmış olsa da erişilebilir olmaya devam eder
- Mevcut kodunuz çalışmaya devam eder; ancak deprecation uyarıları göreceksiniz
Gelecekteki uyumluluğu sağlamak ve geliştirilmiş tip güvenliği ile genişletilebilirlikten yararlanmak için kodunuzu yeni API'leri kullanacak şekilde güncellemenizi öneririz.
---
# File: flutter-migration-guide-38
---
---
title: "Adapty Flutter SDK'yı v. 3.8'e Geçirme"
description: "Daha iyi performans ve yeni monetizasyon özellikleri için Adapty Flutter SDK v3.8'e geçin."
---
Adapty SDK 3.8.0, bazı iyileştirmeler getiren önemli bir sürümdür; ancak bu iyileştirmeler sizin tarafınızdan bazı geçiş adımları gerektirebilir.
1. Observer sınıfı ve metod adlarını güncelleyin.
2. Yedek paywall metod adını güncelleyin.
3. Olay işleme metodlarındaki view sınıf adını güncelleyin.
## Observer sınıfı ve metod adlarını güncelleme \{#update-observer-class-and-method-names\}
Observer sınıfı ve kayıt metodu yeniden adlandırıldı:
```diff showLineNumbers
- class MyObserver extends AdaptyUIObserver {
+ class MyObserver extends AdaptyUIPaywallsEventsObserver {
@override
void paywallViewDidPerformAction(AdaptyUIView view, AdaptyUIAction action) {
// Handle action
}
}
// Register observer
- AdaptyUI().setObserver(this);
+ AdaptyUI().setPaywallsEventsObserver(this);
```
## Yedek paywall metod adını güncelleme \{#update-fallback-paywalls-method-name\}
Yedek paywall ayarlama metodu basitleştirildi:
```diff showLineNumbers
try {
- await Adapty.setFallbackPaywalls(assetId);
+ await Adapty.setFallback(assetId);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
```
## Olay işleme yöntemlerinde view sınıfı adını güncelleme \{#update-view-class-name-in-event-handling-methods\}
Tüm olay işleme yöntemleri artık `AdaptyUIView` yerine yeni `AdaptyUIPaywallView` sınıfını kullanıyor:
```diff showLineNumbers
- void paywallViewDidPerformAction(AdaptyUIView view, AdaptyUIAction action)
+ void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action)
- void paywallViewDidSelectProduct(AdaptyUIView view, AdaptyPaywallProduct product)
+ void paywallViewDidSelectProduct(AdaptyUIPaywallView view, AdaptyPaywallProduct product)
- void paywallViewDidStartPurchase(AdaptyUIView view, AdaptyPaywallProduct product)
+ void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product)
- void paywallViewDidFinishPurchase(AdaptyUIView view, AdaptyPaywallProduct product, AdaptyProfile profile)
+ void paywallViewDidFinishPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyProfile profile)
- void paywallViewDidFailPurchase(AdaptyUIView view, AdaptyPaywallProduct product, AdaptyError error)
+ void paywallViewDidFailPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error)
- void paywallViewDidFinishRestore(AdaptyUIView view, AdaptyProfile profile)
+ void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile)
- void paywallViewDidFailRestore(AdaptyUIView view, AdaptyError error)
+ void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error)
- void paywallViewDidFailLoadingProducts(AdaptyUIView view, AdaptyIOSProductsFetchPolicy? fetchPolicy, AdaptyError error)
+ void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyIOSProductsFetchPolicy? fetchPolicy, AdaptyError error)
- void paywallViewDidFailRendering(AdaptyUIView view, AdaptyError error)
+ void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error)
```
---
# File: migration-to-flutter-sdk-34
---
---
title: "Adapty Flutter SDK'yı v3.4'e Taşıma"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Flutter SDK v3.4'e geçiş yapın."
---
Adapty SDK 3.4.0, sizin tarafınızda geçiş adımları gerektiren iyileştirmeler sunan önemli bir sürümdür.
## Yedek paywall dosyalarını güncelleme \{#update-fallback-paywall-files\}
Yeni SDK sürümüyle uyumluluğu sağlamak için yedek paywall dosyalarınızı güncelleyin:
1. Adapty Kontrol Paneli'nden [güncellenmiş yedek paywall dosyalarını indirin](fallback-paywalls).
2. Mobil uygulamanızdaki [mevcut yedek paywall'ları yeni dosyalarla değiştirin](flutter-use-fallback-paywalls).
## Observer Mode uygulamasını güncelleme \{#update-implementation-of-observer-mode\}
Observer Mode kullanıyorsanız, uygulamasını güncellediğinizden emin olun.
Daha önce, işlemleri Adapty'ye bildirmek için farklı yöntemler kullanılıyordu. Yeni sürümde, `reportTransaction` yöntemi hem Android hem de iOS'ta tutarlı biçimde kullanılmalıdır. Bu yöntem, her işlemi Adapty'ye açıkça bildirir ve tanınmasını sağlar. Bir paywall kullanıldıysa, işlemi ilgili paywall'a bağlamak için varyasyon ID'sini geçirin.
:::warning
**İşlem bildirmeyi atlamayın!**
`reportTransaction` çağrısını yapmazsanız Adapty işlemi tanımaz, işlem analizlerde görünmez ve entegrasyonlara gönderilmez.
:::
```diff showLineNumbers
- // every time when calling transaction.finish()
- if (Platform.isAndroid) {
- try {
- await Adapty().restorePurchases();
- } on AdaptyError catch (adaptyError) {
- // handle the error
- } catch (e) {
- }
- }
try {
// every time when calling transaction.finish()
await Adapty().reportTransaction(
"YOUR_TRANSACTION_ID",
variationId: "PAYWALL_VARIATION_ID", // optional
);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
```
---
# File: migration-to-flutter330
---
---
title: "Adapty Flutter SDK'yı v3.3'e Geçirme"
description: "Daha iyi performans ve yeni monetizasyon özellikleri için Adapty Flutter SDK v3.3'e geçiş yapın."
---
Adapty SDK 3.3.0, bazı iyileştirmeler içeren önemli bir sürümdür; ancak bu iyileştirmeler sizin tarafınızdan bazı geçiş adımları gerektirebilir.
1. Yedek paywall sağlama yöntemini güncelleyin.
2. `getProductsIntroductoryOfferEligibility` metodunu kaldırın.
3. Adjust, AirBridge, Amplitude, AppMetrica, Appsflyer, Branch, Facebook Ads, Firebase ve Google Analytics, Mixpanel, OneSignal, Pushwoosh için entegrasyon yapılandırmalarını güncelleyin.
4. Observer mode uygulamasını güncelleyin.
## Yedek paywall sağlama yöntemini güncelleyin \{#update-method-for-providing-fallback-paywalls\}
Daha önce bu yöntem, yedek paywall'u JSON dizesi (`jsonString`) olarak alıyordu; artık bunun yerine yerel yedek dosyanın yolunu (`assetId`) alıyor.
```diff showLineNumbers
import 'dart:async' show Future;
import 'dart:io' show Platform;
-import 'package:flutter/services.dart' show rootBundle;
-final filePath = Platform.isIOS ? 'assets/ios_fallback.json' : 'assets/android_fallback.json';
-final jsonString = await rootBundle.loadString(filePath);
+final assetId = Platform.isIOS ? 'assets/ios_fallback.json' : 'assets/android_fallback.json';
try {
- await adapty.setFallbackPaywalls(jsonString);
+ await adapty.setFallbackPaywalls(assetId);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
}
```
Tam kod örneği için [Yedek paywall kullanımı](flutter-use-fallback-paywalls) sayfasına bakın.
## `getProductsIntroductoryOfferEligibility` metodunu kaldırın \{#remove-getproductsintroductoryoffereligibility-method\}
Adapty iOS SDK 3.3.0 öncesinde, ürün nesnesi kullanıcının uygun olup olmadığından bağımsız olarak her zaman teklifleri içeriyordu. Teklifi kullanmadan önce uygunluğu manuel olarak kontrol etmeniz gerekiyordu.
Artık ürün nesnesi yalnızca kullanıcı uygunsa bir teklif içeriyor. Bu da uygunluğu ayrıca kontrol etmenize gerek kalmadığı anlamına gelir; bir teklif varsa kullanıcı zaten uygundur.
## Üçüncü taraf entegrasyon SDK yapılandırmasını güncelleyin \{#update-third-party-integration-sdk-configuration\}
Adapty Flutter SDK 3.3.0 ve sonrasında entegrasyonların düzgün çalışması için aşağıdaki bölümlerde açıklandığı gibi SDK yapılandırmalarınızı güncelleyin.
### Adjust
Mobil uygulama kodunuzu aşağıda gösterildiği şekilde güncelleyin. Tam kod örneği için [Adjust entegrasyonu için SDK yapılandırması](adjust#connect-your-app-to-adjust) sayfasına bakın.
```diff showLineNumbers
import 'package:adjust_sdk/adjust.dart';
import 'package:adjust_sdk/adjust_config.dart';
try {
final adid = await Adjust.getAdid();
if (adid == null) {
// handle the error
}
+ await Adapty().setIntegrationIdentifier(
+ key: "adjust_device_id",
+ value: adid,
+ );
final attributionData = await Adjust.getAttribution();
var attribution = Map[Observer mode](observer-vs-full-mode) özelliğini kontrol eden bir boolean değer. Satın alma ve abonelik durumunu kendiniz yönetip Adapty'yi yalnızca abonelik etkinliklerini ve analizleri göndermek için kullanıyorsanız etkinleştirin.
Varsayılan değer `false`'tur.
🚧 Observer mode etkinken Adapty SDK hiçbir işlemi kapatmaz, bu nedenle bunu kendiniz yönettiğinizden emin olun.
| | **withCustomerUserId** | isteğe bağlı | Sisteminizdeki kullanıcı tanımlayıcısı. Etkinlikleri doğru profile bağlamak için abonelik ve analitik etkinliklerinde gönderilir. Ayrıca [**Profiles and Segments**](https://app.adapty.io/profiles/users) menüsünden `customerUserId` ile müşteri arayabilirsiniz. | | **withIdfaCollectionDisabled** | isteğe bağlı |IDFA toplama ve paylaşımını devre dışı bırakmak için `true` olarak ayarlayın.
Kullanıcı IP adresi paylaşımı.
Varsayılan değer `false`'tur.
IDFA toplama hakkında daha fazla bilgi için [Analytics integration](analytics-integration#disable-collection-of-advertising-identifiers) bölümüne bakın.
| | **withIpAddressCollectionDisabled** | isteğe bağlı |Kullanıcı IP adresi toplama ve paylaşımını devre dışı bırakmak için `true` olarak ayarlayın.
Varsayılan değer `false`'tur.
| ### Adapty SDK'nın AdaptyUI Modülünü Etkinleştirme \{#activate-adaptyui-module-of-adapty-sdk\} AdaptyUI modülünü yalnızca [Paywall Builder](adapty-paywall-builder) kullanmayı planlıyorsanız yapılandırmanız gerekir: ```dart showLineNumbers title="Dart" try { final mediaCache = AdaptyUIMediaCacheConfiguration( memoryStorageTotalCostLimit: 100 * 1024 * 1024, // 100MB memoryStorageCountLimit: 2147483647, // 2^31 - 1, max int value in Dart diskStorageSizeLimit: 100 * 1024 * 1024, // 100MB ); await AdaptyUI().activate( configuration: AdaptyUIConfiguration(mediaCache: mediaCache), observer:
### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin uygulamanıza giriş yaptıktan veya kaydolduktan sonra), customer user ID'yi ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty onu otomatik olarak mevcut profile bağlar.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı ID'leri her kullanıcı için benzersiz olmalıdır. Parametreye sabit bir değer atarsanız, tüm kullanıcılar tek bir kullanıcı olarak değerlendirilir.
:::
`identify` metodunu her zaman `await` ile çağırın ve ardından diğer SDK metodlarını kullanın. Eş zamanlı çağrılar `#3006 profileWasChanged` hatasına yol açar veya anonim profil üzerinde işlem yapar. Bkz. [iOS SDK'da çağrı sırası](ios-sdk-call-order).
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye ulaşmasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en son veriye ulaşamayabilir, ama internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süresi yaşarlar. Önbellek düzenli olarak güncellenir; dolayısıyla ağ isteklerini azaltmak için oturum boyunca güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırıldığında veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken paywalllarınızın her zaman en güncel halini almanızı garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Arka planda işlem farklı isteklerden oluşabileceğinden, nadir durumlarda bu metodun `loadTimeout` ile belirtilen süreden biraz daha geç zaman aşımına uğrayabileceğini unutmayın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :---------- | | Flow | Placement, tanımlayıcılar (`id`, `variationId`), ad, remote config'ler ve flow'un bir görünüm yapılandırması içerip içermediğini belirten `hasViewConfiguration` bayrağını barındıran bir `AdaptyFlow` nesnesi. Ürünleri ön yükleme, özel kullanıcı arayüzü veya programatik kontroller için getirmek üzere `getPaywallProducts(flow:)` çağırın. | ## Görünüm yapılandırmasını getir \{#fetch-the-view-configuration\} Flow veya paywallı getirdikten sonra, `flow.hasViewConfiguration` ile görünüm yapılandırması içerip içermediğini kontrol edin. Bu bayrak, placement'ın Adapty Kontrol Paneli'nde nasıl tasarlandığını ayırt eder: - **`true`** — placement, **Flow Builder** (bir flow) veya **Paywall Builder** (bir paywall) kullanılarak tasarlanmış. Adapty arayüzü sizin için render eder. Görünüm yapılandırmasını getirmek ve [flow veya paywallı sunmak](ios-present-paywalls) için aşağıdaki adımlarla devam edin. - **`false`** — placement, Builder arayüzü olmayan özel bir paywall. `getFlowConfiguration` yöntemini kullanarak görünüm yapılandırmasını yükleyin. ```swift showLineNumbers guard flow.hasViewConfiguration else { // handle as remote config paywall return } let flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow) ``` Parametreler: | Parametre | Varlık | Açıklama | | :----------------------- | :------------- | :---------- | | **forFlow** | zorunlu | `Adapty.getFlow` aracılığıyla elde edilen bir `AdaptyFlow` nesnesi. | | **locale** |isteğe bağlı
varsayılan: `nil`
| [Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. `-` ile ayrılmış bir veya iki alt etiket içeren dil kodu olarak beklenir (örn. `en`, `pt-br`). Bkz. [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes). | | **loadTimeout** | varsayılan: 5 sn | Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür. Nadir durumlarda bu metod, arka planda farklı isteklerden oluşabileceğinden `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabilir. | | **products** | isteğe bağlı | Ekranda ürünlerin gösterim zamanlamasını optimize etmek için bir `AdaptyPaywallProduct` nesneleri dizisi sağlayın. `nil` geçilirse AdaptyUI gerekli ürünleri otomatik olarak getirir. | | **systemRequestsHandler** | isteğe bağlı | Flow aksiyonları tarafından tetiklenen sistem izni ve inceleme isteklerini yöneten, `AdaptySystemRequestsHandler` protokolüne uyan bir nesne. Yalnızca flow'unuz bu tür aksiyonlar içeriyorsa gereklidir. | | **assetsResolver** | isteğe bağlı | Flow/paywall içindeki resim ve videoları geçersiz kılan bir `[String: AdaptyCustomAsset]` sözlüğü. Bkz. [Varlıkları özelleştir](#customize-assets). | | **timerResolver** | isteğe bağlı | Geliştirici tanımlı zamanlayıcılar için bitiş tarihlerini sağlayan, `AdaptyTimerResolver` protokolüne uyan bir nesne. Bkz. [Geliştirici tanımlı zamanlayıcıları ayarla](#set-up-developer-defined-timers). | Yüklendikten sonra, [flow/paywall'ı gösterin](ios-present-paywalls). ## Varsayılan kitle için bir flow veya paywall alarak daha hızlı yükleme sağlayın \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle flow'lar ve paywall'lar neredeyse anında yüklenir, dolayısıyla bu süreci hızlandırmak için özel bir şey yapmanız gerekmez. Ancak çok sayıda kitle ve placement'ınız varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, bir flow veya paywall'ın yüklenmesi istediğinizden daha uzun sürebilir. Böyle durumlarda, hiçbir şey göstermek yerine pürüzsüz bir kullanıcı deneyimi sunmak amacıyla varsayılan bir flow veya paywall görüntülemek isteyebilirsiniz. Bu sorunu çözmek için, belirtilen placement'ın **All Users** kitlesi için flow veya paywall'ı getiren `getFlowForDefaultAudience` metodunu kullanabilirsiniz. Ancak, önerilen yaklaşımın `getFlow` metoduyla flow veya paywall getirmek olduğunu unutmamak önemlidir. Bu konuda yukarıdaki [Paywall Bilgilerini Getirme](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) bölümüne bakabilirsiniz. :::warning `getFlow` kullanmanızı neden öneriyoruz `getFlowForDefaultAudience` metodunun birkaç önemli dezavantajı vardır: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywall'lar göstermeniz gerekiyorsa bazı zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywall'lar tasarlamanız ya da mevcut (eski) sürüme sahip kullanıcıların render edilemeyen paywall'larla sorun yaşayabileceğini kabul etmeniz gerekecektir. - **Hedeflemenin kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'u görecektir; bu da ülkelere, pazarlama attribution'ına veya kendi özel özniteliklerinize dayalı kişiselleştirilmiş hedeflemeyi kaybetmeniz anlamına gelir. Bu dezavantajları göze alarak daha hızlı flow veya paywall yükleme avantajından yararlanmak istiyorsanız, `getFlowForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde [yukarıda](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) anlatılan `getFlow` metodunu kullanmaya devam edin. ::: ```swift showLineNumbers Adapty.getFlowForDefaultAudience(placementId: "YOUR_PLACEMENT_ID") { result in switch result { case let .success(flow): // the requested flow case let .failure(error): // handle the error } } ``` | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | [Placement](placements) tanımlayıcısı. Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en son verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum sırasında gereksiz ağ isteklerinden kaçınmak için önbelleği kullanmak güvenlidir.
Önbellek, uygulama yeniden başlatıldığında temizlenmez; yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel olarak temizlendiğinde sıfırlanır.
| ## Varlıkları özelleştirme \{#customize-assets\} Paywall/flow'unuzdaki görsel ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görseller ve videolar önceden tanımlanmış ID'lere sahiptir: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leri aracılığıyla hedefleyerek davranışlarını özelleştirebilirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID ayarlamanız](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video göster. - Uzaktan yüklenen ana görsel yüklenirken yerel bir önizleme görseli göster. - Video oynatılmadan önce bir önizleme görseli göster. - Oynatıcının video yüklenmeden önce düzen alanını ayırabilmesi için videonun piksel çözünürlüğünü belirt (en-boy oranı = `width / height`). Atlamak için `nil` geçir. Aşağıda, özel varlıkları basit bir sözlük aracılığıyla nasıl sağlayabileceğine dair bir örnek yer alıyor: ```swift showLineNumbers let customAssets: [String: AdaptyCustomAsset] = [ // Show a local image using a custom ID "custom_image": .image( .uiImage(value: UIImage(named: "image_name")!) ), // Show a local preview image while a remote main image is loading "hero_image": .image( .remote( url: URL(string: "https://example.com/image.jpg")!, preview: UIImage(named: "preview_image") ) ), // Show a local video with a preview image and a known resolution "hero_video": .video( .file( url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!, preview: .uiImage(value: UIImage(named: "video_preview")!), resolution: CGSize(width: 1080, height: 1920) ) ), ] let flowConfig = try await AdaptyUI.getFlowConfiguration( forFlow: flow, assetsResolver: customAssets ) ``` :::note Bir öğe bulunamazsa, paywall/flow varsayılan görünümüne geri döner. ::: ## Geliştirici tanımlı zamanlayıcıları ayarlama \{#set-up-developer-defined-timers\} Mobil uygulamanızda özel zamanlayıcılar kullanmak için `AdaptyTimerResolver` protokolünü uygulayan bir nesne oluşturun. Bu nesne, her özel zamanlayıcının nasıl render edileceğini tanımlar. İsterseniz bu protokole zaten uyan bir `[String: Date]` sözlüğünü doğrudan kullanabilirsiniz. İşte bir örnek: ```swift showLineNumbers @MainActor struct AdaptyTimerResolverImpl: AdaptyTimerResolver { func timerEndAtDate(for timerId: String) -> Date { switch timerId { case "CUSTOM_TIMER_6H": Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours case "CUSTOM_TIMER_NY": Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0) default: Date(timeIntervalSinceNow: 3600.0) // 1 hour } } } ``` Bu örnekte, `CUSTOM_TIMER_NY` ve `CUSTOM_TIMER_6H`, Adapty Kontrol Paneli'nde ayarladığınız geliştirici tanımlı zamanlayıcıların **Timer ID**'leridir. `timerResolver`, uygulamanızın her zamanlayıcıyı doğru değerle dinamik olarak güncellemesini sağlar. Örneğin: - `CUSTOM_TIMER_NY`: Zamanlayıcının bitiş anına, örneğin Yılbaşı'na kadar kalan süre. - `CUSTOM_TIMER_6H`: Kullanıcı paywall'ı açtığında başlayan 6 saatlik sürede kalan zaman.isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) kimliği. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil, ikincisi ise bölge içindir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için bkz. [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes).
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olması durumunda önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriyi almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbellekte veri varsa döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel veriyi almayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini azaltmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının kısıtlı olduğu durumlarda bile güvenilirliği sağlarken her zaman en güncel paywall sürümünü almanızı garanti etmek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
İşlemin arka planda farklı isteklerden oluşabileceği nadir durumlarda bu metodun `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :---------- | | Paywall | Ürün ID'lerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) nesnesi. | ## Paywall Builder ile tasarlanmış paywallın görünüm yapılandırmasını çekme \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall Builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse görünüm yapılandırması çekilemez. ::: Paywall'ı çektikten sonra, Paywall Builder kullanılarak oluşturulduğunu gösteren bir görünüm yapılandırması içerip içermediğini kontrol edin. Bu, paywall'ı nasıl göstereceğiniz konusunda size rehberlik eder. Görünüm yapılandırması mevcutsa Paywall Builder paywall'ı olarak ele alın; değilse [remote config paywall'ı olarak işleyin](present-remote-config-paywalls). Görünüm yapılandırmasını yüklemek için `getPaywallConfiguration` metodunu kullanın. ```swift showLineNumbers guard paywall.hasViewConfiguration else { // use your custom logic return } do { let paywallConfiguration = try await AdaptyUI.getPaywallConfiguration( forPaywall: paywall, products: products ) // use loaded configuration } catch { // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :----------------------- | :------------- | :---------- | | **paywall** | zorunlu | İstenen paywall için controller almak üzere kullanılan `AdaptyPaywall` nesnesi. | | **loadTimeout** | varsayılan: 5 sn | Bu metot için zaman aşımı sınırını belirler. Zaman aşımına ulaşıldığında önbelleğe alınmış veri veya yerel yedek döndürülür. İşlem arka planda birden fazla istekten oluşabileceğinden, bu metot nadir durumlarda `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabilir. | | **products** | isteğe bağlı | Ekranda ürünlerin görüntülenme süresini optimize etmek için `AdaptyPaywallProduct` nesnelerinden oluşan bir dizi sağlayın. `nil` geçilirse AdaptyUI gerekli ürünleri otomatik olarak getirir. | :::note Birden fazla dil kullanıyorsanız, [Paywall Builder yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi ve yerel ayar kodlarını doğru kullanmayı [burada](localizations-and-locale-codes) öğrenin. ::: Yüklendikten sonra [paywallı sunun](ios-present-paywalls). ## Daha hızlı getirmek için varsayılan kitle paywallını alma \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} Paywalllar genellikle neredeyse anında getirilir, bu nedenle bu süreci hızlandırmak konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve paywalliniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, paywall getirme işlemi istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç paywall göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın **All Users** kitlesine ait paywall'unu getiren `getPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Paywall Bilgisini Getirme](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) bölümünde ayrıntılı olarak açıklandığı gibi `getPaywall` metoduyla paywall getirmek olduğunu bilmek önemlidir. :::warning Neden `getPaywall` kullanmanızı öneriyoruz `getPaywallForDefaultAudience` metodunun birkaç önemli dezavantajı vardır: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywalllar göstermeniz gerekiyorsa zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywalllar tasarlamak zorunda kalırsınız ya da mevcut (eski) sürüme sahip kullanıcıların render edilmemiş paywalllarla sorun yaşamasını kabul etmek durumunda kalırsınız. - **Hedefleme kaybı**: Tüm kullanıcılar **Tüm Kullanıcılar** kitlesi için tasarlanmış aynı paywallı görür; bu da kişiselleştirilmiş hedeflemeyi (ülkelere, pazarlama attribution'ına veya kendi özel niteliklerinize göre) kaybetmeniz anlamına gelir. Daha hızlı paywall getirme avantajından yararlanmak için bu dezavantajları kabul etmeye hazırsanız, aşağıdaki gibi `getPaywallForDefaultAudience` metodunu kullanın. Aksi takdirde [yukarıda](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) açıklanan `getPaywall` metodunu tercih edin. ::: ```swift showLineNumbers Adapty.getPaywallForDefaultAudience(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in switch result { case let .success(paywall): // the requested paywall case let .failure(error): // handle the error } } ``` :::note `getPaywallForDefaultAudience` metodu iOS SDK 2.11.2 sürümünden itibaren kullanılabilir. ::: | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | [Placement](placements) kimliği. Bu, Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) kimliği. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil, ikincisi ise bölge içindir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması gerektiği hakkında daha fazla bilgi için bkz. [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes).
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olması durumunda önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriyi almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbellekte veri varsa döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel veriyi almayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini azaltmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
| ## Varlıkları özelleştirme \{#customize-assets\} Paywallınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görseller ve videolar önceden tanımlanmış ID'lere sahiptir: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leriyle hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video göstermek. - Uzak ana görsel yüklenirken yerel bir önizleme görseli göstermek. - Bir video başlamadan önce önizleme görseli göstermek. :::important Bu özelliği kullanmak için Adapty iOS SDK'yı 3.7.0 veya daha yüksek bir sürüme güncelleyin. ::: Özel varlıkları basit bir sözlük aracılığıyla nasıl sağlayabileceğinize dair bir örnek: ```swift showLineNumbers let customAssets: [String: AdaptyCustomAsset] = [ // Özel bir kimlik kullanarak yerel bir görsel göster "custom_image": .image( .uiImage(value: UIImage(named: "image_name")!) ), // Uzak ana görsel yüklenirken yerel bir önizleme görseli göster "hero_image": .image( .remote( url: URL(string: "https://example.com/image.jpg")!, preview: UIImage(named: "preview_image") ) ), // Önizleme görseli olan yerel bir video göster "hero_video": .video( .file( url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!, preview: .uiImage(value: UIImage(named: "video_preview")!) ) ), ] let paywallConfig = try await AdaptyUI.getPaywallConfiguration( forPaywall: paywall, assetsResolver: customAssets ) ``` :::note Bir varlık bulunamazsa paywall varsayılan görünümüne geri döner. ::: ## Geliştirici tanımlı zamanlayıcıları ayarlama \{#set-up-developer-defined-timers\} Mobil uygulamanızda özel zamanlayıcılar kullanmak için `AdaptyTimerResolver` protokolünü uygulayan bir nesne oluşturun. Bu nesne, her özel zamanlayıcının nasıl görüntüleneceğini tanımlar. Tercih ederseniz, bu protokole zaten uygun olduğu için doğrudan bir `[String: Date]` sözlüğü de kullanabilirsiniz. İşte bir örnek: ```swift showLineNumbers @MainActor struct AdaptyTimerResolverImpl: AdaptyTimerResolver { func timerEndAtDate(for timerId: String) -> Date { switch timerId { case "CUSTOM_TIMER_6H": Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 saat case "CUSTOM_TIMER_NY": Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0) default: Date(timeIntervalSinceNow: 3600.0) // 1 saat } } } ``` Bu örnekte, `CUSTOM_TIMER_NY` ve `CUSTOM_TIMER_6H`, Adapty Kontrol Paneli'nde ayarladığınız geliştirici tanımlı zamanlayıcıların **Timer ID**'leridir. `timerResolver`, uygulamanızın her zamanlayıcıyı doğru değerle dinamik olarak güncellemesini sağlar. Örneğin: - `CUSTOM_TIMER_NY`: Yılbaşı gibi zamanlayıcının bitiş anına kadar kalan süre. - `CUSTOM_TIMER_6H`: Kullanıcının paywall'ı açtığı andan itibaren başlayan 6 saatlik sürede kalan zaman.
## Paywall görüntüleme sayısı çok yüksek \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntüleme sayısı beklenen değerin iki katını gösteriyor.
**Neden**: Kodunuzda `logShowFlow` (iOS SDK v4+) / `logShowPaywall` çağırıyor olabilirsiniz. Paywall Builder veya Flow Builder kullanıyorsanız bu yöntem görüntüleme sayısını çiftler. Bu araçlarla oluşturulan flow'lar ve paywall'lar için analitikler otomatik olarak takip edilir, dolayısıyla bu yöntemi çağırmanıza gerek yoktur.
**Çözüm**: Paywall Builder veya Flow Builder kullanıyorsanız kodunuzda `logShowFlow` (iOS SDK v4+) / `logShowPaywall` çağırmadığınızdan emin olun.
## Diğer sorunlar \{#other-issues\}
**Sorun**: Yukarıda ele alınmayan başka Paywall Builder kaynaklı sorunlar yaşıyorsunuz.
**Çözüm**: Gerekirse [geçiş kılavuzlarını](ios-sdk-migration-guides) kullanarak SDK'yı en son sürüme güncelleyin. Pek çok sorun, SDK'nın daha yeni sürümlerinde çözülmüştür.
---
# File: ios-present-paywall-builder-paywalls-in-observer-mode
---
---
title: "iOS SDK'da Observer modunda Paywall Builder paywalllarını sunun"
description: "Daha iyi içgörüler için observer modunda PB paywalllarını nasıl sunacağınızı öğrenin."
---
Paywall Builder kullanarak bir paywall özelleştirdiyseniz, bunu kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render etmeniz gerekmez. Böyle bir paywall, hem neyin gösterileceğini hem de nasıl gösterileceğini içerir.
:::warning
Bu bölüm yalnızca [Observer mode](observer-vs-full-mode) için geçerlidir. Observer mode'da çalışmıyorsanız [iOS - Present Paywall Builder paywalls](ios-present-paywalls) sayfasına bakın.
:::
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın istikrarsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini azaltmak amacıyla oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırıldığında veya manuel temizleme yapıldığında temizlendiğini unutmayın.
Adapty SDK, flow'ları ve paywall'ları iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Ayrıca flow'ları ve paywall'ları daha hızlı getirmek için CDN, CDN'e ulaşılamadığında ise bağımsız bir yedek sunucu kullanırız.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun, `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| :::note v4'te `locale` parametresi `getFlow`'dan çıkarılarak `getFlowConfiguration`'a taşındı (yalnızca AdaptyUI ile render edilirken kullanılır). Özel paywalllar için tüm mevcut locale'ler `flow.remoteConfigs` içinde birlikte döndürülür; kullanıcının cihazıyla veya uygulamanızın ayarıyla eşleşen locale'i seçin. ::: Ürün ID'lerini doğrudan koda yazmayın! Flow'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zamanla değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız bu 2 ürünü göstermelidir. Ancak daha sonra 3 ürün gelirse, herhangi bir kod değişikliği gerektirmeden uygulamanız 3 ürünü de göstermelidir. Doğrudan koda yazmanız gereken tek şey placement ID'dir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Placement, tanımlayıcılar (`id`, `variationId`), ad, bir `remoteConfigs` dizisi (yapılandırılmış her locale için bir giriş) ve bir `hasViewConfiguration` bayrağı içeren `AdaptyFlow` nesnesi. Flow için ürünleri çekmek üzere `getPaywallProducts(flow:)` metodunu çağırın. | ## Ürünleri Getir \{#fetch-products\} Flow'u aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz:SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye ulaşmasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla sık karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en güncel veriye ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellendiğinden, ağ isteklerini azaltmak amacıyla oturum boyunca güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında korunduğunu, yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
|isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.
Örnek: `en` İngilizce anlamına gelir; `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve kullanım önerileri hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye ulaşmasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en güncel veriye her zaman ulaşamayabilir, ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum sırasında gereksiz ağ isteklerinden kaçınmak için güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywallları iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı çekmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanılır. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile paywalllarınızın en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metod, işlem arka planda farklı isteklerden oluşabileceğinden `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabilir.
| Ürün kimliklerini sabit kodlamayın! Paywall'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün getiriyorsanız, uygulamanız o 2 ürünü göstermelidir. Ancak daha sonra 3 ürün getirirseniz, herhangi bir kod değişikliği gerektirmeksizin uygulamanız 3 ürünü de göstermelidir. Sabit kodlamanız gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'leri listesi, paywall tanımlayıcısı, remote config ve diğer çeşitli özellikler içeren bir [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) nesnesi. | ## Ürünleri çekme \{#fetch-products\} Paywall'ı aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz:isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirme](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi bölgeyi belirtir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesi anlamına gelir.
Yerel ayar kodları ve kullanım önerileri hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığından bu seçeneği kullanmanızı öneririz.
Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en güncel veriye ulaşamayabilir, ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşar. Önbellek düzenli olarak güncellenir, bu nedenle oturum boyunca gereksiz ağ isteklerini önlemek amacıyla güvenle kullanılabilir.
Önbellek, uygulama yeniden başlatıldığında korunur; yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında sıfırlanır.
|İstek başarılıysa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile) nesnesi, kullanıcının uygulamadaki access level'ları, abonelikleri ve abonelik dışı satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Hâlâ Apple'ın StoreKit sürüm 2.0'ın altında ve Adapty SDK sürüm 2.9.0'ın altında bir sürüm kullanıyorsanız, bunun yerine [Apple App Store paylaşılan secret anahtarını](app-store-connection-configuration#step-5-enter-app-store-shared-secret) girmeniz gerekir. Bu yöntem Apple tarafından artık kullanımdan kaldırılmıştır. ::: ## App Store'dan uygulama içi satın almalar \{#in-app-purchases-from-the-app-store\} Bir kullanıcı App Store'da satın alma başlattığında ve işlem uygulamanıza taşındığında iki seçeneğiniz vardır: - **İşlemi hemen gerçekleştirin:** `shouldAddStorePayment` içinde `true` döndürün. Bu, Apple satın alma sistem ekranını hemen gösterir. - **Ürün nesnesini sonraki işlem için saklayın:** `shouldAddStorePayment` içinde `false` döndürün, ardından saklanan ürünle `makePurchase`'i daha sonra çağırın. Bu, satın almayı tetiklemeden önce kullanıcıya özel bir şey göstermeniz gerektiğinde işe yarar. Tam kod parçacığı şöyle: ```swift showLineNumbers title="Swift" final class YourAdaptyDelegateImplementation: AdaptyDelegate { nonisolated func shouldAddStorePayment(for product: AdaptyDeferredProduct) -> Bool { // 1a. // Return `true` to continue the transaction in your app. The Apple purchase system screen will show automatically. // 1b. // Store the product object and return `false` to defer or cancel the transaction. false } // 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate func continueDeferredPurchase() async { let storedProduct: AdaptyDeferredProduct = // get the product object from 1b. do { try await Adapty.makePurchase(product: storedProduct) } catch { // handle the error } } } ``` ## iOS'ta teklif kodlarını kullanma \{#redeem-offer-codes-in-ios\}Bir [`AdaptyProfile`](https://swift.adapty.io/documentation/adapty/adaptyprofile) nesnesi. Bu model, access level'lar, abonelikler ve abonelik dışı satın almalar hakkında bilgi içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level** durumunu kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: ios-transaction-management --- --- title: "iOS SDK'da gelişmiş işlem yönetimi" description: "Adapty SDK ile iOS uygulamanızda işlemleri manuel olarak tamamlayın." --- :::note Gelişmiş işlem yönetimi, Adapty iOS SDK'nın 3.12 sürümünden itibaren desteklenmektedir. ::: Adapty'deki gelişmiş işlem yönetimi, işlemlerin nasıl ele alındığı, doğrulandığı ve tamamlandığı üzerinde size daha fazla kontrol sağlar. Gelişmiş işlem yönetimi, birlikte çalışan üç isteğe bağlı özellik sunar: | Özellik | Amaç | |-------------------------------------------------------------|----------| | [`appAccountToken`](#assign-appaccounttoken) | Apple işlemlerini dahili kullanıcı kimliğinize bağlar | | [`jwsTransaction`](#access-the-jws-representation) | Doğrulama için Apple'ın imzalanmış işlem yükünü sağlar | | [Manuel tamamlama](#control-transaction-finishing-behavior) | İşlemleri yalnızca backend'iniz başarıyı onayladıktan sonra tamamlamanıza olanak tanır | Bu araçlar birlikte, Adapty işlemleri kendi backend'iyle senkronize etmeye devam ederken sağlam özel doğrulama akışları oluşturmanıza imkân verir. :::important Çoğu uygulamanın buna ihtiyacı yoktur. Varsayılan olarak Adapty, StoreKit işlemlerini otomatik olarak doğrular ve tamamlar. Bu kılavuzu yalnızca kendi backend doğrulamanızı çalıştırıyorsanız veya satın alma yaşam döngüsünü tamamen kontrol etmek istiyorsanız kullanın. ::: ## `appAccountToken` atama \{#assign-appaccounttoken\} [`appAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)), App Store işlemlerini dahili kullanıcı kimliğinize bağlamanızı sağlayan bir **UUID**'dir. StoreKit bu token'ı her işlemle ilişkilendirir; böylece backend'iniz App Store verilerini kullanıcılarınızla eşleştirebilir. Kullanıcı başına oluşturulan kararlı bir UUID kullanın ve aynı hesap için farklı cihazlarda da bu UUID'yi yeniden kullanın. Bu, satın almaların ve App Store bildirimlerinin doğru şekilde eşleştirilmesini sağlar. Token'ı iki farklı şekilde ayarlayabilirsiniz: SDK etkinleştirmesi sırasında veya kullanıcıyı tanımlarken. :::important `appAccountToken`'ı her zaman `customerUserId` ile birlikte geçirmeniz gerekir. Yalnızca token'ı geçerseniz işleme dahil edilmez. :::StoreKit 1 için: [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction) nesnesi.
StoreKit 2 için: [Transaction](https://developer.apple.com/documentation/storekit/transaction) nesnesi.
|phoneNumber
firstName
lastName
| String | | gender | Enum, izin verilen değerler: `female`, `male`, `other` | | birthday | Date | ### Özel kullanıcı özellikleri \{#custom-user-attributes\} Kendi özel özelliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanımıyla ilgilidir. Örneğin; fitness uygulamalarında haftalık egzersiz sayısı, dil öğrenme uygulamalarında kullanıcının bilgi düzeyi gibi. Bu özellikleri, hedefli paywall'lar ve teklifler oluşturmak için segmentlerde; hangi ürün metriklerinin geliri en çok etkilediğini anlamak için de analitikte kullanabilirsiniz. ```swift showLineNumbers do { builder = try builder.with(customAttribute: "value1", forKey: "key1") } catch { // handle key/value validation error } ``` Mevcut bir anahtarı kaldırmak için `.withRemoved(customAttributeForKey:)` metodunu kullanın: ```swift showLineNumbers do { builder = try builder.withRemoved(customAttributeForKey: "key2") } catch { // handle error } ``` Bazen daha önce hangi özel özelliklerin ayarlandığını öğrenmeniz gerekebilir. Bunun için `AdaptyProfile` nesnesinin `customAttributes` alanını kullanın. :::warning `customAttributes` değerinin güncel olmayabileceğini unutmayın; kullanıcı özellikleri farklı cihazlardan herhangi bir zamanda gönderilebileceğinden, sunucudaki özellikler son senkronizasyondan bu yana değişmiş olabilir. ::: ### Sınırlar \{#limits\} - Kullanıcı başına en fazla 30 özel özellik - Anahtar adları en fazla 30 karakter olabilir. Anahtar adı alfanümerik karakterler ve şu karakterlerden herhangi birini içerebilir: `_` `-` `.` - Değer, en fazla 50 karakter uzunluğunda bir string veya float olabilir. --- # File: subscription-status --- --- title: "iOS SDK'da abonelik durumunu kontrol etme" description: "Müşteri tutunumunu artırmak için Adapty'de kullanıcı abonelik durumunu takip edin ve yönetin." --- Adapty ile abonelik durumunu takip etmek çok kolaydır. Ürün kimliklerini kodunuza elle girmenize gerek yoktur. Bunun yerine, aktif bir [access level](access-level) olup olmadığını kontrol ederek kullanıcının abonelik durumunu zahmetsizce doğrulayabilirsiniz. Abonelik durumunu kontrol etmeye başlamadan önce [App Store Server Notifications](enable-app-store-server-notifications) ayarlarını yapın. ## Access level ve AdaptyProfile nesnesi \{#access-level-and-the-adaptyprofile-object\} Access level'lar, [AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile) nesnesinin özelliklerdir. Profili; uygulamanız başladığında, örneğin [bir kullanıcıyı tanımladığınızda](identifying-users#set-customer-user-id-on-configuration), alıp değişiklik olduğunda güncellemenizi öneririz. Bu sayede profil nesnesini defalarca istek atmadan kullanabilirsiniz. Profil güncellemelerinden haberdar olmak için, aşağıdaki [Abonelik durumu güncellemelerini dinleme](subscription-status#listening-for-subscription-status-updates) bölümünde açıklandığı gibi profil değişikliklerini dinleyin. :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Access level'ı sunucudan alma \{#retrieving-the-access-level-from-the-server\} Access level'ı sunucudan almak için `.getProfile()` metodunu kullanın:Bir [AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile) nesnesi. Genel olarak, kullanıcının uygulamaya premium erişimi olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu her zaman API'yi sorgulamaya çalıştığından en güncel sonucu döndürür. Herhangi bir nedenle (ör. internet bağlantısı yoksa) Adapty SDK sunucudan bilgi alamazsa, önbelleğe alınmış veriler döndürülür. Ayrıca Adapty SDK, `AdaptyProfile` önbelleğini düzenli aralıklarla güncelleyerek bu bilgilerin mümkün olduğunca güncel kalmasını sağlar.
| `.getProfile()` metodu size kullanıcı profilini döndürür; bu profil üzerinden access level durumunu öğrenebilirsiniz. Bir uygulamada birden fazla access level tanımlayabilirsiniz. Örneğin, bir gazete uygulamanız varsa ve farklı konulara bağımsız abonelikler satıyorsanız "sports" ve "science" adında access level'lar oluşturabilirsiniz. Ancak çoğu zaman yalnızca bir access level'a ihtiyaç duyarsınız; böyle durumlarda varsayılan "premium" access level'ı kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmek için bir örnek:isteğe bağlı
varsayılan: `en`
|Onboarding lokalizasyonunun tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenmektedir. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Dil kodları ve bunların nasıl kullanılması önerildiği hakkında daha fazla bilgi için [Lokalizasyonlar ve dil kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve hata durumunda önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriyi almasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla başa çıktığını düşünüyorsanız, önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel veriyi alamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süresi yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek amacıyla oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN ve CDN'e ulaşılamadığında bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en güncel sürümünü almanızı garanti etmek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadiren de olsa bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özellikler içeren bir [`AdaptyOnboarding`](https://swift.adapty.io/documentation/adapty/adaptyonboarding) nesnesi. | ## Varsayılan kitle onboarding'i ile onboarding getirmeyi hızlandır \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Genellikle onboarding'ler neredeyse anında getirilir, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve onboarding'iniz varken kullanıcılarınızın internet bağlantısı zayıfsa, onboarding getirme işlemi istediğinizden daha uzun sürebilir. Böyle durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak amacıyla varsayılan bir onboarding görüntülemek isteyebilirsiniz. Bu sorunu çözmek için, belirtilen placement'ın **All Users** kitlesi için onboarding'i getiren `getOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak, önerilen yaklaşımın yukarıdaki [Onboarding'i Getir](#fetch-onboarding) bölümünde açıklandığı gibi `getOnboarding` metoduyla onboarding getirmek olduğunu anlamak çok önemlidir. :::warning `getOnboardingForDefaultAudience` yerine `getOnboarding` kullanmayı düşünün; çünkü birincisinin önemli kısıtlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorunlar yaratabilir; ya geriye dönük uyumlu tasarımlar yapmanızı ya da eski sürümlerin yanlış görünebileceğini kabul etmenizi gerektirir. - **Kişiselleştirme yok**: Yalnızca "All Users" kitlesi için içerik gösterir; ülke, attribution veya özel özniteliklere dayalı hedeflemeyi ortadan kaldırır. Kullanım durumunuzda daha hızlı getirme bu dezavantajlardan daha önemliyse, aşağıda gösterildiği gibi `getOnboardingForDefaultAudience` kullanın. Aksi takdirde, [yukarıda](#fetch-onboarding) açıklandığı gibi `getOnboarding` kullanın. ::: ```swift showLineNumbers Adapty.getOnboardingForDefaultAudience(placementId: "YOUR_PLACEMENT_ID") { result in switch result { case let .success(onboarding): // the requested onboarding case let .failure(error): // handle the error } } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding lokalizasyonunun tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenmektedir. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Dil kodları ve bunların nasıl kullanılması önerildiği hakkında daha fazla bilgi için [Lokalizasyonlar ve dil kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve hata durumunda önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriyi almasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla başa çıktığını düşünüyorsanız, önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel veriyi alamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süresi yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek amacıyla oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN ve CDN'e ulaşılamadığında bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en güncel sürümünü almanızı garanti etmek için tasarlanmıştır.
| --- # File: ios-present-onboardings --- --- title: "iOS SDK'da onboardingları sunma" description: "iOS'ta dönüşümleri ve geliri artırmak için onboardingları nasıl sunacağınızı keşfedin." --- :::tip **SDK v4'ten itibaren**, onboarding'lere daha güçlü bir alternatif olarak [flow'lar](get-pb-paywalls) oluşturabilirsiniz. Onboarding'ler WebView içinde çalışırken, flow'lar cihazda yerel olarak render edilir; bu sayede daha akıcı animasyonlar, tutarlı bir iOS görünümü, daha hızlı yükleme süreleri ve WebView bağımlılığı ortadan kalkar. Başlamak için [Flow'ları ve paywall'ları edinme](get-pb-paywalls) ve [Flow'ları ve paywall'ları gösterme](ios-present-paywalls) sayfalarına göz atın. ::: Builder ile bir onboarding özelleştirdiyseniz, bunu kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render etmenize gerek yoktur. Böyle bir onboarding, hem onboarding içinde ne gösterileceğini hem de nasıl gösterileceğini içerir. Başlamadan önce şunları sağlayın: 1. [Adapty iOS SDK](sdk-installation-ios) 3.8.0 veya üzerini yüklemiş olun. 2. Bir [onboarding oluşturmuş](create-onboarding) olun. 3. Onboardingı bir [placement](placements)'a eklemiş olun. ## Swift'te onboardingları sunma \{#present-onboardings-in-swift\} Görsel onboardingı cihaz ekranında göstermek için şu adımları izleyin: 1. `.getOnboardingConfiguration` metodunu kullanarak onboarding görünüm yapılandırmasını alın. 2. Görüntülemek istediğiniz görsel onboardingı `.onboardingController` metodunu kullanarak başlatın: İstek parametreleri: | Parametre | Zorunluluk | Açıklama | |:--------------------------------|:-----------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **onboarding configuration** | zorunlu | Tüm onboarding özelliklerini içeren bir `AdaptyUI.OnboardingConfiguration` nesnesi. Bunu elde etmek için `AdaptyUI.getOnboardingConfiguration` metodunu kullanın. | | **delegate** | zorunlu | Onboarding olaylarını dinlemek için bir `AdaptyOnboardingControllerDelegate`. | Döndürür: | Nesne | Açıklama | |:-------------------------------|:--------------------------------------------------------| | **AdaptyOnboardingController** | İstenen onboarding ekranını temsil eden bir nesne | 3. Nesne başarıyla oluşturulduktan sonra cihaz ekranında görüntüleyebilirsiniz: ```swift showLineNumbers title="Swift" import Adapty import AdaptyUI // 0. Get an onboarding if you haven't done it yet let onboarding = try await Adapty.getOnboarding(placementId: "YOUR_PLACEMENT_ID") // 1. Obtain the onboarding view configuration: let configuration = try AdaptyUI.getOnboardingConfiguration(forOnboarding: onboarding) // 2. Create Onboarding View Controller let onboardingController = try AdaptyUI.onboardingController( with: configuration, delegate:
Bu ID'yi kodunuzda kullanarak özel bir eylem olarak işleyebilirsiniz. Örneğin, bir kullanıcı **Login** veya **Allow notifications** gibi özel bir düğmeye dokunduğunda, delegate metodu `onboardingController`, `.custom(id:)` durumuyla tetiklenir ve `actionId` parametresi builder'daki **Action ID**'dir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
```swift showLineNumbers
func onboardingController(_ controller: AdaptyOnboardingController, onCustomAction action: AdaptyOnboardingsCustomAction) {
if action.actionId == "allowNotifications" {
// Request notification permissions
}
}
func onboardingController(_ controller: AdaptyOnboardingController, didFailWithError error: AdaptyUIError) {
// Handle errors
}
```
:::important
Kullanıcı onboarding'i kapattığında ne olacağını siz yönetmeniz gerektiğini unutmayın. Örneğin, onboarding'in kendisini görüntülemeyi durdurmanız gerekir.
:::
Örneğin:
```swift showLineNumbers
func onboardingController(_ controller: AdaptyOnboardingController, onCloseAction action: AdaptyOnboardingsCloseAction) {
controller.dismiss(animated: true)
}
```
2. Abonelik grubu adına tıklayın. Ürünlerinizi **Subscriptions** bölümünde listelenmiş şekilde göreceksiniz.
3. Test ettiğiniz ürünün **Ready to Submit** olarak işaretlendiğinden emin olun. Değilse [App Store'daki Ürün](app-store-products) sayfasındaki talimatları izleyin.
4. Tablodaki ürün kimliğini Adapty Kontrol Paneli'ndeki [**Products**](https://app.adapty.io/products) sekmesindekiyle karşılaştırın. Kimlikler eşleşmiyorsa ürün kimliğini tablodan kopyalayın ve Adapty Kontrol Paneli'nde bu kimlikle [ürün oluşturun](create-product).
## Adım 3. Ürün kullanılabilirliğini kontrol edin \{#step-4-check-product-availability\}
1. **App Store Connect**'e geri dönün ve aynı **Subscriptions** bölümünü açın.
2. Ürünlerinizi görüntülemek için abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Availability** bölümüne inin ve gerekli tüm ülke ve bölgelerin listelendiğini doğrulayın.
## Adım 4. Ürün fiyatlarını kontrol edin \{#step-5-check-product-prices\}
1. **App Store Connect**'teki **Monetization** → **Subscriptions** bölümüne tekrar gidin.
2. Abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Subscription Pricing** bölümüne inin ve **Current Pricing for New Subscribers** kısmını genişletin.
5. Gerekli tüm fiyatların listelendiğinden emin olun.
## Adım 5. Uygulama ücretli durumunu, banka hesabını ve vergi formlarının aktif olduğunu kontrol edin \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. **[App Store Connect](https://appstoreconnect.apple.com/)** ana sayfasında **Business** seçeneğine tıklayın.
2. Şirket adınızı seçin.
3. Aşağı kaydırın ve **Paid Apps Agreement**, **Bank Account** ile **Tax forms** başlıklarının hepsinin **Active** olarak göründüğünü doğrulayın.
Bu adımları izleyerek `InvalidProductIdentifiers` uyarısını çözebilir ve ürünlerinizi mağazada yayınlayabilirsiniz.
## Adım 6. Ürün takıldıysa yeniden oluşturun \{#step-6-recreate-the-product-if-its-stuck\}
1–5 arası adımların tamamı başarıyla geçebilir — `Approved` durumu, eşleşen Bundle ID, geçerli API anahtarı — yine de SDK `1000 noProductIDsFound` hatası döndürmeye devam edebilir. Bu durumda ürün Apple'ın kayıt sisteminde takılı kalmış olabilir. Apple'ın ürün kayıt sistemi zaman zaman öyle bir duruma girer ki ürün App Store Connect arayüzünde görünür ama StoreKit arama yoluna açık değildir.
Ürünü App Store Connect'ten silin ve aynı ürün kimliğiyle yeniden oluşturun. Yayılmanın tamamlanması için yeniden oluşturmanın ardından 24 saate kadar bekleyin.
---
# File: cantMakePayments
---
---
title: "Code-1003 cantMakePayment hatasının çözümü"
description: "Adapty'de abonelikleri yönetirken ödeme yapılamıyor hatasını çözün."
---
1003 hatası, `cantMakePayments`, bu cihazda uygulama içi satın alımların yapılamayacağını belirtir.
`cantMakePayments` hatasıyla karşılaşıyorsanız, bu genellikle şu nedenlerden biriyle ilgilidir:
- Cihaz kısıtlamaları: Bu hata Adapty ile ilgili değildir. Aşağıdaki çözüm yollarına bakın.
- Observer mode yapılandırması: `makePurchase` metodu ve observer mode aynı anda kullanılamaz. Aşağıdaki bölüme bakın.
## Sorun: Cihaz kısıtlamaları \{#issue-device-restrictions\}
| Sorun | Çözüm |
|------------------------------|------------------------------------------------------------------------------------------------------------------------------|
| Ekran Süresi kısıtlamaları | [Ekran Süresi](https://support.apple.com/en-us/102470) ayarlarında Uygulama İçi Satın Alım kısıtlamalarını devre dışı bırakın |
| Hesap askıya alındı | Hesap sorunlarını çözmek için Apple Destek ile iletişime geçin |
| Bölgesel kısıtlamalar | Desteklenen bir bölgeden App Store hesabı kullanın |
## Sorun: Observer mode ve makePurchase'ı birlikte kullanmak \{#issue-using-both-observer-mode-and-makepurchase\}
Satın alımları yönetmek için `makePurchases` kullanıyorsanız Observer mode'u kullanmanıza gerek yoktur. [Observer mode](observer-vs-full-mode), yalnızca satın alma mantığını kendiniz uyguladığınızda gereklidir.
Dolayısıyla `makePurchase` kullanıyorsanız, SDK etkinleştirme kodundan Observer mode'u etkinleştiren kısmı güvenle kaldırabilirsiniz.
---
# File: migration-to-ios-sdk-v4
---
---
title: "Adapty iOS SDK'yı v4.0'a Geçirin"
description: "Adapty iOS SDK v4.0'a geçiş yapın: paywall API'lerini flow API'leriyle değiştirin; hem Flow Builder hem de Paywall Builder ile uyumludur."
---
Adapty iOS SDK 4.0, flow'ları tanıtır ve paywall API'lerini buna göre yeniden adlandırır. Yeni API'ler hem yeni Flow Builder hem de mevcut Paywall Builder ile çalışır — Adapty Kontrol Paneli tarafında herhangi bir kurulum değişikliği gerekmez.
## Hızlı referans \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.getPaywall(placementId:locale:)` | `Adapty.getFlow(placementId:)` |
| `AdaptyUI.getPaywallConfiguration(forPaywall:)` | `AdaptyUI.getFlowConfiguration(forFlow:locale:)` |
| `Adapty.getPaywallProducts(paywall:)` | `Adapty.getPaywallProducts(flow:)` |
| `Adapty.logShowPaywall(_:)` | `Adapty.logShowFlow(_:)` |
| `AdaptyPaywallController` | `AdaptyFlowController` |
| `AdaptyPaywallControllerDelegate` | `AdaptyFlowControllerDelegate` |
| `AdaptyUI.paywallController(with:delegate:)` | `AdaptyUI.flowController(with:delegate:)` |
| `.paywall()` (SwiftUI modifier) | `.flow()` |
| `AdaptyPaywallView` | `AdaptyFlowView` |
| `didFailRenderingWith:` / `didFailRendering:` | `didReceiveError:` |
| `didFinishPurchase` (isteğe bağlı, başarıda otomatik kapanır) | `didFinishPurchase` (zorunlu, otomatik kapanma yok) |
| `Adapty_KidsMode` / `AdaptyUI_KidsMode` paket ürünleri | `KidsMode` paket trait'i |
| `Adapty.updateAttribution(_:source:)` (`source: String`) | `Adapty.updateAttribution(_:source:)` (`source: AdaptyAttributionSource`) |
| `Adapty.setIntegrationIdentifier(key:value:)` | `Adapty.setIntegrationIdentifier(_:)` (`AdaptyIntegrationIdentifier`) |
## Minimum iOS sürümü \{#minimum-ios-version\}
Adapty iOS SDK 4.0, minimum deployment target'ı iOS 13.0'dan **iOS 15.0**'a yükseltiyor. Yükseltmeden önce projenizin iOS Deployment Target'ını 15.0 veya üzerine ayarlayın.
## Kurulum: CocoaPods artık desteklenmiyor \{#installation-cocoapods-no-longer-supported\}
Adapty iOS SDK 4.0, CocoaPods desteğini kaldırdı. SDK'yı [Swift Package Manager](sdk-installation-ios#install-adapty-sdk) ile yükleyin.
Projeniz hâlâ CocoaPods kullanıyorsa `Podfile` dosyanızdan `Adapty` ve `AdaptyUI` pod'larını kaldırın, `pod install` çalıştırarak temizleyin, ardından Xcode'da **File → Add Package Dependency** seçeneğiyle `https://github.com/adaptyteam/AdaptySDK-iOS.git` adresini kullanarak paketi ekleyin.
## Kids Mode: ayrı ürünler bir paket özelliğiyle değiştirildi \{#kids-mode-separate-products-replaced-by-a-package-trait\}
v3'te, [Kids Mode](kids-mode)'u etkinleştirmek için ayrı **Adapty_KidsMode** ve **AdaptyUI_KidsMode** paket ürünlerini seçiyor ve importlarınızı yeniden adlandırıyordunuz. v4.0'da bu ürünler kaldırıldı. Kids Mode artık normal Adapty paketinde `KidsMode` adlı bir Swift paket özelliği — etkinleştirildiğinde IDFA ve AdSupport'u tüm SDK genelinde derlemenin dışında bırakır.
Geçiş yapmak için:
1. **Choose Package Products** penceresinde, **Adapty_KidsMode** ve **AdaptyUI_KidsMode** yerine normal **Adapty** ve **AdaptyUI** ürünlerini seçin.
2. `KidsMode` trait'ini etkinleştirin. Xcode 26.4 veya sonraki bir sürümde, projenizin **Package Dependencies** görünümünde AdaptySDK-iOS bağımlılığı için etkinleştirin. Adapty'yi `Package.swift` içine bağımlılık olarak ekliyorsanız (`swift-tools-version` 6.1 veya sonrası gereklidir), orada etkinleştirin:
```swift showLineNumbers title="Package.swift"
.package(
url: "https://github.com/adaptyteam/AdaptySDK-iOS.git",
from: "4.0.0",
traits: ["KidsMode"]
)
```
3. Import'larınızı tekrar normal modüllere geri alın:
```diff showLineNumbers
- import Adapty_KidsMode
- import AdaptyUI_KidsMode
+ import Adapty
+ import AdaptyUI
```
:::note
26.4'ten eski Xcode sürümleri, bir Xcode projesinde trait'leri arayüzden etkinleştiremez. Bu durumda, `KidsMode` trait'i etkin şekilde Adapty'ye bağımlı küçük bir yerel Swift paketi oluşturun ve uygulama hedefinizi bu pakete bağımlı yapın.
:::
## Kaldırılan API'ler \{#removed-apis\}
- **`Adapty.getPaywallProductsWithoutDeterminingOffer(paywall:)`** — kaldırıldı. Artık tüm ürünler teklif bilgisini içerdiğinden, ayrı bir uygunluk kontrolü adımına gerek kalmadı.
- **`AdaptyPaywallProductWithoutDeterminingOffer`** — kaldırıldı. Daha önce bu türü (örneğin `didSelectProduct` gibi) callback'lere geçiren yapılar artık `AdaptyPaywallProduct` kullanıyor.
## App Store tanıtılan uygulama içi satın almalar geçici olarak kaldırıldı \{#app-store-promoted-in-app-purchases-temporarily-removed\}
StoreKit 2 geçişinin bir parçası olarak, Adapty iOS SDK 4.0, App Store tanıtılan uygulama içi satın almalar için desteği kaldırdı. `shouldAddStorePayment(for:)` delegate metodu ve aldığı `AdaptyDeferredProduct` türü 4.0'da kullanılamamaktadır.
:::warning
Bu kaldırma işlemi geçicidir — tanıtılan uygulama içi satın alma desteği daha sonraki bir 4.x sürümünde geri dönecektir. Uygulamanız tanıtılan uygulama içi satın almalara dayanıyorsa, destek geri dönene kadar iOS SDK 3.x sürümünde kalmaya devam edin.
:::
## Paywall'ları Getirme \{#fetching-paywalls\}
### getPaywall + getPaywallConfiguration → getFlow + getFlowConfiguration
Döndürülen türler `AdaptyPaywall` / `AdaptyUI.PaywallConfiguration` yerine `AdaptyFlow` / `AdaptyUI.FlowConfiguration` olarak değişiyor. `locale` parametresi fetch çağrısından çıkarılıp `getFlowConfiguration` üzerine taşınıyor:
```diff showLineNumbers
- let paywall = try await Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en")
- let paywallConfiguration = try await AdaptyUI.getPaywallConfiguration(forPaywall: paywall)
+ let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID")
+ let flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow, locale: "en")
```
### getPaywallProducts(paywall:) → getPaywallProducts(flow:)
`getPaywallProducts` artık `Adapty.getFlow` tarafından döndürülen bir `AdaptyFlow` alıyor:
```diff showLineNumbers
- let products = try await Adapty.getPaywallProducts(paywall: paywall)
+ let products = try await Adapty.getPaywallProducts(flow: flow)
```
## Paywall görüntülemelerini takip etme \{#tracking-paywall-views\}
### logShowPaywall(_:) → logShowFlow(_:)
`logShowPaywall`, `logShowFlow` olarak yeniden adlandırıldı ve artık `AdaptyPaywall` yerine `AdaptyFlow` alıyor. Olay hâlâ aynı varyasyona karşı kaydedildiği için mevcut dönüşüm hunisi ve A/B testi metrikleri kontrol panelinde herhangi bir değişiklik yapılmadan çalışmaya devam eder.
```diff showLineNumbers
- try await Adapty.logShowPaywall(paywall)
+ try await Adapty.logShowFlow(flow)
```
v3'te olduğu gibi, [Flow Builder](adapty-flow-builder) veya [Paywall Builder](adapty-paywall-builder) tarafından oluşturulan flow veya paywall'ları görüntülerken bu metodu çağırmanız gerekmez — Adapty bu görüntülemeleri otomatik olarak takip eder.
## didFinishPurchase artık zorunlu \{#didfinishpurchase-is-now-required\}
v3'te `didFinishPurchase` isteğe bağlıydı: uygulamamanız durumunda, başarılı bir satın alma işleminin ardından paywall kendiliğinden kapanıyordu. v4.0'da bu varsayılan otomatik kapanma davranışı kaldırıldı; böylece başarılı bir satın alma işleminin ardından flow devam edebilir — örneğin flow'unuzun geri kalan ekranlarını göstermek için. Satın alma işleminin ardından ne olacağına artık siz karar veriyorsunuz: ekranı kapatın ya da flow'un devam etmesine izin vermek için hiçbir şey yapmayın.
- **UIKit**: `AdaptyFlowControllerDelegate` uyumluları artık `didFinishPurchase` metodunu uygulamak zorundadır — bu metodun artık varsayılan bir implementasyonu yoktur.
- **SwiftUI**: `.flow(...)` ve `AdaptyFlowView(...)` içindeki `didFinishPurchase` closure'ı artık zorunludur (non-optional); bu durum `didFailPurchase` ve `didFinishRestore` ile tutarlı hale getirilmiştir.
v3 davranışını korumak için ekranı kendiniz kapatın:
```swift showLineNumbers title="Swift"
func flowController(
_ controller: AdaptyFlowController,
didFinishPurchase product: AdaptyPaywallProduct,
purchaseResult: AdaptyPurchaseResult
) {
if !purchaseResult.isPurchaseCancelled {
controller.dismiss(animated: true)
}
}
```
## UIKit \{#uikit\}
### AdaptyPaywallController → AdaptyFlowController
Kontrolcü türünü ve fabrika metodunu yeniden adlandırın:
```diff showLineNumbers
- let controller = try AdaptyUI.paywallController(
- with: paywallConfiguration,
- delegate: self
- )
+ let controller = try AdaptyUI.flowController(
+ with: flowConfiguration,
+ delegate: self
+ )
```
### AdaptyPaywallControllerDelegate → AdaptyFlowControllerDelegate
Protokolü yeniden adlandırın ve her metot imzasını güncelleyin. `didSelectProduct` artık kaldırılan `AdaptyPaywallProductWithoutDeterminingOffer` yerine `AdaptyPaywallProduct` alıyor; `didFinishPurchase` ise [artık zorunlu olarak uygulanmalıdır](#didfinishpurchase-is-now-required) — varsayılan bir implementasyonu kalmadı.
```diff showLineNumbers
- class YourClass: AdaptyPaywallControllerDelegate {
+ class YourClass: AdaptyFlowControllerDelegate {
- func paywallControllerDidAppear(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidAppear(_ controller: AdaptyFlowController) { }
- func paywallControllerDidDisappear(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidDisappear(_ controller: AdaptyFlowController) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didPerform action: AdaptyUI.Action) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didPerform action: AdaptyUI.Action) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didSelectProduct product: AdaptyPaywallProductWithoutDeterminingOffer) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didSelectProduct product: AdaptyPaywallProduct) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didStartPurchase product: AdaptyPaywallProduct) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didStartPurchase product: AdaptyPaywallProduct) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishPurchase product: AdaptyPaywallProduct,
- purchaseResult: AdaptyPurchaseResult) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishPurchase product: AdaptyPaywallProduct,
+ purchaseResult: AdaptyPurchaseResult) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailPurchase product: AdaptyPaywallProduct,
- error: AdaptyError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailPurchase product: AdaptyPaywallProduct,
+ error: AdaptyError) { }
- func paywallControllerDidStartRestore(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidStartRestore(_ controller: AdaptyFlowController) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishRestoreWith profile: AdaptyProfile) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishRestoreWith profile: AdaptyProfile) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailRestoreWith error: AdaptyError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailRestoreWith error: AdaptyError) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailRenderingWith error: AdaptyUIError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didReceiveError error: AdaptyUIError) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailLoadingProductsWith error: AdaptyError) -> Bool { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailLoadingProductsWith error: AdaptyError) -> Bool { }
- func paywallController(_ controller: AdaptyPaywallController,
- didPartiallyLoadProducts failedIds: [String]) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didPartiallyLoadProducts failedIds: [String]) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishWebPaymentNavigation product: AdaptyPaywallProduct?,
- error: AdaptyError?) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishWebPaymentNavigation product: AdaptyPaywallProduct?,
+ error: AdaptyError?) { }
}
```
## SwiftUI \{#swiftui\}
### .paywall() modifier → .flow() \{#paywall-modifier--flow\}
Modifier adını değiştirin, yapılandırma parametre adını güncelleyin ve [artık zorunlu olan](#didfinishpurchase-is-now-required) `didFinishPurchase` closure'ını ekleyin:
```diff showLineNumbers
@State var flowPresented = false // rename freely — the variable name is your choice
var body: some View {
Text("Hello, AdaptyUI!")
- .paywall(
+ .flow(
isPresented: $flowPresented,
- paywallConfiguration: paywallConfiguration,
+ flowConfiguration: flowConfiguration,
+ didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
didFailPurchase: { product, error in /* handle the error */ },
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
- didFailRendering: { error in flowPresented = false }
+ didReceiveError: { error in flowPresented = false }
)
}
```
Yeniden adlandırılan callback, `didFailRendering`'in tetiklendiği tüm render hatalarında olduğu gibi, flow script'inden gelen yeni çalışma zamanı hatalarında da (`AdaptyUIError` kodu `4105` — `.jsException` olan JavaScript istisnaları) tetiklenir. Mevcut handler gövdelerinde kod değişikliği gerekmez — yalnızca parametreyi yeniden adlandırın.
### AdaptyPaywallView → AdaptyFlowView
Görünümü yeniden adlandırın, yapılandırma parametresini güncelleyin, [artık zorunlu olan](#didfinishpurchase-is-now-required) `didFinishPurchase` closure'ını ekleyin ve varsa `didSelectProduct` closure'ını güncelleyin — artık kaldırılan `AdaptyPaywallProductWithoutDeterminingOffer` yerine `AdaptyPaywallProduct` alıyor:
```diff showLineNumbers
- AdaptyPaywallView(
- paywallConfiguration: paywallConfiguration,
- didSelectProduct: { product: AdaptyPaywallProductWithoutDeterminingOffer in /* handle */ },
+ AdaptyFlowView(
+ flowConfiguration: flowConfiguration,
+ didSelectProduct: { product: AdaptyPaywallProduct in /* handle */ },
+ didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
didFailPurchase: { product, error in /* handle the error */ },
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
- didFailRendering: { error in /* handle the error */ }
+ didReceiveError: { error in /* handle the error */ }
)
```
## AdaptyUI özel varlıklar \{#adaptyui-custom-assets\}
### AdaptyUICustomVideoAsset
Mevcut her çağrı noktasını etkileyen iki değişiklik:
- `.player` artık `AVQueuePlayer` yerine `AVPlayer` alıyor.
- Her case'e sonda `resolution: CGSize?` parametresi eklendi. Mevcut davranışı korumak için `nil` geçin ya da video yüklenmeden önce yerleşim alanını ayırt etmesi (en-boy oranı = `width / height`) için gerçek piksel boyutunu belirtin.
```diff showLineNumbers
- case file(url: URL, preview: AdaptyUICustomImageAsset?)
- case remote(url: URL, preview: AdaptyUICustomImageAsset?)
- case player(item: AVPlayerItem, player: AVQueuePlayer, preview: AdaptyUICustomImageAsset?)
+ case file(url: URL, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
+ case remote(url: URL, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
+ case player(item: AVPlayerItem, player: AVPlayer, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
```
## Attribution ve entegrasyon tanımlayıcıları \{#attribution-and-integration-identifiers\}
### updateAttribution(_:source:)
`source` parametresi `String` yerine yeni `AdaptyAttributionSource` türünü kullanıyor; daha önce iç içe olan `AdaptyProfile.AttributionSource` ise üst düzey `AdaptyAttributionSource` olarak yeniden adlandırıldı. Önceden tanımlanmış kaynaklardan birini kullanabilir ya da başka bir kaynak için string literal geçirebilirsiniz — `AdaptyAttributionSource`, `ExpressibleByStringLiteral` protokolüne uyduğundan mevcut string literal çağrıları derlemeye devam eder.
```diff showLineNumbers
- try await Adapty.updateAttribution(attribution, source: "adjust")
+ try await Adapty.updateAttribution(attribution, source: .adjust)
```
Önceden tanımlanmış kaynaklar: `.appleAds`, `.adjust`, `.appsflyer`, `.branch`, `.tenjin`. Kaynağı bir `String` değişkeninde tutuyorsanız şu şekilde sarmalayın: `AdaptyAttributionSource(rawValue: yourSource)`.
### setIntegrationIdentifier(_:)
`setIntegrationIdentifier(key:value:)`, bir veya daha fazla `AdaptyIntegrationIdentifier` değeri alan değişken sayıda parametre kabul eden bir metotla değiştirildi. Ham string anahtarlar yerine önceden tanımlanmış fabrika metotlarını kullanın:
```diff showLineNumbers
- try await Adapty.setIntegrationIdentifier(key: "appsflyer_id", value: uid)
+ try await Adapty.setIntegrationIdentifier(.appsflyerId(uid))
```
Tek bir çağrıda birden fazla tanımlayıcı ayarlayabilirsiniz:
```swift showLineNumbers
try await Adapty.setIntegrationIdentifier(
.appsflyerId(uid),
.adjustDeviceId(adid)
)
```
Her eski anahtar dizesini fabrika metoduyla değiştirin:
| v3 anahtarı | v4 factory |
|---|---|
| `"adjust_device_id"` | `.adjustDeviceId(_:)` |
| `"airbridge_device_id"` | `.airbridgeDeviceId(_:)` |
| `"amplitude_user_id"` | `.amplitudeUserId(_:)` |
| `"amplitude_device_id"` | `.amplitudeDeviceId(_:)` |
| `"appmetrica_device_id"` | `.appmetricaDeviceId(_:)` |
| `"appmetrica_profile_id"` | `.appmetricaProfileId(_:)` |
| `"appsflyer_id"` | `.appsflyerId(_:)` |
| `"branch_id"` | `.branchId(_:)` |
| `"facebook_anonymous_id"` | `.facebookAnonymousId(_:)` |
| `"firebase_app_instance_id"` | `.firebaseAppInstanceId(_:)` |
| `"mixpanel_user_id"` | `.mixpanelUserId(_:)` |
| `"one_signal_subscription_id"` | `.oneSignalSubscriptionId(_:)` |
| `"one_signal_player_id"` | `.oneSignalPlayerId(_:)` |
| `"posthog_distinct_user_id"` | `.posthogDistinctUserId(_:)` |
| `"pushwoosh_hwid"` | `.pushwooshHWID(_:)` |
| `"tenjin_analytics_installation_id"` | `.tenjinAnalyticsInstallationId(_:)` |
---
# File: migration-to-ios-315
---
---
title: "Adapty iOS SDK'yı v3.15'e Geçirin"
description: "Daha iyi performans ve yeni monetizasyon özellikleri için Adapty iOS SDK v3.15'e geçin."
---
[Paywall Builder](adapty-paywall-builder)'ı [Observer mode](observer-vs-full-mode)'da kullanıyorsanız, iOS SDK 3.15'ten itibaren yeni bir `observerModeDidInitiateRestorePurchases(onStartRestore:onFinishRestore:)` metodu uygulamanız gerekiyor. Bu metot, satın alma işlemlerini geri yükleme mantığı üzerinde daha fazla kontrol sağlayarak bunları kendi özel flow'unuzda yönetmenize olanak tanır. Tam uygulama ayrıntıları için [Observer mode'da Paywall Builder paywall'larını sunma](ios-present-paywall-builder-paywalls-in-observer-mode) sayfasına bakın.
```diff showLineNumbers
func observerMode(didInitiatePurchase product: AdaptyPaywallProduct,
onStartPurchase: @escaping () -> Void,
onFinishPurchase: @escaping () -> Void) {
// use the product object to handle the purchase
// use the onStartPurchase and onFinishPurchase callbacks to notify AdaptyUI about the process of the purchase
}
+ func observerModeDidInitiateRestorePurchases(onStartRestore: @escaping () -> Void,
+ onFinishRestore: @escaping () -> Void) {
+ // use the onStartRestore and onFinishRestore callbacks to notify AdaptyUI about the process of the restore
+ }
```
---
# File: migration-to-ios-sdk-34
---
---
title: "Adapty iOS SDK'yı v3.4'e Taşıma"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty iOS SDK v3.4'e geçiş yapın."
---
Adapty SDK 3.4.0, büyük bir sürümdür ve sizin tarafınızda geçiş adımları gerektiren iyileştirmeler içermektedir.
## Adapty SDK aktivasyonunu güncelleme \{#update-adapty-sdk-activation\}
### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin, uygulamanıza giriş yaptıktan veya kayıt olduktan sonra), customer user ID'lerini ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty onu otomatik olarak mevcut profille ilişkilendirir.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı ID'leri her kullanıcı için benzersiz olmalıdır. Parametreye sabit bir değer girerseniz, tüm kullanıcılar tek bir kullanıcı olarak değerlendirilir.
:::
`identify` tamamlanmadan (yani `onSuccess` callback'i tetiklenmeden) başka SDK metotlarını çağırmayın. Eş zamanlı çağrılar anonim profile yönlenebilir. Bkz. [Kotlin Multiplatform SDK'da çağrı sırası](kmp-sdk-call-order).
```kotlin showLineNumbers
Adapty.identify("YOUR_USER_ID") // Her kullanıcı için benzersiz
.onSuccess {
// successful identify
}
.onError { error ->
// handle the error
}
```
### SDK etkinleştirmesi sırasında \{#during-the-sdk-activation\}
SDK'yı etkinleştirdiğinizde zaten bir customer user ID biliyorsanız, `identify` çağrısını ayrıca yapmak yerine `activate` metodunda gönderebilirsiniz.
Customer user ID'yi bilmenize rağmen onu yalnızca etkinleştirmeden sonra ayarlıyorsanız, bu, etkinleştirme sırasında Adapty'nin yeni bir anonim profil oluşturacağı ve `identify` çağrısından sonra mevcut profile geçeceği anlamına gelir.
Mevcut bir customer user ID (daha önce kullandığınız) veya yeni bir tane iletebilirsiniz. Yeni bir tane iletirseniz, etkinleştirme sırasında oluşturulan yeni profil otomatik olarak customer user ID ile ilişkilendirilir.
:::note
Varsayılan olarak, anonim profil oluşturmak analitik panolarını etkilemez çünkü yüklemeler cihaz ID'lerine göre sayılır.
Cihaz ID'si, uygulamanın mağazadan bir cihaza tek bir yüklemesini temsil eder ve yalnızca uygulama yeniden yüklendikten sonra yeniden oluşturulur.
Bunun ilk mi yoksa tekrarlanan bir yükleme mi olduğuna ya da mevcut bir customer user ID kullanılıp kullanılmadığına bağlı değildir.
Profil oluşturma (SDK etkinleştirildiğinde veya çıkış yapıldığında), giriş yapma veya uygulamayı yeniden yüklemeden güncelleme ek yükleme olayları oluşturmaz.
Yüklemeleri cihazlar yerine benzersiz kullanıcılara göre saymak istiyorsanız **App settings** bölümüne gidin ve [**Installs definition for analytics**](general#4-installs-definition-for-analytics) ayarını yapılandırın.
:::
```kotlin showLineNumbers
AdaptyConfig.Builder("PUBLIC_SDK_KEY")
.withCustomerUserId("user123") // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
.build()
```
### Kullanıcıları çıkış yaptırma \{#log-users-out\}
Kullanıcıları çıkış yaptırmak için bir butonunuz varsa `logout` metodunu kullanın.
:::important
Kullanıcıları çıkış yaptırmak, kullanıcı için yeni bir anonim profil oluşturur.
:::
```kotlin showLineNumbers
Adapty.logout()
.onSuccess {
// successful logout
}
.onError { error ->
// handle the error
}
```
:::info
Kullanıcıları uygulamaya tekrar giriş yaptırmak için `identify` metodunu kullanın.
:::
### Giriş yapmadan satın almaya izin verme \{#allow-purchases-without-login\}
Kullanıcılarınız uygulamanıza giriş yapmadan önce ve sonra satın alım yapabiliyorsa, giriş yaptıktan sonra erişimlerini koruyacaklarından emin olmanız gerekir:
1. Çıkış yapmış bir kullanıcı satın alım yaptığında Adapty bunu anonim profil ID'siyle ilişkilendirir.
2. Kullanıcı hesabına giriş yaptığında Adapty, tanımlanmış profiliyle çalışmaya geçer.
- Yeni bir customer user ID ise (örneğin satın alım kayıt öncesinde yapılmışsa), Adapty customer user ID'yi mevcut profille ilişkilendirir; böylece tüm satın alma geçmişi korunur.
- Mevcut bir customer user ID ise (customer user ID zaten bir profille bağlantılıysa), profil değişiminden sonra gerçek access level'ı almanız gerekir. Tanımlama işleminden hemen sonra [`getProfile`](kmp-check-subscription-status) çağırabilir ya da veriler otomatik senkronize olsun diye [profil güncellemelerini dinleyebilirsiniz](kmp-check-subscription-status).
## Sonraki adımlar \{#next-steps\}
Tebrikler! Uygulamanıza uygulama içi ödeme mantığını eklediniz! Uygulama monetizasyonunuzda başarılar diliyoruz!
Adapty'den daha fazla yararlanmak için şu konuları inceleyebilirsiniz:
- [**Test etme**](troubleshooting-test-purchases): Her şeyin beklendiği gibi çalıştığından emin olun
- [**Entegrasyonlar**](configuration): Tek satır kodla pazarlama attribution ve analitik servisleriyle entegre olun
- [**Özel profil özellikleri ayarlama**](kmp-setting-user-attributes): Kullanıcı profillerine özel özellikler ekleyin ve segment'ler oluşturun; böylece A/B testi başlatabilir veya farklı kullanıcılara farklı paywall'lar gösterebilirsiniz
---
# File: adapty-sdk-integration-skill-kmp
---
---
title: "SDK entegrasyon becerisini kullanarak Adapty'yi Kotlin Multiplatform uygulamanıza entegre edin"
description: "Adapty SDK'yı Kotlin Multiplatform uygulamanıza uçtan uca entegre etmek için yapay zeka kodlama aracınızla adapty-sdk-integration becerisini kullanın."
---
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en son verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellendiğinden, oturum sırasında gereksiz ağ isteklerini önlemek amacıyla kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında temizlendiğini unutmayın.
Adapty SDK, flow'ları ve paywall'ları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Ayrıca daha hızlı yükleme için CDN, CDN'e ulaşılamadığında ise bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman en son sürümü almanızı garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
İşlemin arka planda farklı isteklerden oluşabileceği göz önünde bulundurulduğunda, nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın.
Kotlin Multiplatform için: `Duration` nesnesini `5.seconds` gibi uzantı fonksiyonlarıyla oluşturabilirsiniz; burada `.seconds`, `kotlin.time.Duration.Companion.seconds` kaynağından gelir.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :---------- | | Flow | Placement'ı, tanımlayıcıları (`instanceIdentity`, `variationId`), adı, paywall varyasyonlarını (`paywalls` — `AdaptyFlowPaywall` listesi) ve remote config'leri (`remoteConfigs` — her locale için bir girdi içeren liste) barındıran `AdaptyFlow` nesnesi. Ön yükleme, özel arayüz veya programatik kontroller için gerçek ürünleri getirmek istiyorsanız `getPaywallProducts(flow)` metodunu çağırın. | ## View yapılandırmasını getir \{#fetch-the-view-configuration\} Flow veya paywall'ı getirdikten sonra, `createFlowView` metoduyla view yapılandırmasını yükleyin ve view'ı tek adımda oluşturun. Kontrol etmeniz gereken ayrı bir bayrak yoktur: placement **Flow Builder**'da (flow) veya **Paywall Builder**'da (paywall) tasarlanmışsa, `createFlowView` sunuma hazır view'ı döndürür. Placement, Builder arayüzü olmayan özel bir paywall ise `createFlowView` bir `AdaptyResult.Error` döndürür — [bunu remote config paywall olarak ele alın](present-remote-config-paywalls-kmp). :::important Flow Builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse, görünüm yapılandırması alınamaz. ::: ```kotlin showLineNumbers AdaptyUI.createFlowView( flow = flow, loadTimeout = 5.seconds, preloadProducts = true ).onSuccess { view -> // use view }.onError { error -> // the flow has no view configured, or view creation failed } ``` | Parametre | Zorunluluk | Açıklama | | :--------------------------- | :------------- | :----------------------------------------------------------- | | **flow** | zorunlu | `Adapty.getFlow` aracılığıyla elde edilen bir `AdaptyFlow` nesnesi. | | **loadTimeout** | isteğe bağlı | Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa, önbelleğe alınmış veriler veya yerel yedek döndürülür. Nadir durumlarda bu metod, `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabilir; çünkü işlem arka planda farklı isteklerden oluşabilir. `kotlin.time.Duration.Companion` paketinden `5.seconds` gibi uzantı fonksiyonlarını kullanabilirsiniz. | | **preloadProducts** | isteğe bağlı | Daha iyi performans için ürünleri önceden yüklemek üzere `true` olarak ayarlayın. Etkinleştirildiğinde, ürünler önceden yüklenerek flow veya paywall'ın görüntülenmesi için gereken süre azaltılır. | | **productPurchaseParameters** | isteğe bağlı | [`AdaptyProductIdentifier`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-product-identifier/) ile [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/) arasındaki bir eşleme. Flow veya paywall'daki bireysel ürünler için kişiselleştirilmiş teklifler veya abonelik güncelleme parametreleri gibi satın alma'ya özgü parametreleri yapılandırmak için kullanın. | :::note Birden fazla dil kullanıyorsanız, [Builder yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi öğrenin. ::: Yüklendikten sonra [flow veya paywall'ı gösterin](kmp-present-paywalls). ## Varsayılan kitle için flow veya paywall alarak daha hızlı yükleme sağlayın \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle flow'lar ve paywall'lar neredeyse anında yüklenir, bu yüzden bu süreci hızlandırmak için endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve placement'ınız varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, bir flow veya paywall'ı yüklemek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiçbir şey göstermek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir flow veya paywall görüntülemek isteyebilirsiniz. Bunu gidermek için, belirtilen placement'ın **All Users** kitlesi için flow veya paywall'ını çeken `getFlowForDefaultAudience` metodunu kullanabilirsiniz. Ancak şunu anlamak kritik önem taşır: önerilen yaklaşım, flow veya paywall'ı yukarıdaki [Flow/paywall'ı getir](#fetch-flowpaywall) bölümünde ayrıntılı olarak açıklandığı şekilde `getFlow` metoduyla çekmektir. :::warning Neden `getFlow` kullanmanızı öneriyoruz `getFlowForDefaultAudience` metodunun birkaç önemli dezavantajı vardır: - **Potansiyel geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri için (mevcut ve gelecekteki) farklı flow'lar göstermeniz gerekirse zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen flow'lar tasarlamanız ya da mevcut (eski) sürüme sahip kullanıcıların render edilemeyen flow'larla sorun yaşayabileceğini kabul etmeniz gerekecektir. - **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesine yönelik tasarlanmış aynı flow'u görecektir; bu da kişiselleştirilmiş hedeflemeyi (ülkelere, pazarlama attribution'ına veya kendi özel özelliklerinize göre hedefleme dahil) kaybettiğiniz anlamına gelir. Bu dezavantajları göze alarak daha hızlı flow veya paywall getirme işleminden yararlanmak istiyorsanız, `getFlowForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde [yukarıda](#fetch-flowpaywall) açıklanan `getFlow` metodunu kullanmaya devam edin. ::: ```kotlin showLineNumbers Adapty.getFlowForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { flow -> // the requested flow }.onError { error -> // handle the error } ``` | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | [Placement](placements) tanımlayıcısı. Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **fetchPolicy** | varsayılan: `AdaptyPaywallFetchPolicy.Default` |SDK, varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığından bu seçeneği kullanmanızı öneririz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri mevcutsa onu döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; dolayısıyla oturum sırasında ağ isteklerinden kaçınmak için güvenle kullanılabilir.
Önbelleğin, uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırılıp yeniden yüklendiğinde ya da manuel temizlik yapıldığında temizlendiğini unutmayın.
| ## Varlıkları özelleştirme \{#customize-assets\} Flow veya paywallınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görseller ve videolar önceden tanımlanmış ID'lere sahiptir: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leriyle hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterme. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterme. - Video başlamadan önce bir önizleme görseli gösterme. İşte özel varlıkları bir map aracılığıyla nasıl sağlayabileceğinize dair bir örnek: :::info Kotlin Multiplatform SDK yalnızca yerel varlıkları destekler. Uzak içerikler için, bunları özel varlıklarda kullanmadan önce indirip yerel olarak önbelleğe almanız gerekir. ::: ```kotlin showLineNumbers // Import generated Res class for accessing resources viewModelScope.launch { // Get URIs for bundled resources using Res.getUri() val heroImagePath = Res.getUri("files/images/hero_image.png") val demoVideoPath = Res.getUri("files/videos/demo_video.mp4") // Or read image as byte data val imageByteData = Res.readBytes("files/images/avatar.png") // Create custom assets map val customAssets: Mapisteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve önerilen kullanım biçimleri hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `AdaptyPaywallFetchPolicy.Default` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, mevcut önbellek verisini döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en son verileri göremeyebilir; ancak bağlantı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşar. Önbellek düzenli olarak güncellenir, dolayısıyla oturum boyunca ağ isteklerinden kaçınmak için güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında korunduğunu; yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı getirmek için CDN, CDN'e erişilemediğinde ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısı yetersiz olduğunda dahi her zaman paywalllarınızın en güncel sürümüne erişeceğinizi garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbellekteki veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun zaman aşımı, `loadTimeout` içinde belirtilenden biraz daha geç gerçekleşebilir; çünkü işlem arka planda farklı isteklerden oluşabilir.
Kotlin Multiplatform için: `TimeInterval`'ı uzantı fonksiyonlarıyla oluşturabilirsiniz (örneğin `5.seconds`; burada `.seconds`, `import com.adapty.utils.seconds`'tan gelir) ya da `TimeInterval.seconds(5)` kullanabilirsiniz. Sınır koymamak için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Ürün ID'lerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall/) nesnesi. | ## Paywall Builder ile tasarlanan paywallın görünüm yapılandırmasını getirme \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall Builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse görünüm yapılandırması alınamaz. ::: Paywall'ı aldıktan sonra, Paywall Builder kullanılarak oluşturulduğunu gösteren `ViewConfiguration` öğesini içerip içermediğini kontrol edin. Bu, paywall'ı nasıl göstereceğiniz konusunda size rehberlik eder. `ViewConfiguration` mevcutsa Paywall Builder paywall'ı olarak değerlendirin; yoksa [remote config paywall olarak ele alın](present-remote-config-paywalls-kmp). Görünüm yapılandırmasını yüklemek için `createPaywallView` metodunu kullanın. ```kotlin showLineNumbers if (paywall.hasViewConfiguration) { AdaptyUI.createPaywallView( paywall = paywall, loadTimeout = 5.seconds, preloadProducts = true ).onSuccess { paywallView -> // use paywallView }.onError { error -> // handle the error } } else { // use your custom logic } ``` | Parametre | Zorunluluk | Açıklama | | :--------------------------- | :------------- | :----------------------------------------------------------- | | **paywall** | zorunlu | İstenen paywall için bir controller almak üzere kullanılan `AdaptyPaywall` nesnesi. | | **loadTimeout** | isteğe bağlı | Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbellekteki veri veya yerel yedek döndürülür. Nadir durumlarda bu metodun zaman aşımı, `loadTimeout` içinde belirtilenden biraz daha geç gerçekleşebilir; çünkü işlem arka planda farklı isteklerden oluşabilir. `kotlin.time.Duration.Companion` kaynaklı `5.seconds` gibi uzantı fonksiyonlarını kullanabilirsiniz. | | **preloadProducts** | isteğe bağlı | Daha iyi performans için ürünleri önceden yüklemek üzere `true` olarak ayarlayın. Etkinleştirildiğinde ürünler önceden yüklenir ve paywall'ın gösterilmesi için gereken süre azalır. | | **productPurchaseParams** | isteğe bağlı | [`AdaptyProductIdentifier`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-product-identifier/) ile [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/) arasındaki bir eşleme. Paywalldaki her bir ürün için kişiselleştirilmiş teklifler veya abonelik güncelleme parametreleri gibi satın alma'ya özgü parametreleri yapılandırmak için kullanın. | :::note Birden fazla dil kullanıyorsanız, [Paywall Builder yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) nasıl ekleneceğini öğrenin. ::: Yüklendikten sonra [paywall'ı sunun](kmp-present-paywalls). ## Daha hızlı getirmek için varsayılan kitle paywallını alma \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} Paywalllar genellikle neredeyse anında getirilir, bu yüzden bu süreci hızlandırmak için endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve paywalla sahip olduğunuzda ve kullanıcılarınızın internet bağlantısı zayıf olduğunda, paywall getirme işlemi istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç paywall göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak amacıyla varsayılan bir paywall görüntülemek isteyebilirsiniz. Bu sorunu çözmek için, belirtilen placement'ın **All Users** kitlesine ait paywallını getiren `getPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Paywall Bilgilerini Getirme](#fetch-paywall-designed-with-paywall-builder) bölümünde ayrıntılı olarak açıklanan `getPaywall` metodu olduğunu unutmayın. :::warning Neden `getPaywall` kullanmanızı öneriyoruz `getPaywallForDefaultAudience` metodunun bazı önemli dezavantajları vardır: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywalllar göstermeniz gerekiyorsa zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywalllar tasarlamak zorunda kalacaksınız ya da mevcut (eski) sürümdeki kullanıcıların render edilemeyen paywalllarla karşılaşmasını kabul edeceksiniz. - **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görür; bu da kişiselleştirilmiş hedeflemeyi (ülkelere, pazarlama attribution'ına veya kendi özel niteliklerinize göre) ortadan kaldırır. Daha hızlı paywall getirme avantajından yararlanmak için bu dezavantajları kabul etmeye hazırsanız, `getPaywallForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde [yukarıda](#fetch-paywall-designed-with-paywall-builder) açıklanan `getPaywall` metodunu kullanmaya devam edin. ::: ```kotlin showLineNumbers Adapty.getPaywallForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", locale = "en", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { paywall -> // the requested paywall }.onError { error -> // handle the error } ``` | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve önerilen kullanım biçimleri hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `AdaptyPaywallFetchPolicy.Default` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, mevcut önbellek verisini döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en son verileri göremeyebilir; ancak bağlantı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşar. Önbellek düzenli olarak güncellenir, dolayısıyla oturum boyunca ağ isteklerinden kaçınmak için güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında korunduğunu; yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
| ## Varlıkları özelleştirme \{#customize-assets\} Paywallinızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Kahraman görselleri ve videoları önceden tanımlanmış ID'lere sahiptir: `hero_image` ve `hero_video`. Özel bir varlık paketinde bu öğeleri ID'leri aracılığıyla hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterin. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterin. - Video çalışmadan önce bir önizleme görseli gösterin. :::important Bu özelliği kullanmak için Adapty SDK'yı 3.7.0 veya üzeri sürüme güncelleyin. ::: Özel varlıkları bir map aracılığıyla nasıl sağlayabileceğinize dair bir örnek: :::info Kotlin Multiplatform SDK yalnızca yerel varlıkları destekler. Uzak içerikler için, özel varlıklarda kullanmadan önce varlıkları indirip yerel olarak önbelleğe almanız gerekir. ::: ```kotlin showLineNumbers // Import generated Res class for accessing resources viewModelScope.launch { // Get URIs for bundled resources using Res.getUri() val heroImagePath = Res.getUri("files/images/hero_image.png") val demoVideoPath = Res.getUri("files/videos/demo_video.mp4") // Or read image as byte data val imageByteData = Res.readBytes("files/images/avatar.png") // Create custom assets map val customAssets: Map
## Paywall görüntülenme sayısı çok yüksek \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntülenme sayısı beklenenin iki katını gösteriyor.
**Neden**: Kodunuzda `logShowFlow` (SDK v4+) / `logShowPaywall` çağrısı yapıyor olabilirsiniz; Paywall Builder veya Flow Builder kullanıyorsanız bu, görüntülenme sayısını iki katına çıkarır. Bu araçlarla oluşturulan flow'lar ve paywall'lar için analitik otomatik olarak izlenir, dolayısıyla bu metodu çağırmanıza gerek yoktur.
**Çözüm**: Paywall Builder veya Flow Builder kullanıyorsanız kodunuzda `logShowFlow` (SDK v4+) / `logShowPaywall` çağrısı yapmadığınızdan emin olun.
---
# File: kmp-implement-paywalls-manually
---
---
title: "Kotlin Multiplatform SDK'da paywallları manuel olarak uygulayın"
description: "Adapty SDK ile Kotlin Multiplatform uygulamanızda paywallları manuel olarak nasıl uygulayacağınızı öğrenin."
---
## Satın alma işlemlerini kabul etme \{#accept-purchases\}
Kendiniz uyguladığınız paywalllarla çalışıyorsanız, `makePurchase` yöntemini kullanarak satın alma işlemlerinin yönetimini Adapty'ye devredebilirsiniz. Bu sayede tüm kullanıcı senaryolarını biz yönetiriz; sizin yalnızca satın alma sonuçlarını işlemeniz yeterlidir.
:::important
`makePurchase`, Adapty kontrol panelinde oluşturulan ürünlerle çalışır. [Hızlı başlangıç kılavuzunu](quickstart) takip ederek kontrol panelinde ürünleri ve bunları alma yöntemlerini yapılandırdığınızdan emin olun.
:::
SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla mücadele ettiğini düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu senaryoda kullanıcılar en son verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle ağ isteklerini azaltmak amacıyla oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını, yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, flow'ları ve paywallları iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](kmp-use-fallback-paywalls). Flow'ları ve paywallları daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanırız. Bu sistem, her zaman en güncel flow ve paywall sürümüne ulaşmanızı sağlarken internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği ön planda tutar.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşıldığında önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini hardcode etmeyin! Flow'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız bu 2 ürünü göstermelidir. Ancak daha sonra 3 ürün alırsanız, herhangi bir kod değişikliği gerektirmeden uygulamanız 3 ürünün tamamını göstermelidir. Hardcode etmeniz gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Bir `AdaptyFlow` nesnesi şunları içerir: flow tanımlayıcısı, paywall varyasyonları (`paywalls` — her biri kendi ürün tanımlayıcılarıyla), yapılandırılan her yerel ayar için bir giriş içeren `remoteConfigs` listesi ve diğer çeşitli özellikler. Flow için ürünleri almak üzere `getPaywallProducts(flow)` çağrısını kullanın. | :::note v4'te `getFlow` fonksiyonunun `locale` parametresi yoktur. `createFlowView` ile bir flow render ettiğinizde, yerelleştirme otomatik olarak çözümlenir. Özel paywalllar için tüm mevcut yerel ayarlar `flow.remoteConfigs` içinde birlikte döndürülür; kullanıcının cihazına veya uygulamanızın ayarına uyan yerel ayarı seçin. Ayrıntılar için [Yerelleştirmeler ve yerel ayar kodları](kmp-localizations-and-locale-codes) bölümüne bakın. ::: ## Ürünleri getir \{#fetch-products\} Flow'u aldıktan sonra, o flow'a karşılık gelen ürün dizisini sorgulayabilirsiniz: ```kotlin showLineNumbers Adapty.getPaywallProducts(flow).onSuccess { products -> // the requested products }.onError { error -> // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer çeşitli özellikleri içeren [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) nesnelerinin listesi. | Kendi flow tasarımınızı uygularken, büyük olasılıkla [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) nesnesindeki bu özelliklere erişmeniz gerekecektir. Aşağıda en sık kullanılan özellikler gösterilmektedir; mevcut tüm özellikler hakkında ayrıntılı bilgi için bağlantılı belgeye bakın. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Başlık** | Ürünün başlığını görüntülemek için `product.localizedTitle` kullanın. Yerelleştirmenin, cihazın dilinden değil, kullanıcının seçtiği mağaza ülkesine göre yapıldığını unutmayın. | | **Fiyat** | Fiyatın yerelleştirilmiş sürümünü görüntülemek için `product.price.localizedString` kullanın. Bu yerelleştirme, cihazın dil bilgisine dayanır. Fiyata sayı olarak erişmek için `product.price.amount` kullanabilirsiniz. Değer yerel para biriminde sağlanır. İlgili para birimi sembolünü almak için `product.price.currencySymbol` kullanın. | | **Abonelik Dönemi** | Dönemi (ör. hafta, ay, yıl vb.) görüntülemek için `product.subscriptionDetails?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme, cihazın diline dayanır. Abonelik dönemini programatik olarak almak için `product.subscriptionDetails?.subscriptionPeriod` kullanın. Buradan uzunluğu elde etmek amacıyla `unit` enum'ına erişebilirsiniz (DAY, WEEK, MONTH, YEAR veya UNKNOWN). `numberOfUnits` değeri, dönem birimi sayısını verir. Örneğin üç aylık bir abonelik için `unit` özelliğinde `MONTH`, `numberOfUnits` özelliğinde ise `3` görürsünüz. | | **Başlangıç Teklifi** | Bir aboneliğin başlangıç teklifi içerip içermediğini göstermek için rozet veya başka bir gösterge kullanmak istiyorsanız `product.subscriptionDetails?.introductoryOfferPhases` özelliğine bakın. Bu liste, en fazla iki indirim aşaması içerebilir: ücretsiz deneme aşaması ve başlangıç fiyatı aşaması. Her aşama nesnesinde şu kullanışlı özellikler yer alır:SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla çalıştığını düşünüyorsanız, önbelleğe alınmış veri mevcutsa onu döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en son verilere ulaşamayabilir; ancak internet bağlantısı ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellendiğinden, ağ isteklerinden kaçınmak amacıyla oturum boyunca güvenle kullanabilirsiniz.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama kaldırılıp yeniden yüklendiğinde veya manuel temizleme yapıldığında temizlendiğini unutmayın.
|isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `AdaptyPaywallFetchPolicy.Default` |SDK varsayılan olarak verileri sunucudan yüklemeye çalışır; başarısız olması durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri mevcutsa onu döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek amacıyla oturum boyunca güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını; yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, paywall'ları iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](kmp-use-fallback-paywalls). Paywall'ları daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının kısıtlı olduğu durumlarda bile güvenilirliği sağlarken paywall'larınızın her zaman en güncel sürümünü almanızı garanti etmek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini sabit kodlamayın! Paywall'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz denemeler gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız o 2 ürünü görüntülemelidir. Ancak daha sonra 3 ürün alırsanız, herhangi bir kod değişikliği gerektirmeden uygulamanız 3 ürünün tamamını görüntülemelidir. Sabit kodlamanız gereken tek şey placement ID'dir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'lerinin listesi, paywall tanımlayıcısı, remote config ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall/) nesnesi. | ## Ürünleri getir \{#fetch-products\} Paywall'ı aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```kotlin showLineNumbers Adapty.getPaywallProducts(paywall).onSuccess { products -> // the requested products }.onError { error -> // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer çeşitli özellikleri içeren [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken, büyük olasılıkla [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) nesnesindeki bu özelliklere ihtiyaç duyacaksınız. Aşağıda en sık kullanılan özellikler gösterilmektedir; mevcut tüm özellikler hakkında ayrıntılı bilgi için bağlantılı belgeye başvurun. | Özellik | Açıklama | |----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Başlık** | Ürünün başlığını görüntülemek için `product.localizedTitle` kullanın. Yerelleştirmenin, cihazın dil ayarına değil, kullanıcının seçtiği mağaza ülkesine göre yapıldığını unutmayın. | | **Fiyat** | Fiyatın yerelleştirilmiş halini görüntülemek için `product.price.localizedString` kullanın. Bu yerelleştirme cihazın dil bilgisine göre yapılır. Fiyata sayısal olarak erişmek için `product.price.amount` kullanabilirsiniz. Değer yerel para biriminde döndürülür. İlgili para birimi sembolünü almak için `product.price.currencySymbol` kullanın. | | **Abonelik Dönemi** | Dönemi (örn. hafta, ay, yıl vb.) görüntülemek için `product.subscriptionDetails?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme cihazın diline göre yapılır. Abonelik dönemine programatik olarak erişmek için `product.subscriptionDetails?.subscriptionPeriod` kullanın. Bu özellik üzerinden `unit` enum'una erişerek süreyi (DAY, WEEK, MONTH, YEAR veya UNKNOWN) öğrenebilirsiniz. `numberOfUnits` değeri ise dönem birimi sayısını verir. Örneğin üç aylık bir abonelikte `unit` özelliğinde `MONTH`, `numberOfUnits` özelliğinde `3` görürsünüz. | | **Başlangıç Teklifi** | Bir aboneliğin başlangıç teklifi içerip içermediğini belirtmek için rozet veya başka bir gösterge kullanmak istiyorsanız `product.subscriptionDetails?.introductoryOfferPhases` özelliğine bakın. Bu liste, ücretsiz deneme aşaması ve başlangıç fiyatı aşaması olmak üzere en fazla iki indirim aşaması içerebilir. Her aşama nesnesinde şu yararlı özellikler bulunur:isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesi](add-remote-config-locale) için tanımlayıcı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` ise Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `AdaptyPaywallFetchPolicy.Default` |SDK, varsayılan olarak sunucudan veri yüklemeyi dener ve hata durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` kullanmayı değerlendirebilirsiniz. Bu durumda kullanıcılar en son verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum sırasında ağ isteklerini azaltmak amacıyla güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını, yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yapıldığında silindiğini unutmayın.
|İstek başarılı olursa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/) nesnesi, kullanıcının uygulama içindeki access level'ları, abonelikleri ve abonelik dışı satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Hâlâ Apple'ın StoreKit v2.0'ın altındaki bir sürümünü ve Adapty SDK v2.9.0'ın altındaki bir sürümünü kullanıyorsanız, bunun yerine [Apple App Store paylaşılan sırrını](app-store-connection-configuration#step-5-enter-app-store-shared-secret) sağlamanız gerekir. Bu yöntem Apple tarafından kullanımdan kaldırılmıştır. ::: ## Satın alma sırasında abonelik değiştirme \{#change-subscription-when-making-a-purchase\} Kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu sürecin işleyişi uygulama mağazasına göre değişir. Google Play'de abonelik otomatik olarak güncellenmez. Aşağıda açıklandığı gibi geçişi mobil uygulama kodunuzda yönetmeniz gerekir. Android'de aboneliği başka biriyle değiştirmek için `.makePurchase()` metodunu ek parametre ile çağırın: ```kotlin showLineNumbers val subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters( oldSubVendorProductId = "old_subscription_product_id", replacementMode = AdaptyAndroidSubscriptionUpdateReplacementMode.CHARGE_FULL_PRICE ) val purchaseParams = AdaptyPurchaseParameters.Builder() .setSubscriptionUpdateParams(subscriptionUpdateParams) .build() Adapty.makePurchase( product = product, parameters = purchaseParams ).onSuccess { purchaseResult -> when (purchaseResult) { is AdaptyPurchaseResult.Success -> { val profile = purchaseResult.profile // successful cross-grade } is AdaptyPurchaseResult.UserCanceled -> { // user canceled the purchase flow } is AdaptyPurchaseResult.Pending -> { // the purchase has not been finished yet, e.g. user will pay offline by cash } } }.onError { error -> // Handle the error } ``` Ek istek parametresi: | Parametre | Zorunluluk | Açıklama | |:---------------|:-----------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **parameters** | isteğe bağlı | [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/) aracılığıyla iletilen bir [`AdaptyAndroidSubscriptionUpdateParameters`](https://kmp.adapty.io/////adapty/com.adapty.kmp.models/-adapty-android-subscription-update-parameters/) nesnesi. | Abonelikler ve değiştirme modları hakkında daha fazla bilgi için Google Geliştirici belgelerine bakabilirsiniz: - [Değiştirme modları hakkında](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Google'ın değiştirme modları önerileri](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()) değiştirme modu. Not: Bu yöntem yalnızca abonelik yükseltmeleri için kullanılabilir. Düşürme desteklenmez. - [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()) değiştirme modu. Not: Gerçek abonelik değişikliği yalnızca mevcut abonelik fatura dönemi sona erdiğinde gerçekleşir. ## iOS'ta teklif kodlarını kullanma \{#redeem-offer-codes-in-ios\}Bir [`AdaptyProfile`](https://kmp.adapty.io//////adapty/com.adapty.kmp.models/-adapty-profile/) nesnesi. Bu model; access level'lar, abonelikler ve abonelik dışı satın almalar hakkında bilgi içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level** durumunu kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: implement-observer-mode-kmp --- --- title: "Kotlin Multiplatform SDK'da Observer modunu uygulama" description: "Kotlin Multiplatform SDK'da kullanıcı abonelik etkinliklerini izlemek için Adapty'de observer modunu uygulayın." --- Kendi satın alma altyapınız varsa ve henüz tamamen Adapty'ye geçmeye hazır değilseniz, [Observer mode](observer-vs-full-mode)'u inceleyebilirsiniz. Temel haliyle Observer Mode; gelişmiş analitik ve attribution ile analitik sistemleriyle sorunsuz entegrasyon sunar. Bu sizin için yeterliyse yalnızca şunları yapmanız yeterli: 1. Adapty SDK'yı yapılandırırken `observerMode` parametresini `true` olarak ayarlayarak Observer Mode'u etkinleştirin. Kurulum talimatlarını [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform) için takip edin. 2. Mevcut satın alma altyapınızdan [işlemleri Adapty'ye bildirin](report-transactions-observer-mode-kmp). :::tip SDK v4'te, Observer modunda Adapty tarafından render edilen flow'ları ve paywall'ları da sunabilirsiniz: kullanıcı satın alma veya geri yükleme düğmesine dokunduğunda, SDK eylemi kodunuza devreder, böylece satın alma veya geri yükleme işlemini kendiniz gerçekleştirebilirsiniz. Bkz. [Observer modunda flow'ları sunma](kmp-present-flows-in-observer-mode). ::: ## Observer mode kurulumu \{#observer-mode-setup\} Satın almaları ve abonelik durumunu kendiniz yönetip Adapty'yi yalnızca abonelik etkinlikleri ve analitik için kullanıyorsanız Observer Mode'u etkinleştirin. :::important Observer modunda çalışırken Adapty SDK hiçbir işlemi kapatmaz; bu nedenle işlemleri kendiniz yönettiğinizden emin olun. ::: ```kotlin showLineNumbers val config = AdaptyConfig .Builder("PUBLIC_SDK_KEY") .withObserverMode(true) // default false .build() Adapty.activate(configuration = config) .onSuccess { Log.d("Adapty", "SDK initialised in observer mode") } .onError { error -> Log.e("Adapty", "Adapty init error: ${error.message}") } ``` Parametreler: | Parametre | Açıklama | | --------------------------- | ------------------------------------------------------------ | | observerMode | [Observer mode](observer-vs-full-mode)'u kontrol eden bir boolean değer. Varsayılan değer `false`'tur. | ## Observer Mode'da Adapty paywalllarını kullanma \{#using-adapty-paywalls-in-observer-mode\} Adapty'nin paywalllarını ve A/B testi özelliklerini de kullanmak istiyorsanız bunu yapabilirsiniz; ancak Observer modunda biraz ek kurulum gerektirir. Yukarıdaki adımlara ek olarak şunları yapmanız gerekir: 1. [Remote config paywallları](present-remote-config-paywalls-kmp) için paywallları her zamanki gibi gösterin. 3. Satın alma işlemleriyle [paywallları ilişkilendirin](report-transactions-observer-mode-kmp). --- # File: report-transactions-observer-mode-kmp --- --- title: "Kotlin Multiplatform SDK'da Observer Mode'da İşlemleri Raporlama" description: "Kotlin Multiplatform SDK'da kullanıcı içgörüleri ve gelir takibi için Adapty Observer Mode'unda satın alma işlemlerini raporlayın." --- Observer Mode'da Adapty SDK, mevcut satın alma sisteminiz aracılığıyla gerçekleştirilen satın almaları kendi başına takip edemez. App Store'dan gelen işlemleri kendiniz raporlamanız gerekir. Analizlerde hata oluşmaması için bunu uygulamanızı yayınlamadan **önce** yapılandırmanız kritik öneme sahiptir. Her işlemi Adapty'nin tanıması için `reportTransaction` kullanarak açıkça raporlayın. :::warning **İşlem raporlamayı atlama!** `reportTransaction` çağırmazsanız Adapty işlemi tanımaz, analitiklerde görünmez ve entegrasyonlara iletilmez. ::: Adapty paywallları kullanıyorsanız işlemi raporlarken `variationId` ekleyin. Bu, satın almayı tetikleyen paywalla bağlayarak paywall analizlerinin doğru çalışmasını sağlar. ```kotlin showLineNumbers Adapty.reportTransaction( transactionId = "your_transaction_id", variationId = paywall.variationId ).onSuccess { profile -> // Transaction reported successfully // profile contains updated user data }.onError { error -> // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | --------------- | -------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | transactionId | zorunlu | App Store satın almasından gelen işlem kimliği. Genellikle mağaza tarafından döndürülen satın alma token'ı veya işlem tanımlayıcısıdır. | | variationId | isteğe bağlı | Varyantın string tanımlayıcısı. [AdaptyPaywall](https://kmp.adapty.io//////adapty/com.adapty.kmp.models/-adapty-paywall/) nesnesinin `variationId` özelliği kullanılarak alınabilir. | --- # File: kmp-troubleshoot-purchases --- --- title: "Kotlin Multiplatform SDK'da satın alma sorunlarını giderme" description: "Kotlin Multiplatform SDK'da satın alma sorunlarını giderme" --- Bu rehber, Kotlin Multiplatform SDK'da satın almaları manuel olarak uygularken karşılaşılan yaygın sorunları çözmenize yardımcı olur. ## makePurchase başarıyla çağrıldı ancak profil güncellenmiyor \{#makepurchase-is-called-successfully-but-the-profile-is-not-being-updated\} **Sorun**: `makePurchase` metodu başarıyla tamamlanıyor ancak kullanıcının profili ve abonelik durumu Adapty'de güncellenmiyor. **Neden**: Bu durum genellikle eksik Google Play Store kurulumuna ya da yapılandırma sorunlarına işaret eder. **Çözüm**: Tüm [Google Play kurulum adımlarını](initial-android) tamamladığınızdan emin olun. ## makePurchase iki kez çağrılıyor \{#makepurchase-is-invoked-twice\} **Sorun**: `makePurchase` metodu aynı satın alma için birden fazla kez çağrılıyor. **Neden**: Bu durum genellikle UI durum yönetimi sorunları veya hızlı kullanıcı etkileşimleri nedeniyle satın alma akışının birden fazla kez tetiklenmesinden kaynaklanır. **Çözüm**: Tüm [Google Play kurulum adımlarını](initial-android) tamamladığınızdan emin olun. ## Observer modunda AdaptyError.cantMakePayments \{#adaptyerror-cantmakepayments-in-observer-mode\} **Sorun**: Observer modunda `makePurchase` kullanırken `AdaptyError.cantMakePayments` hatası alıyorsunuz. **Neden**: Observer modunda satın almaları Adapty'nin `makePurchase` metodu üzerinden değil, kendi tarafınızda yönetmeniz gerekir. **Çözüm**: Satın almalar için `makePurchase` kullanıyorsanız observer modunu kapatın. Ya `makePurchase` kullanmalı ya da observer modunda satın almaları kendi tarafınızda yönetmelisiniz. Daha fazla bilgi için [Observer modunu uygulama](implement-observer-mode-kmp) konusuna bakın. ## Adapty hatası: (code: 103, message: Play Market request failed on purchases updated: responseCode=3, debugMessage=Billing Unavailable, detail: null) \{#adapty-error-code-103-message-play-market-request-failed-on-purchases-updated-responsecode3-debugmessagebilling-unavailable-detail-null\} **Sorun**: Google Play Store'dan faturalandırma kullanılamıyor hatası alıyorsunuz. **Neden**: Bu hata Adapty ile ilgili değildir. Cihazda faturalandırmanın kullanılamadığını belirten bir Google Play Billing Library hatasıdır. **Çözüm**: Bu hata Adapty ile ilgili değildir. Play Store dokümantasyonunda daha fazla bilgi edinebilirsiniz: [BillingResult yanıt kodlarını yönetme](https://developer.android.com/google/play/billing/errors#billing_unavailable_error_code_3) | Play Billing | Android Developers. ## makePurchasesCompletionHandlers bulunamadı \{#not-found-makepurchasescompletionhandlers\} **Sorun**: `makePurchasesCompletionHandlers` bulunamıyor hatası alıyorsunuz. **Neden**: Bu durum genellikle sandbox test sorunlarıyla ilgilidir. **Çözüm**: Yeni bir sandbox kullanıcısı oluşturup tekrar deneyin. Bu, sandbox ile ilgili satın alma tamamlama handler sorunlarını çoğunlukla çözer. --- # File: kmp-user --- --- title: "Kotlin Multiplatform SDK'da Kullanıcılar ve Erişim" description: "Adapty SDK ile Kotlin Multiplatform uygulamanızda kullanıcılar ve access level'larla nasıl çalışacağınızı öğrenin." --- Bu sayfa, Kotlin Multiplatform uygulamanızda kullanıcılar ve access level'larla çalışmaya yönelik tüm kılavuzları içerir. İhtiyacınız olan konuyu seçin: - **[Kullanıcıları tanımlama](kmp-identifying-users)** - Uygulamanızdaki kullanıcıları nasıl tanımlayacağınızı öğrenin - **[Kullanıcı verilerini güncelleme](kmp-setting-user-attributes)** - Kullanıcı niteliklerini ve profil verilerini ayarlayın - **[Abonelik durumu değişikliklerini dinleme](kmp-listen-subscription-changes)** - Abonelik değişikliklerini gerçek zamanlı olarak takip edin - **[Çocuk Modu](kids-mode-kmp)** - Uygulamanız için Çocuk Modunu uygulayın --- # File: kmp-identifying-users --- --- title: "Kotlin Multiplatform SDK'da kullanıcıları tanımlama" description: "Kişiselleştirilmiş abonelik deneyimlerini iyileştirmek için Adapty'de kullanıcıları tanımlayın." --- Adapty, her kullanıcı için dahili bir profil ID'si oluşturur. Ancak kendi kimlik doğrulama sisteminiz varsa, kendi Customer User ID'nizi ayarlamanız gerekir. Kullanıcıları Customer User ID'lerine göre [Profiller](profiles-crm) bölümünde bulabilir ve tüm entegrasyonlara gönderilecek olan [sunucu taraflı API](getting-started-with-server-side-api)'de kullanabilirsiniz. ### Yapılandırma sırasında customer user ID ayarlama \{#setting-customer-user-id-on-configuration\} Yapılandırma sırasında bir kullanıcı ID'niz varsa, `.activate()` metoduna `customerUserId` parametresi olarak geçirin: ```kotlin showLineNumbers Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId("YOUR_USER_ID") .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } } ``` :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ### Yapılandırma sonrasında customer user ID ayarlama \{#setting-customer-user-id-after-configuration\} SDK yapılandırması sırasında kullanıcı ID'niz yoksa, `.identify()` metoduyla istediğiniz zaman sonradan ayarlayabilirsiniz. Bu metodun en yaygın kullanım senaryoları; kayıt veya giriş işleminin ardından, yani kullanıcının anonim kullanıcıdan kimliği doğrulanmış kullanıcıya geçişi sırasındadır. ```kotlin showLineNumbers Adapty.identify("YOUR_USER_ID").onSuccess { // successful identify }.onError { error -> // handle the error } ``` İstek parametreleri: - **Customer User ID** (zorunlu): kullanıcının string kimliği. :::warning Önemli kullanıcı verilerini yeniden gönderme Kullanıcının hesabına tekrar giriş yapması gibi bazı durumlarda, Adapty sunucularında o kullanıcıya ait bilgiler zaten bulunuyor olabilir. Bu senaryolarda Adapty SDK, yeni kullanıcıyla çalışmak için otomatik olarak geçiş yapar. Anonim kullanıcıya özel nitelikler veya üçüncü taraf ağlardan attribution gibi veriler iletmişseniz, bu verileri tanımlanmış kullanıcı için yeniden göndermeniz gerekir. Ayrıca, kullanıcıyı tanımladıktan sonra tüm paywall'ları ve ürünleri yeniden istemeniz önemlidir; yeni kullanıcının verileri farklı olabilir. ::: ### Çıkış ve giriş yapma \{#logging-out-and-logging-in\} `.logout()` metodunu çağırarak istediğiniz zaman kullanıcının oturumunu kapatabilirsiniz: ```kotlin showLineNumbers Adapty.logout().onSuccess { // successful logout }.onError { error -> // handle the error } ``` Ardından `.identify()` metoduyla kullanıcıyı tekrar giriş yaptırabilirsiniz. ## `appAccountToken` atama (iOS) \{#assign-appaccounttoken-ios\} [`iosAppAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)), App Store işlemlerini kendi kullanıcı kimliğinizle ilişkilendirmenizi sağlayan bir **UUID**'dir. StoreKit bu token'ı her işlemle ilişkilendirir, böylece backend'iniz App Store verilerini kullanıcılarınızla eşleştirebilir. Kullanıcı başına oluşturulan sabit bir UUID kullanın ve aynı hesap için farklı cihazlarda aynı değeri tekrar kullanın. Bu sayede satın almalar ve App Store bildirimleri doğru şekilde ilişkilendirilmiş olur. Token'ı iki şekilde ayarlayabilirsiniz: SDK aktivasyonu sırasında veya kullanıcıyı tanımlarken. :::important `iosAppAccountToken`'ı her zaman `customerUserId` ile birlikte geçirmelisiniz. Yalnızca token'ı geçerseniz, işleme dahil edilmez. ::: ```kotlin showLineNumbers // During configuration: Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId( id = "YOUR_USER_ID", iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN" ) .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } // Or when identifying users Adapty.identify( customerUserId = "YOUR_USER_ID", iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN" ).onSuccess { // successful identify }.onError { error -> // handle the error } ``` ## Gizlenmiş hesap ID'leri ayarlama (Android) \{#set-obfuscated-account-ids-android\} Google Play, kullanıcı gizliliğini ve güvenliğini artırmak için belirli kullanım senaryolarında gizlenmiş hesap ID'leri gerektirir. Bu ID'ler, Google Play'in kullanıcı bilgilerini anonim tutarken satın almaları tanımlamasına yardımcı olur; özellikle sahtekarlık önleme ve analitik açısından önemlidir. Uygulamanız hassas kullanıcı verileri işliyorsa veya belirli gizlilik düzenlemelerine uymak zorundaysanız bu ID'leri ayarlamanız gerekebilir. Gizlenmiş ID'ler, Google Play'in gerçek kullanıcı tanımlayıcılarını açığa çıkarmadan satın almaları takip etmesine olanak tanır. :::important `androidObfuscatedAccountId`'yi her zaman `customerUserId` ile birlikte geçirmelisiniz. Yalnızca gizlenmiş hesap ID'sini geçerseniz, işleme dahil edilmez. ::: ```kotlin showLineNumbers // During configuration: Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId( id = "YOUR_USER_ID", androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID" ) .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } // Or when identifying users Adapty.identify( customerUserId = "YOUR_USER_ID", androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID" ).onSuccess { // successful identify }.onError { error -> // handle the error } ``` ## Cihazlar arası kullanıcı tespiti \{#detect-users-across-devices\} SDK etkinleştirildiğinde, StoreKit (iOS) veya Google Play Billing (Android) üzerinden kullanıcının mevcut haklarını otomatik olarak okur ve bunları Adapty backend'iyle senkronize eder. Aktif bir abonelik, uygulamanın `restorePurchases` çağrısı yapmadan Adapty profilinde görünür. Otomatik olarak **gerçekleşmeyen** şey, yeni bir cihazdaki profilin orijinal cihazdaki profille aynı kullanıcıya ait olduğunun tanınmasıdır. Adapty, profilleri Customer User ID ile eşleştirir; dolayısıyla kimlik sürekliliği CUID olarak ne kullandığınıza bağlıdır. **Adapty'nin cihazlar arasında neleri algılayabildiği** | Kurulumunuz | Adapty'nin algıladığı | Yapmanız gereken | | --- | --- | --- | | Customer User ID = `device_id` (uygulama girişi yok) | Yeni cihaz farklı bir CUID ve dolayısıyla farklı bir profil alır. Abonelik, **Access level updated** olayı aracılığıyla yeni profile senkronize edilir; ancak `subscription_started` tetiklenmez — yeni profil, orijinal satın almanın devralıcısı olarak değerlendirilir. `subscription_started` üzerine kurulu analizler, geri dönen kullanıcıları eksik sayar. | Geri dönen bir kullanıcının cihazlar arasında mevcut profille eşleşmesi için Customer User ID olarak kararlı bir hesap kimliği kullanın. | | Customer User ID = kararlı hesap kimliği (her cihazda oturum açma) | SDK, `activate()` sırasında aboneliği otomatik olarak senkronize eder ve `identify()`, CUID ile mevcut profili eşleştirir. | Ek kurulum gerekmez — hem kimlik hem de abonelik otomatik olarak çözümlenir. | | Apple Family Sharing devralıcısı | Aile üyesi, aboneliği yalnızca **Access level updated** olayı aracılığıyla alır — `subscription_started` tetiklenmez. | **Access level updated** olayını dinleyin. Tam olay matrisi için [Apple Family Sharing](apple-family-sharing) sayfasına bakın. | | Aynı Apple/Google hesabı, farklı uygulama içi kullanıcılar | Satın almayı kaydeden ilk profil üst profil olur. Sonraki profiller, tek bir **Access level updated** olayıyla bir devralıcı zinciri aracılığıyla aboneliği görür. | Oturum açmayı zorunlu kılın, ardından modelinize uygun bir [paylaşım modu](sharing-paid-access-between-user-accounts) seçin. | **Yeni bir cihazda satın almaları geri yükleme** Paywallınızda kullanıcı tarafından başlatılan bir "Satın almaları geri yükle" butonu gösterin. Apple App Review (kural 3.1.1) bunu zorunlu kılar ve otomatik senkronizasyonun uç bir durumu kaçırması halinde yedek olarak işlev görür. Buton, SDK'nızda `restorePurchases` çağrısı yapmalıdır. İlk açılışta programatik bir `restorePurchases` çağrısı normal kullanım için gerekli değildir — SDK, `activate()` sırasında zaten eşdeğerini çalıştırır. Programatik çağrıları yalnızca zorunlu bir güncel makbuz kontrolü için ayırın; örneğin `activate()` tamamlandıktan sonra eksik erişimi hata ayıklarken. --- # File: kmp-setting-user-attributes --- --- title: "Kotlin Multiplatform SDK'da kullanıcı özelliklerini ayarlama" description: "Adapty'de daha iyi kitle segmentasyonu için kullanıcı özelliklerini nasıl ayarlayacağınızı öğrenin." --- Uygulamanızın kullanıcısına e-posta, telefon numarası gibi isteğe bağlı özellikler ekleyebilirsiniz. Bu özellikleri kullanıcı [segmentleri](segments) oluşturmak veya CRM'de görüntülemek için kullanabilirsiniz. ### Kullanıcı özelliklerini ayarlama \{#setting-user-attributes\} Kullanıcı özelliklerini ayarlamak için `.updateProfile()` metodunu çağırın: ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() .withEmail("email@email.com") .withPhoneNumber("+18888888888") .withFirstName("John") .withLastName("Appleseed") .withGender(AdaptyProfile.Gender.FEMALE) .withBirthday(AdaptyProfile.Date(1970, 1, 3)) Adapty.updateProfile(builder.build()) .onSuccess { // profile updated successfully } .onError { error -> // handle the error } ``` `updateProfile` metoduyla daha önce ayarladığınız özelliklerin sıfırlanmayacağını unutmayın. :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ### İzin verilen anahtarlar listesi \{#the-allowed-keys-list\} `AdaptyProfileParameters.Builder` için izin verilen anahtarlar `phoneNumber
firstName
lastName
| String | | gender | Enum; izin verilen değerler: `AdaptyProfile.Gender.FEMALE`, `AdaptyProfile.Gender.MALE`, `AdaptyProfile.Gender.OTHER` | | birthday | Date | ### Özel kullanıcı özellikleri \{#custom-user-attributes\} Kendi özel özelliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanımıyla ilgilidir. Örneğin, fitness uygulamalarında haftalık egzersiz sayısı, dil öğrenme uygulamalarında kullanıcının bilgi düzeyi gibi. Bu özellikleri segmentlerde kullanarak hedefli paywall'lar ve teklifler oluşturabilir, analitik aracılığıyla hangi ürün metriklerinin gelire en çok etki ettiğini de keşfedebilirsiniz. ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() builder.withCustomAttribute("key1", "value1") ``` Mevcut bir anahtarı silmek için `.withRemovedCustomAttribute()` metodunu kullanın: ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() builder.withRemovedCustomAttribute("key2") ``` Bazen daha önce hangi özel özelliklerin eklendiğini öğrenmeniz gerekebilir. Bunun için `AdaptyProfile` nesnesinin `customAttributes` alanını kullanın. :::warning `customAttributes` değerinin güncel olmayabileceğini unutmayın. Kullanıcı özellikleri farklı cihazlardan herhangi bir zamanda gönderilebileceğinden, sunucudaki özellikler son senkronizasyondan bu yana değişmiş olabilir. ::: ### Sınırlar \{#limits\} - Kullanıcı başına en fazla 30 özel özellik - Anahtar adları en fazla 30 karakter olabilir. Anahtar adında alfanümerik karakterler ve şu simgeler kullanılabilir: `_` `-` `.` - Değer, en fazla 50 karakterlik bir string veya float olabilir. --- # File: kmp-listen-subscription-changes --- --- title: "Kotlin Multiplatform SDK'da abonelik durumunu kontrol etme" description: "Kotlin Multiplatform uygulamanızda müşteri tutundurma oranını artırmak için Adapty'de kullanıcı abonelik durumunu takip edin ve yönetin." --- Adapty ile abonelik durumunu takip etmek oldukça kolaydır. Ürün ID'lerini kodunuza elle eklemenize gerek yok; bunun yerine aktif bir [access level](access-level) kontrol ederek kullanıcının abonelik durumunu zahmetsizce doğrulayabilirsiniz. Abonelik durumunu kontrol etmeye başlamadan önce [Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN)](enable-real-time-developer-notifications-rtdn) ayarlayın. ## Access level ve AdaptyProfile nesnesi \{#access-level-and-the-adaptyprofile-object\} Access level'lar, [AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/) nesnesinin özellikleridir. Profili uygulamanız başladığında, örneğin [bir kullanıcıyı tanımladığınızda](android-identifying-users#setting-customer-user-id-on-configuration), almanızı ve değişiklik olduğunda güncellemenizi öneririz. Böylece profil nesnesini defalarca istek göndermeden kullanabilirsiniz. Profil güncellemelerinden haberdar olmak için aşağıdaki [Abonelik durumu güncellemelerini dinleme](android-listen-subscription-changes) bölümünde anlatıldığı şekilde profil değişikliklerini dinleyin. :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Sunucudan access level alma \{#retrieving-the-access-level-from-the-server\} Sunucudan access level almak için `.getProfile()` metodunu kullanın: ```kotlin showLineNumbers Adapty.getProfile().onSuccess { profile -> // check the access }.onError { error -> // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | --------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Profil |Bir [AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/) nesnesi. Genellikle kullanıcının uygulamaya premium erişimi olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu, her zaman API'yi sorgulamaya çalıştığından en güncel sonucu döndürür. Herhangi bir nedenle (örneğin internet bağlantısı olmaması) Adapty SDK sunucudan bilgi alamazsa, önbellekteki veriler döndürülür. Adapty SDK'nın `AdaptyProfile` önbelleğini düzenli aralıklarla güncelleyerek bilgileri mümkün olduğunca güncel tuttuğunu da belirtmek gerekir.
| `.getProfile()` metodu, access level durumunu alabileceğiniz kullanıcı profilini sağlar. Uygulama başına birden fazla access level tanımlayabilirsiniz. Örneğin bir gazete uygulamanız varsa ve farklı konulara abonelik satıyorsanız "sports" ve "science" gibi access level'lar oluşturabilirsiniz. Ancak çoğu durumda yalnızca bir access level'a ihtiyaç duyarsınız; bu durumda varsayılan "premium" access level'ı kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmeye yönelik bir örnek: ```kotlin showLineNumbers Adapty.getProfile().onSuccess { profile -> if (profile.accessLevels["premium"]?.isActive == true) { // grant access to premium features } }.onError { error -> // handle the error } ``` ### Abonelik durumu güncellemelerini dinleme \{#listening-for-subscription-status-updates\} Kullanıcının aboneliği her değiştiğinde Adapty bir event tetikler. Adapty'den mesaj almak için birkaç ek yapılandırma yapmanız gerekir: ```kotlin showLineNumbers Adapty.setOnProfileUpdatedListener { profile -> // handle any changes to subscription state } ``` Adapty, uygulama başlangıcında da bir event tetikler. Bu durumda önbellekteki abonelik durumu iletilir. ### Abonelik durumu önbelleği \{#subscription-status-cache\} Adapty SDK'daki önbellek, profilin abonelik durumunu saklar. Bu sayede sunucu kullanılamaz olsa bile önbellekteki veriler, profilin abonelik durumu hakkında bilgi vermek için kullanılabilir. Ancak önbellekten doğrudan veri isteği yapılamadığını belirtmek gerekir. SDK, profilin herhangi bir güncellemesini veya değişikliğini kontrol etmek için her dakika periyodik olarak sunucuyu sorgular. Yeni işlemler veya başka güncellemeler gibi değişiklikler varsa, sunucuyla senkronize tutmak amacıyla önbellekteki verilere aktarılır. --- # File: kmp-deal-with-att --- --- title: "Kotlin Multiplatform SDK'da ATT ile Başa Çıkma" description: "Abonelik kurulumunu ve yönetimini kolaylaştırmak için Kotlin Multiplatform üzerinde Adapty'ye başlayın." --- Uygulamanız AppTrackingTransparency framework'ünü kullanıyor ve kullanıcıya uygulama izleme yetkilendirme isteği gösteriyorsa, [yetkilendirme durumunu](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) Adapty'ye göndermeniz gerekir. ```kotlin showLineNumbers val profileParameters = AdaptyProfileParameters.Builder() .withAttStatus(3) // 3 = ATTrackingManagerAuthorizationStatusAuthorized .build() Adapty.updateProfile(profileParameters) .onSuccess { // ATT status updated successfully } .onError { error -> // handle AdaptyError } ``` :::warning Bu değeri değiştiği anda mümkün olduğunca erken göndermenizi önemle tavsiye ederiz; ancak bu şekilde veriler yapılandırdığınız entegrasyonlara zamanında iletilir. ::: --- # File: kids-mode-kmp --- --- title: "Kotlin Multiplatform SDK'da Çocuk Modu" description: "Google politikalarına uyum için Çocuk Modu'nu kolayca etkinleştirin. Kotlin Multiplatform SDK'da GAID veya reklam verisi toplanmaz." --- Kotlin Multiplatform uygulamanız çocuklara yönelikse [Google](https://support.google.com/googleplay/android-developer/answer/9893335) politikalarına uymanız gerekir. Adapty SDK kullanıyorsanız birkaç basit adımla bu politikaları karşılayacak ve uygulama mağazası incelemelerinden geçecek şekilde yapılandırabilirsiniz. ## Neler gerekiyor? \{#whats-required\} Adapty SDK'yı aşağıdakilerin toplanmasını devre dışı bırakacak şekilde yapılandırmanız gerekir: - [IDFA (Identifier for Advertisers)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Advertising ID (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [IP adresi](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) Bunların yanı sıra müşteri kullanıcı kimliğini dikkatli kullanmanızı öneririz. `isteğe bağlı
varsayılan: `en`
| Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenir. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınan veriyi döner. Kullanıcılarınızın her zaman en güncel veriye erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar her zaman en güncel veriye ulaşamayabilir; ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, dolayısıyla oturum sırasında ağ isteklerini azaltmak için güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırıldığında veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN, CDN'e erişilemediğinde ise bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en güncel sürümünü almanızı garanti edecek şekilde tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınan veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| ## Yanıt parametreleri \{#response-parameters\} | Parametre | Açıklama | |:----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özelliklerle birlikte bir [`AdaptyOnboarding`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-onboarding/) nesnesi. | ## Varsayılan kitle onboarding'i ile onboarding getirme işlemini hızlandırın \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Genellikle onboarding'ler neredeyse anında getirilir, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve onboarding'iniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, bir onboarding'in getirilmesi istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak amacıyla varsayılan bir onboarding görüntülemek isteyebilirsiniz. Bunu ele almak için, belirtilen placement'ın **All Users** kitlesi için onboarding'ini getiren `getOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding'i Getir](#fetch-onboarding) bölümünde açıklandığı gibi `getOnboarding` metoduyla onboarding'i getirmek olduğunu anlamak kritik önem taşımaktadır. :::warning `getOnboardingForDefaultAudience` yerine `getOnboarding` kullanmayı tercih edin; zira ikincisinin önemli kısıtlamaları bulunmaktadır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorunlara yol açabilir; ya geriye dönük uyumlu tasarımlar gerektirir ya da eski sürümlerin hatalı görüntülenebileceğini kabul etmeniz gerekir. - **Kişiselleştirme yok**: Yalnızca "Tüm Kullanıcılar" kitlesine yönelik içerik gösterir; ülke, attribution veya özel özelliklere dayalı hedefleme devre dışı kalır. Daha hızlı veri çekme bu dezavantajlara değiyorsa, aşağıda gösterildiği gibi `getOnboardingForDefaultAudience` kullanın. Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı gibi `getOnboarding` kullanın. ::: ```kotlin showLineNumbers Adapty.getOnboardingForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", locale = "en", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { paywall -> // istenen paywall }.onError { error -> // hatayı işle } ``` Parametreler: | Parametre | Varlık | Açıklama | |---------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements) tanımlayıcısı. Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
| Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere ulaşmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, mevcut olması durumunda önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu senaryoda kullanıcılar en güncel verilere her zaman ulaşamayabilir, ancak internet bağlantıları ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında olduğu gibi kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı çekmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının kısıtlı olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en güncel sürümünü almanızı garanti etmek için tasarlanmıştır.
| --- # File: kmp-present-onboardings --- --- title: "Kotlin Multiplatform SDK'da onboarding'leri sunma" description: "Daha fazla dönüşüm sağlamak için onboarding'leri etkili biçimde nasıl sunacağınızı öğrenin." --- :::warning **Onboardinglar SDK v4'te kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır.** Artık hata düzeltmesi veya iyileştirme almamaktadır. Bunun yerine [flow'ları](kmp-get-pb-paywalls) kullanın: WebView içinde çalışan onboardingların aksine, flow'lar cihazda native olarak render edilir; bu sayede daha akıcı animasyonlar, tutarlı bir native görünüm, daha hızlı yükleme süreleri ve WebView bağımlılığı ortadan kalkar. Başlamak için [Flow'ları ve paywallları alma](kmp-get-pb-paywalls) ve [Flow'ları ve paywallları gösterme](kmp-present-paywalls) konularına bakın. ::: Builder ile bir onboarding oluşturduysanız, Kotlin Multiplatform uygulamanızda onu kullanıcıya göstermek için ekstra kod yazmanıza gerek yok. Böyle bir onboarding, hem neyin gösterileceğini hem de nasıl gösterileceğini kendi içinde barındırır. Başlamadan önce şunları tamamladığınızdan emin olun: 1. [Adapty Kotlin Multiplatform SDK](sdk-installation-kotlin-multiplatform) 3.16.1 veya daha yeni bir sürümünü yüklemiş olun. 2. Bir [onboarding oluşturmuş](create-onboarding) olun. 3. Onboarding'i bir [placement](placements)'a eklemiş olun. Adapty Kotlin Multiplatform SDK, onboarding'leri sunmak için iki yöntem sağlar: - **Compose Multiplatform ile** - **Compose Multiplatform olmadan** ## Compose Multiplatform ile \{#with-compose-multiplatform\} Bir onboarding göstermek için `createOnboardingView` metoduyla oluşturulan `view` üzerinde `view.present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Onboarding'i tekrar göstermeniz gerekiyorsa yeni bir `view` örneği oluşturmak için `createOnboardingView` metodunu bir kez daha çağırın. :::warning Aynı `view`'ı yeniden oluşturmadan tekrar kullanmak hataya yol açabilir. ::: ```kotlin showLineNumbers title="Kotlin Multiplatform" viewModelScope.launch { AdaptyUI.createOnboardingView(onboarding = onboarding).onSuccess { view -> view.present() }.onError { error -> // handle the error } } ``` ### iOS sunum stilini yapılandırma \{#configure-ios-presentation-style\} `present()` metoduna `iosPresentationStyle` parametresini geçerek onboarding'in iOS'ta nasıl sunulacağını yapılandırın. Parametre `AdaptyUIIOSPresentationStyle.FULLSCREEN` (varsayılan) veya `AdaptyUIIOSPresentationStyle.PAGESHEET` değerlerini kabul eder. ```kotlin showLineNumbers viewModelScope.launch { val view = AdaptyUI.createOnboardingView(onboarding = onboarding).getOrNull() view?.present(iosPresentationStyle = AdaptyUIIOSPresentationStyle.PAGESHEET) } ``` ### Onboarding'lerdeki linklerin nasıl açılacağını özelleştirme \{#customize-how-links-open-in-onboardings\} Varsayılan olarak, onboarding'lerdeki linkler uygulama içi tarayıcıda açılır. Bu, web sayfalarını uygulamanızın içinde görüntüleyerek kullanıcıların uygulamalar arasında geçiş yapmadan içerikleri incelemesini sağlar ve kesintisiz bir kullanıcı deneyimi sunar. Linklerin harici tarayıcıda açılmasını tercih ederseniz, `externalUrlsPresentation` parametresini `AdaptyWebPresentation.EXTERNAL_BROWSER` olarak ayarlayarak bu davranışı özelleştirebilirsiniz: ```kotlin showLineNumbers viewModelScope.launch { AdaptyUI.createOnboardingView( onboarding = onboarding, externalUrlsPresentation = AdaptyWebPresentation.EXTERNAL_BROWSER // default – IN_APP_BROWSER ).onSuccess { view -> view.present() }.onError { error -> // handle the error } } ``` ## Compose Multiplatform Olmadan \{#without-compose-multiplatform\} :::note `createNativeOnboardingView`, `io.adapty:adapty-kmp` çekirdek modülünün bir parçasıdır. Projeniz Compose Multiplatform kullanmıyorsa `io.adapty:adapty-kmp-ui` bağımlılığına ihtiyaç duymazsınız. ::: Compose Multiplatform olmadan bir onboarding eklemek için `createNativeOnboardingView` çağrısını yapın. Bu çağrı, layout'unuza eklediğiniz bir `AdaptyNativeOnboardingView` döndürür:
Örneğin, bir kullanıcı **Login** veya **Allow notifications** gibi özel bir butona dokunduğunda, `onCustomAction` delege metodu oluşturucudaki eylem ID'siyle tetiklenir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
```kotlin
class MyAdaptyUIOnboardingsEventsObserver : AdaptyUIOnboardingsEventsObserver {
override fun onboardingViewOnCustomAction(
view: AdaptyUIOnboardingView,
meta: AdaptyUIOnboardingMeta,
actionId: String
) {
when (actionId) {
"openPaywall" -> {
// Display paywall from onboarding
// You would typically fetch and present a new paywall here
mainUiScope.launch {
// Example: Get paywall by placement ID
// val paywallResult = Adapty.getPaywall("your_placement_id")
// paywallResult.onSuccess { paywall ->
// val paywallViewResult = AdaptyUI.createPaywallView(paywall)
// paywallViewResult.onSuccess { paywallView ->
// paywallView.present()
// }
// }
}
}
"allowNotifications" -> {
// Handle notification permissions
}
else -> {
// Handle other custom actions
}
}
}
}
// Set up the observer
AdaptyUI.setOnboardingsEventsObserver(MyAdaptyUIOnboardingsEventsObserver())
```
2. Abonelik grubu adına tıklayın. Ürünleriniz **Subscriptions** bölümünde listelenecektir.
3. Test ettiğiniz ürünün **Ready to Submit** olarak işaretlendiğinden emin olun. Değilse [App Store'daki Ürün](app-store-products) sayfasındaki talimatları izleyin.
4. Tablodaki ürün ID'sini Adapty Kontrol Paneli'ndeki [**Products**](https://app.adapty.io/products) sekmesindekiyle karşılaştırın. ID'ler eşleşmiyorsa tablodan ürün ID'sini kopyalayın ve Adapty Kontrol Paneli'nde bu ID ile [bir ürün oluşturun](create-product).
## Adım 3. Ürün kullanılabilirliğini kontrol edin \{#step-4-check-product-availability\}
1. **App Store Connect**'e geri dönün ve aynı **Subscriptions** bölümünü açın.
2. Ürünleri görüntülemek için abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Availability** bölümüne inin ve gerekli tüm ülke ve bölgelerin listelendiğinden emin olun.
## Adım 4. Ürün fiyatlarını kontrol edin \{#step-5-check-product-prices\}
1. **App Store Connect**'te **Monetization** → **Subscriptions** bölümüne gidin.
2. Abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Subscription Pricing** bölümüne inin ve **Current Pricing for New Subscribers** kısmını genişletin.
5. Gerekli tüm fiyatların listelendiğinden emin olun.
## Adım 5. Uygulamanın ücretli durumunu, banka hesabını ve vergi formlarının aktif olduğunu kontrol edin \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) ana sayfasında **Business** seçeneğine tıklayın.
2. Şirketinizin adını seçin.
3. Aşağı kaydırın ve **Paid Apps Agreement**, **Bank Account** ile **Tax forms** bilgilerinin hepsinin **Active** olarak göründüğünü doğrulayın.
Bu adımları izleyerek `InvalidProductIdentifiers` uyarısını çözebilir ve ürünlerinizi mağazada yayına alabilirsiniz.
## Adım 6. Ürün takılıysa yeniden oluşturun \{#step-6-recreate-the-product-if-its-stuck\}
1–5 arası adımların hepsi geçiyor olabilir — `Approved` durumu, eşleşen Bundle ID, geçerli API anahtarı — yine de SDK `1000 noProductIDsFound` hatası döndürüyor olabilir. Bu durumda ürün Apple'ın kayıt defterinde takılı kalmış olabilir. Apple'ın ürün kayıt defteri zaman zaman öyle bir duruma giriyor ki ürün App Store Connect'in arayüzünde görünüyor ama StoreKit arama yoluna açık olmuyor.
Ürünü App Store Connect'te silip aynı ürün kimliğiyle yeniden oluşturun. Yayılmanın tamamlanması için yeniden oluşturmanın ardından 24 saate kadar bekleyin.
---
# File: cantMakePayments-kmp
---
---
title: "Kotlin Multiplatform SDK'da Code-1003 cantMakePayment Hatasının Çözümü"
description: "Adapty'de abonelikleri yönetirken ödeme yapılamıyor hatasını giderin."
---
1003 hatası, `cantMakePayments`, bu cihazda uygulama içi satın alımların yapılamayacağını belirtir.
`cantMakePayments` hatasıyla karşılaşıyorsanız, bu genellikle şu nedenlerden biriyle ilgilidir:
- Cihaz kısıtlamaları: Bu hata Adapty ile ilgili değildir. Aşağıdaki çözüm yollarına bakın.
- Observer mode yapılandırması: `makePurchase` metodu ve observer mode aynı anda kullanılamaz. Aşağıdaki bölüme bakın.
## Sorun: Cihaz kısıtlamaları \{#issue-device-restrictions\}
| Sorun | Çözüm |
|------------------------------|------------------------------------------------------------------------------------------------------------------------------|
| Ekran Süresi kısıtlamaları | [Ekran Süresi](https://support.apple.com/en-us/102470) ayarlarında Uygulama İçi Satın Alım kısıtlamalarını devre dışı bırakın |
| Hesap askıya alındı | Hesap sorunlarını çözmek için Apple Destek ile iletişime geçin |
| Bölgesel kısıtlamalar | Desteklenen bir bölgeden App Store hesabı kullanın |
## Sorun: Observer mode ve makePurchase'ı birlikte kullanmak \{#issue-using-both-observer-mode-and-makepurchase\}
Satın alımları yönetmek için `makePurchases` kullanıyorsanız Observer mode'u kullanmanıza gerek yoktur. [Observer mode](observer-vs-full-mode), yalnızca satın alma mantığını kendiniz uyguladığınızda gereklidir.
Dolayısıyla `makePurchase` kullanıyorsanız, SDK etkinleştirme kodundan Observer mode'u etkinleştiren kısmı güvenle kaldırabilirsiniz.
---
# File: kmp-sdk-migration-guides
---
---
title: "Kotlin Multiplatform SDK Geçiş Kılavuzları"
description: "Adapty Kotlin Multiplatform SDK sürümleri için geçiş kılavuzları."
---
Bu sayfa, Adapty Kotlin Multiplatform SDK için tüm geçiş kılavuzlarını içermektedir. Ayrıntılı talimatlar için geçiş yapmak istediğiniz sürümü seçin:
- **[v4.0'a (beta) geçiş](migration-to-kmp-sdk-v4)**
- **[v3.15'e geçiş](migration-to-kmp-315)**
---
# File: migration-to-kmp-sdk-v4
---
---
title: "Adapty Kotlin Multiplatform SDK'yı v. 4.0'a Geçirin"
description: "Adapty Kotlin Multiplatform SDK v4.0 (beta) sürümüne geçiş yapın: paywall API'lerini flow API'leriyle değiştirin; hem Flow Builder hem de Paywall Builder ile uyumludur."
---
Adapty Kotlin Multiplatform SDK 4.0 (beta), flow'ları tanıtıyor ve paywall API'lerini buna göre yeniden adlandırıyor. Yeni API'ler hem yeni Flow Builder hem de mevcut Paywall Builder ile çalışır — Adapty Kontrol Paneli tarafında herhangi bir kurulum değişikliğine gerek yoktur.
## Hızlı referans \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.getPaywall(placementId, locale)` | `Adapty.getFlow(placementId)` |
| `Adapty.getPaywallForDefaultAudience(placementId, locale)` | `Adapty.getFlowForDefaultAudience(placementId)` |
| `Adapty.getPaywallProducts(paywall)` | `Adapty.getPaywallProducts(flow)` |
| `Adapty.logShowPaywall(paywall)` | `Adapty.logShowFlow(flow)` |
| `AdaptyPaywall` | `AdaptyFlow` |
| `AdaptyUI.createPaywallView(paywall, ...)` | `AdaptyUI.createFlowView(flow, ...)` |
| `AdaptyUI.createNativePaywallView(...)` → `AdaptyNativePaywallView` | `AdaptyUI.createNativeFlowView(...)` → `AdaptyNativeFlowView` |
| `AdaptyUIPaywallView` | `AdaptyUIFlowView` |
| `AdaptyUI.presentPaywallView(view)` / `dismissPaywallView(view)` | `AdaptyUI.presentFlowView(view)` / `dismissFlowView(view)` |
| `AdaptyUI.setPaywallsEventsObserver(observer)` | `AdaptyUI.setFlowsEventsObserver(observer)` |
| `AdaptyUI.registerPaywallEventsListener` / `unregisterPaywallEventsListener` | `AdaptyUI.registerFlowEventsListener` / `unregisterFlowEventsListener` |
| `AdaptyUIPaywallsEventsObserver` | `AdaptyUIFlowsEventsObserver` |
| `AdaptyUIPaywallPlatformView(paywall, ...)` | `AdaptyUIFlowPlatformView(flow, ...)` |
| `paywallViewDidPerformAction`, `paywallViewDidAppear` ve diğer `paywallView...` callback'leri | `flowViewDidPerformAction`, `flowViewDidAppear` ve diğer `flowView...` callback'leri |
| `paywallViewDidFailRendering` | `flowViewDidReceiveError` |
`AdaptyPaywallProduct` adını korur — ürünler hâlâ bir flow'a aittir ve `getPaywallProducts` de adını korur, artık bir `AdaptyFlow` alır. `getFlow` ve `getFlowForDefaultAudience` metodları artık `locale` parametresi almaz. Satın alma ve profil API'leri (`makePurchase`, `restorePurchases`, `getProfile`, `identify`, `updateProfile`) ve `setFallback` aracılığıyla yedekler değişmeden kalmıştır. Onboarding metodları hâlâ çalışır ancak kullanımdan kaldırılmıştır — bkz. [Onboarding API kullanımdan kaldırma](#onboarding-api-deprecation). Bazı varsayılan davranışlar değişmiştir — bkz. [Varsayılan davranış değişiklikleri](#default-behavior-changes).
## Kurulum \{#installation\}
v4.0 bir ön sürüm olduğundan, tam sürümü sabitleyin — Gradle dinamik aralıklarla ön sürümleri seçmez:
```toml showLineNumbers title="libs.versions.toml"
[versions]
adapty-kmp = "4.0.0-beta.1"
[libraries]
adapty-kmp = { module = "io.adapty:adapty-kmp", version.ref = "adapty-kmp" }
adapty-kmp-ui = { module = "io.adapty:adapty-kmp-ui", version.ref = "adapty-kmp" }
```
`adapty-kmp-ui` modülü yalnızca flow'ları ve paywallları Compose Multiplatform katmanıyla (`view.present()`) render ediyorsanız gereklidir. Tam kurulum için [Adapty SDK'yı Yükle](sdk-installation-kotlin-multiplatform) sayfasına bakın.
Altta yatan yerel Adapty SDK'ları her iki platformda da 4.x sürümlerine güncellendi ve otomatik olarak çözümleniyor — herhangi bir derleme değişikliğine gerek yok. iOS deployment target bu sürümle değişmeden **15.0** olarak kalmaktadır.
## Flow'ları Getirme \{#fetching-flows\}
### getPaywall → getFlow
Döndürülen tür `AdaptyPaywall` yerine `AdaptyFlow` olarak değişir ve `locale` parametresi kaldırılır — bir flow render ettiğinizde locale otomatik olarak belirlenir; özel paywall'lar için tüm locale'ler `flow.remoteConfigs` içinde döner:
```diff showLineNumbers
- Adapty.getPaywall("YOUR_PLACEMENT_ID", locale = "en")
- .onSuccess { paywall ->
- // use the paywall
+ Adapty.getFlow("YOUR_PLACEMENT_ID")
+ .onSuccess { flow ->
+ // use the flow
}
.onError { error ->
// handle the error
}
```
`getPaywallForDefaultAudience` aynı şekilde yeniden adlandırıldı:
```diff showLineNumbers
- Adapty.getPaywallForDefaultAudience("YOUR_PLACEMENT_ID", locale = "en")
+ Adapty.getFlowForDefaultAudience("YOUR_PLACEMENT_ID")
```
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` adını korur ancak artık bir `AdaptyFlow` alır:
```diff showLineNumbers
- Adapty.getPaywallProducts(paywall)
+ Adapty.getPaywallProducts(flow)
.onSuccess { products ->
// use the products
}
```
## Veri modeli \{#data-model\}
`getFlow`, `AdaptyPaywall` yerine `AdaptyFlow` döndürür ve nesne yapısı değişti:
| v3 `AdaptyPaywall` özelliği | v4 `AdaptyFlow` özelliği | İşlem |
|---|---|---|
| `remoteConfig: AdaptyRemoteConfig?` (tek) | `remoteConfigs: List
### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin, uygulamanıza giriş yaptıktan veya kayıt olduktan sonra), customer user ID'yi ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty onu otomatik olarak mevcut profile bağlar.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı kimlikleri her kullanıcı için benzersiz olmalıdır. Parametre değerini sabit kodlarsanız, tüm kullanıcılar aynı kişi olarak değerlendirilir.
:::
Diğer SDK metodlarını çağırmadan önce her zaman `identify` işlemini `await` ile bekleyin. Eş zamanlı çağrılar `#3006 profileWasChanged` hatasına yol açar ya da anonim profile düşer. Bkz. [React Native SDK'da çağrı sırası](react-native-sdk-call-order).
```typescript showLineNumbers
try {
await adapty.identify("YOUR_USER_ID"); // Her kullanıcı için benzersiz
// successfully identified
} catch (error) {
// handle the error
}
```
### SDK etkinleştirme sırasında \{#during-the-sdk-activation\}
SDK'yı etkinleştirdiğinizde zaten bir customer user ID biliyorsanız, `identify`'ı ayrıca çağırmak yerine bunu `activate` metodunda gönderebilirsiniz.
Customer user ID biliyorsanız ancak bunu yalnızca etkinleştirmeden sonra ayarlıyorsanız, etkinleştirme sırasında Adapty yeni bir anonim profil oluşturacak ve `identify` çağrısından sonra mevcut profile geçecektir.
Mevcut bir customer user ID (daha önce kullandığınız) veya yeni bir tane gönderebilirsiniz. Yeni bir tane gönderirseniz, etkinleştirme sırasında oluşturulan yeni profil otomatik olarak customer user ID'ye bağlanır.
:::note
Varsayılan olarak, anonim profil oluşturma, kurulumlar cihaz ID'lerine göre sayıldığı için analitik panolarını etkilemez.
Bir cihaz ID'si, cihazdaki mağazadan yapılan tek bir uygulama kurulumunu temsil eder ve yalnızca uygulama yeniden yüklendikten sonra yeniden oluşturulur.
Bu, bunun ilk mi yoksa tekrar mı yükleme olduğundan ya da mevcut bir customer user ID kullanılıp kullanılmadığından bağımsızdır.
Profil oluşturma (SDK etkinleştirme veya oturum kapatma sırasında), giriş yapma veya uygulamayı yeniden yüklemeden yükseltme, ek kurulum olayı oluşturmaz.
Kurulumları cihazlar yerine benzersiz kullanıcılara göre saymak istiyorsanız, **App settings** bölümüne gidin ve [**Installs definition for analytics**](general#4-installs-definition-for-analytics) ayarını yapılandırın.
:::
```typescript showLineNumbers
adapty.activate("PUBLIC_SDK_KEY", {
customerUserId: "YOUR_USER_ID" // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
});
```
### Kullanıcıların oturumunu kapatma \{#log-users-out\}
Kullanıcıların oturumunu kapatmak için bir butonunuz varsa, `logout` metodunu kullanın.
:::important
Kullanıcının oturumunu kapatmak, kullanıcı için yeni bir anonim profil oluşturur.
:::
```typescript showLineNumbers
try {
await adapty.logout();
// successful logout
} catch (error) {
// handle the error
}
```
:::info
Kullanıcıları uygulamaya tekrar giriş yaptırmak için `identify` metodunu kullanın.
:::
### Giriş yapmadan satın almaya izin verme \{#allow-purchases-without-login\}
Kullanıcılarınız uygulamanıza giriş yapmadan önce ve sonra satın alma yapabiliyorsa, giriş yaptıktan sonra erişimlerini koruyacaklarından emin olmanız gerekir:
1. Oturumu kapalı bir kullanıcı satın alma yaptığında, Adapty bunu anonim profil ID'siyle ilişkilendirir.
2. Kullanıcı hesabına giriş yaptığında, Adapty tanımlanmış profiliyle çalışmaya geçer.
- Yeni bir customer user ID ise (örneğin, satın alma kayıt öncesinde yapıldıysa), Adapty customer user ID'yi mevcut profile atar ve tüm satın alma geçmişi korunur.
- Mevcut bir customer user ID ise (customer user ID zaten bir profille bağlantılıysa), profil değişikliğinden sonra gerçek access level'ı almanız gerekir. Tanımlamanın hemen ardından [`getProfile`](react-native-check-subscription-status) çağırabilir veya verilerin otomatik senkronize edilmesi için [profil güncellemelerini dinleyebilirsiniz](react-native-check-subscription-status).
## Sonraki adımlar \{#next-steps\}
Tebrikler! Uygulamanızda uygulama içi ödeme mantığını hayata geçirdiniz! Uygulama monetizasyonunuzda başarılar dileriz!
Adapty'den daha fazla yararlanmak için şu konuları inceleyebilirsiniz:
- [**Test etme**](troubleshooting-test-purchases): Her şeyin beklendiği gibi çalıştığından emin olun
- [**Onboarding'ler**](react-native-onboardings): Onboarding'lerle kullanıcıları etkileyin ve elde tutma oranını artırın
- [**Entegrasyonlar**](configuration): Tek satır kodla pazarlama attribution ve analitik hizmetleriyle entegre olun
- [**Özel profil özellikleri ayarlama**](react-native-setting-user-attributes): Kullanıcı profillerine özel özellikler ekleyin ve segmentler oluşturun; böylece A/B testleri başlatabilir veya farklı kullanıcılara farklı paywall'lar gösterebilirsiniz
---
# File: adapty-sdk-integration-skill-react-native
---
---
title: "SDK entegrasyon becerisini kullanarak Adapty'yi React Native uygulamanıza entegre edin"
description: "Adapty SDK'sını React Native uygulamanıza baştan sona entegre etmek için AI kodlama aracınızla adapty-sdk-integration becerisini kullanın."
---
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
:::important
Bu beceri beta aşamasındadır. Takılı kalır veya beklenmedik şekilde davranırsa, [adım adım entegrasyon kılavuzunu](adapty-cursor-react-native) takip edin — AI aracınızı her aşamada doğru belgelerle yönlendirir.
:::
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
---
# File: adapty-cursor-react-native
---
---
title: "Adapty'yi AI yardımıyla React Native uygulamanıza entegre edin"
description: "Cursor, Context7, ChatGPT, Claude veya diğer AI araçlarını kullanarak Adapty'yi React Native uygulamanıza adım adım entegre etme kılavuzu."
---
Bu kılavuz, bir yapay zeka kodlama aracıyla React Native uygulamanıza Adapty'yi adım adım entegre etmenizi anlatıyor — doğru Adapty dokümanlarını doğru sırayla besleyerek ilerleyebilirsiniz.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Başlamadan önce: kontrol paneli kurulumu \{#before-you-start-dashboard-setup\}
Adapty, herhangi bir SDK kodu yazmadan önce kontrol panelinde bazı yapılandırmalar yapılmasını gerektirir. Bunu etkileşimli bir LLM aracıyla ya da Kontrol Paneli üzerinden manuel olarak yapabilirsiniz.
### Skill yaklaşımı (önerilen) \{#skill-approach-recommended\}
Adapty CLI skill, LLM'inizin uygulamanızı, ürünlerinizi, access level'larınızı, paywall'larınızı ve placement'larınızı doğrudan ayarlamasını sağlar — her adım için Kontrol Paneli'ni açmanıza gerek kalmaz. Yalnızca Kontrol Paneli'nde [mağazalarınızı bağlamanız](integrate-payments) yeterlidir.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Skill eklendikten sonra agent'ınızda `/adapty-cli` komutunu çalıştırın. Mağazalarınızı bağlamak için Kontrol Paneli'ni ne zaman açmanız gerektiği de dahil olmak üzere her adımda sizi yönlendirecektir.
### Kontrol Paneli Yaklaşımı \{#dashboard-approach\}
Her şeyi manuel olarak yapılandırmayı tercih ediyorsanız, herhangi bir kod yazmadan önce bunlara ihtiyacınız var. LLM'iniz kontrol paneli değerlerini sizin için bulamaz; bunları kendiniz sağlamanız gerekir.
1. **Uygulama mağazalarınızı bağlayın**: Adapty Kontrol Paneli'nde **App settings → General** bölümüne gidin. Uygulamanız her iki platformu da hedefliyorsa App Store ve Google Play'i bağlayın. Satın almaların çalışması için bu gereklidir.
[Uygulama mağazalarını bağla](integrate-payments)
2. **Public SDK anahtarınızı kopyalayın**: Adapty Kontrol Paneli'nde **App settings → General** sayfasına gidin ve **API keys** bölümünü bulun. Kodda bu, `adapty.activate("YOUR_PUBLIC_SDK_KEY")` çağrısına geçirdiğiniz string'dir.
3. **En az bir ürün oluşturun**: Adapty Kontrol Paneli'nde **Products** sayfasına gidin. Ürünlere koddan doğrudan erişmenize gerek yok — Adapty bunları paywall'lar aracılığıyla iletir.
[Ürün ekle](quickstart-products)
4. **Paywall ve placement oluşturun**: Adapty Kontrol Paneli'nde **Paywalls** sayfasında bir paywall oluşturun, ardından **Placements** sayfasında bir placement'a atayın. Kodda, placement ID'si `adapty.getPaywall("YOUR_PLACEMENT_ID")` fonksiyonuna geçirdiğiniz string değerdir.
[Paywall oluştur](quickstart-paywalls)
5. **Access level'ları ayarlayın**: Adapty Kontrol Paneli'nde, **Products** sayfasından her ürün için yapılandırın. Kodda, `profile.accessLevels['premium']?.isActive` içinde kontrol edilen string'dir. Varsayılan `premium` access level çoğu uygulama için yeterlidir. Ödeme yapan kullanıcılar ürüne göre farklı özelliklere erişiyorsa (örneğin `basic` plan ile `pro` plan), kodlamaya başlamadan önce [ek access level'lar oluşturun](assigning-access-level-to-a-product).
:::tip
Beşine de sahip olduğunuzda, kod yazmaya hazırsınız. LLM'inize şunu söyleyin: "Public SDK anahtarım X, placement ID'im Y" — böylece doğru başlatma ve paywall çekme kodunu üretebilir.
:::
### Hazır olduğunuzda kurulum \{#set-up-when-ready\}
Kodlamaya başlamak için bunlar gerekli değildir, ancak entegrasyonunuz olgunlaştıkça bunlara ihtiyaç duyacaksınız:
- **A/B testleri**: **Placements** sayfasından yapılandırın. Kod değişikliği gerekmez.
[A/B testleri](ab-tests)
- **Ek paywall'lar ve placement'lar**: Farklı placement ID'leriyle daha fazla `getPaywall` çağrısı ekleyin.
- **Analitik entegrasyonlar**: **Integrations** sayfasından yapılandırın. Kurulum entegrasyona göre değişir. Bkz. [analitik entegrasyonlar](analytics-integration) ve [attribution entegrasyonlar](attribution-integration).
## LLM'inize Adapty Dokümanlarını Besleyin \{#feed-adapty-docs-to-your-llm\}
### Context7'yi Kullanın (önerilen)
[Context7](https://context7.com), LLM'inizin güncel Adapty belgelerine doğrudan erişmesini sağlayan bir MCP sunucusudur. LLM'iniz, sorduğunuz şeye göre doğru belgeleri otomatik olarak getirir — URL yapıştırmanıza gerek kalmaz.
Context7; **Cursor**, **Claude Code**, **Windsurf** ve diğer MCP uyumlu araçlarla çalışır. Kurulum için şunu çalıştırın:
```
npx ctx7 setup
```
Bu komut, kullandığınız editörü algılar ve Context7 sunucusunu yapılandırır. Manuel kurulum için [Context7 GitHub deposuna](https://github.com/upstash/context7) bakın.
Yapılandırıldıktan sonra, Adapty kütüphanesine prompt'larınızda şu şekilde referans verin:
```
Use the adaptyteam/adapty-docs library to look up how to install the React Native SDK
```
:::warning
Context7, dok bağlantılarını elle yapıştırma ihtiyacını ortadan kaldırsa da uygulama sırası önemlidir. Her şeyin düzgün çalıştığından emin olmak için aşağıdaki [uygulama adımlarını](#implementation-walkthrough) sırayla takip edin.
:::
### Düz metin dokümanları kullanın \{#use-plain-text-docs\}
Her Adapty dokümanına düz metin Markdown olarak erişebilirsiniz. URL'nin sonuna `.md` ekleyin ya da makale başlığının altındaki **Copy for LLM** butonuna tıklayın. Örnek: [adapty-cursor-react-native.md](https://adapty.io/docs/tr/adapty-cursor-react-native.md).
Aşağıdaki [uygulama adım adım rehberindeki](#implementation-walkthrough) her adım, yapıştırabileceğiniz `.md` bağlantılarını içeren "LLM'inize gönderin" bloğu içerir.
Daha fazla dokümanı aynı anda görüntülemek için aşağıdaki [indeks dosyaları ve platforma özgü alt kümeler](#plain-text-doc-index-files) bölümüne bakın.
## Uygulama adım adım rehberi \{#implementation-walkthrough\}
Bu rehberin geri kalanı, Adapty entegrasyonunu uygulama sırasına göre adım adım ele alır. Her aşamada LLM'inize göndereceğiniz belgeler, tamamlandığında ne görmeniz gerektiği ve sık karşılaşılan sorunlar açıklanmaktadır.
### Entegrasyonunuzu planlayın \{#plan-your-integration\}
Koda geçmeden önce, LLM'inizden projenizi analiz etmesini ve bir uygulama planı oluşturmasını isteyin. AI aracınız bir planlama modunu destekliyorsa (Cursor'ın veya Claude Code'un plan modu gibi), LLM'nin herhangi bir kod yazmadan önce hem proje yapınızı hem de Adapty dokümanlarını okuyabilmesi için bunu kullanın.
LLM'inize satın almalar için hangi yaklaşımı kullandığınızı söyleyin — bu, izlemesi gereken kılavuzları etkiler:
- [**Adapty Paywall Builder**](adapty-paywall-builder): Adapty'nin no-code builder'ında paywall'lar oluşturursunuz ve SDK bunları otomatik olarak render eder.
- [**Manuel oluşturulan paywall'lar**](react-native-making-purchases): Kendi paywall arayüzünüzü kodla oluşturursunuz, ancak ürünleri almak ve satın almaları yönetmek için yine de Adapty'yi kullanırsınız.
- [**Observer mode**](observer-vs-full-mode): Mevcut satın alma altyapınızı korur ve Adapty'yi yalnızca analitik ve entegrasyonlar için kullanırsınız.
Hangisini seçeceğinizden emin değil misiniz? [Hızlı başlangıçtaki karşılaştırma tablosunu](react-native-quickstart-paywalls) okuyun.
### SDK'yı yükleyin ve yapılandırın \{#install-and-configure-the-sdk\}
Adapty SDK bağımlılığını npm (veya yarn) ile ekleyin ve Public SDK anahtarınızla etkinleştirin. Bu, temel adımdır — geri kalan her şey buna bağlıdır.
Expo ve saf React Native projeleri için ayrı kurulum kılavuzlarımız var — kurulumunuza uyan kılavuzu seçin.
**Kılavuzlar:**
- [Expo ile kurulum](sdk-installation-react-native-expo)
- [Saf React Native ile kurulum](sdk-installation-react-native-pure)
:::tip[Checkpoint]
- **Beklenen:** Uygulama hem iOS hem Android'de derleniyor ve çalışıyor. Metro bundler loglarında Adapty aktivasyon logu görünüyor.
- **Dikkat:** "Public API key is missing" → **App settings** bölümündeki gerçek anahtarınızla placeholder'ı değiştirdiğinizi kontrol edin.
:::
### Paywallları göster ve satın almaları yönet \{#show-paywalls-and-handle-purchases\}
Placement ID ile bir paywall getir, göster ve satın alma olaylarını yönet. İhtiyacın olan kılavuzlar, satın almaları nasıl yönettiğine göre değişir.
Her satın almayı ilerlerken sandbox'ta test et — sona bırakma. Kurulum talimatları için [Sandbox'ta satın almaları test et](test-purchases-in-sandbox) sayfasına bak.
Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Ayrıca paywall'ları daha hızlı getirmek için CDN'i ve CDN erişilemez olduğunda bağımsız bir yedek sunucuyu kullanırız. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman paywall'larınızın en son sürümünü almanızı garanti etmek için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, bu metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa, önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun, işlem alt katmanda farklı isteklerden oluşabileceği için `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın.
Android için: `TimeInterval`'ı uzantı fonksiyonlarıyla (`5.seconds` gibi, burada `.seconds`, `import com.adapty.utils.seconds`'ten gelir) veya `TimeInterval.seconds(5)` ile oluşturabilirsiniz. Sınırlama olmaması için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | Flow'un tanımlayıcılarını (`id`, `variationId`), adını, placement'ını, paywall varyasyonlarını (`paywalls`) ve varsa remote config'lerini (`remoteConfigs`) içeren bir `AdaptyFlow` nesnesi. | ## View yapılandırmasını getirme \{#fetch-the-view-configuration\} :::important Builder'da **Show on device** geçiş düğmesini etkinleştirdiğinizden emin olun. Bu seçenek açık değilse, view yapılandırması alınamaz. ::: Placement **Flow Builder**'da veya **Paywall Builder**'da tasarlandıysa, Adapty arayüzü sizin için render eder. View'i `createFlowView` ile oluşturun, ardından [flow veya paywall'ı sunun](react-native-present-paywalls). Placement, Builder arayüzü olmayan özel bir paywall ise, bunun yerine [onu bir remote config paywall'ı olarak yönetin](present-remote-config-paywalls-react-native). React Native SDK'da `createFlowView`'u doğrudan çağırın — önce view yapılandırmasını getirmenize gerek yoktur. :::warning `createFlowView` metodunun sonucu yalnızca bir kez kullanılabilir. Onu tekrar kullanmanız gerekirse, `createFlowView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak, `AdaptyUIError.viewAlreadyPresented` hatasıyla sonuçlanabilir. ::: ```typescript showLineNumbers try { const view = await createFlowView(flow); } catch (error) { // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | zorunlu | İstenen flow/paywall için bir controller elde etmek amacıyla kullanılan `AdaptyFlow` nesnesi. | | **customTags** | isteğe bağlı | Özel etiketler ve çözümlenmiş değerlerinden oluşan bir sözlük tanımlar. Özel etiketler içerikte yer tutucu işlevi görür; flow/paywall içinde kişiselleştirilmiş içerik sunmak için belirli dizelerle dinamik olarak değiştirilir. Daha fazla bilgi için Paywall Builder'da özel etiketler konusuna bakın. | | **prefetchProducts** | isteğe bağlı | Ekrandaki ürünlerin görüntülenme zamanlamasını optimize etmek için etkinleştirin. `true` olarak ayarlandığında AdaptyUI gerekli ürünleri otomatik olarak çeker. Varsayılan: `false`. | | **android.enableSafeArea** | isteğe bağlı | Yalnızca Android (iOS'ta yoksayılır). İç içe nesne olarak geçirin: `android: { enableSafeArea: true }`. `true` olduğunda flow görünümü güvenli alan dolguları uygular. Modal sunum için varsayılan `true`'dur (`createFlowView` + `present()`), yerleşik `AdaptyFlowView` bileşeni için ise `false`'tur. Varsayılan değer çoğu durum için uygundur. | :::note Birden fazla dil kullanıyorsanız, bir [flow yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi ve locale kodlarını doğru şekilde kullanmayı [buradan](react-native-localizations-and-locale-codes) öğrenin. ::: View'e sahip olduğunuzda, [flow/paywall'ı sunun](react-native-present-paywalls). ## Daha hızlı getirmek için varsayılan bir kitle için flow veya paywall alma \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle flow'lar ve paywall'lar neredeyse anında getirilir, bu yüzden bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitleniz ve placement'ınız olduğu ve kullanıcılarınızın zayıf internet bağlantısı olduğu durumlarda, bir flow veya paywall'ı getirmek istediğinizden daha uzun sürebilir. Bu tür durumlarda, hiçbir şey göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir flow veya paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın flow veya paywall'ını **All Users** kitlesi için getiren `getFlowForDefaultAudience` metodunu kullanabilirsiniz. Ancak, önerilen yaklaşımın yukarıdaki [Flow/paywall getirme](#fetch-flowpaywall) bölümünde ayrıntılı olarak açıklandığı gibi flow veya paywall'ı `getFlow` metoduyla getirmek olduğunu anlamak çok önemlidir. :::warning `getFlow` kullanmanızı neden öneriyoruz `getFlowForDefaultAudience` metodu birkaç önemli dezavantajla birlikte gelir: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywall'lar göstermeniz gerekiyorsa, zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywall'lar tasarlamanız ya da mevcut (eski) sürüme sahip kullanıcıların render edilmemiş paywall'larla sorun yaşayabileceğini kabul etmeniz gerekir. - **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görür; bu da kişiselleştirilmiş hedeflemeyi kaybettiğiniz anlamına gelir (ülkelere, pazarlama attribution'ına veya kendi özel niteliklerinize dayalı olanlar dahil). Daha hızlı flow veya paywall getirmeden yararlanmak için bu dezavantajları kabul etmeye istekliyseniz, `getFlowForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde, [yukarıda](#fetch-flowpaywall) açıklanan `getFlow`'a bağlı kalın. ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const flow = await adapty.getFlowForDefaultAudience(id); // the requested flow/paywall } catch (error) { // handle the error } ``` | Parametre | Zorunlu | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | gerekli | [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nizde bir placement oluştururken belirttiğiniz değerdir. | | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
| ## Asset'leri özelleştirme \{#customize-assets\} Flow/paywall'ınızdaki görselleri ve videoları özelleştirmek için özel asset'leri uygulayın. Hero görsellerinin ve videolarının önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir asset paketinde, bu öğeleri ID'leriyle hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için, Adapty kontrol panelinde [özel bir ID ayarlamanız](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterme. - Uzak bir ana görsel yüklenirken yerel bir önizleme görseli gösterme. - Bir videoyu çalıştırmadan önce bir önizleme görseli gösterme. :::important Bu özelliği kullanmak için Adapty React Native SDK'yı 3.8.0 veya daha yüksek bir sürüme güncelleyin. ::: Basit bir sözlük aracılığıyla özel varlıkları nasıl sağlayabileceğinize dair bir örnek: ```javascript const customAssets: Recordisteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) konusuna bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere sahip olmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internetle karşılaştığını düşünüyorsanız, önbellekte veri varsa önbelleğe alınmış verileri döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süresi yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı almak için CDN ve CDN'e ulaşılamadığı durumlarda bağımsız bir yedek sunucu da kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken paywalllarınızın her zaman en son sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, bu metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa, önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem perde arkasında farklı isteklerden oluşabilir.
Android için: `TimeInterval`'ı uzantı fonksiyonlarıyla oluşturabilirsiniz (örneğin `5.seconds`, `.seconds` burada `import com.adapty.utils.seconds` içindendir) veya `TimeInterval.seconds(5)`. Sınırlama olmadan ayarlamak için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Ürün ID'lerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) nesnesi. | ## Paywall Builder kullanılarak tasarlanan paywallın görünüm yapılandırmasını çekme \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse, görünüm yapılandırması alınamaz. ::: Paywall'u çektikten sonra, Paywall Builder kullanılarak oluşturulduğunu gösteren bir `ViewConfiguration` içerip içermediğini kontrol edin. Bu, paywallı nasıl görüntüleyeceğiniz konusunda size rehberlik edecektir. `ViewConfiguration` mevcutsa, bunu bir Paywall Builder paywall'u olarak ele alın; değilse, [bunu bir remote config paywall'u olarak işleyin](present-remote-config-paywalls-react-native). React Native SDK'da, görünüm yapılandırmasını manuel olarak önceden çekmeden doğrudan `createPaywallView` metodunu çağırın. :::warning `createPaywallView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa, `createPaywallView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak `AdaptyUIError.viewAlreadyPresented` hatasına neden olabilir. ::: ```typescript showLineNumbers // for the Adapty SDK < 3.14 – import {createPaywallView} from 'react-native-adapty/dist/ui'; if (paywall.hasViewConfiguration) { try { const view = await createPaywallView(paywall); } catch (error) { // handle the error } } else { //use your custom logic } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------- | :------- | :----------------------------------------------------------- | | **paywall** | zorunlu | İstenen paywall için bir controller almak üzere kullanılan `AdaptyPaywall` nesnesi. | | **customTags** | isteğe bağlı | Özel etiketlerin ve çözümlenmiş değerlerinin bir sözlüğünü tanımlar. Özel etiketler, paywall içeriğinde yer tutucu olarak kullanılır ve paywall içinde kişiselleştirilmiş içerik sağlamak amacıyla belirli dizelerle dinamik olarak değiştirilir. Daha fazla ayrıntı için Paywall Builder'da Özel Etiketler konusuna bakın. | | **prefetchProducts** | isteğe bağlı | Ekrandaki ürünlerin görüntülenme zamanlamasını optimize etmek için etkinleştirin. `true` olarak ayarlandığında AdaptyUI, gerekli ürünleri otomatik olarak getirir. Varsayılan: `false`. | :::note Birden fazla dil kullanıyorsanız, [Paywall Builder yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi ve yerel ayar kodlarını doğru şekilde nasıl kullanacağınızı [buradan](react-native-localizations-and-locale-codes) öğrenin. ::: Görünümü aldıktan sonra, [paywall'u sunun](react-native-present-paywalls). ## Daha hızlı çekmek için varsayılan kitle için paywall alma \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle paywalllar neredeyse anında çekilir, dolayısıyla bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve paywallınız olduğu ve kullanıcılarınızın zayıf bir internet bağlantısına sahip olduğu durumlarda, bir paywall çekmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç paywall göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın paywallını **Tüm Kullanıcılar** kitlesi için çeken `getPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Paywall Bilgilerini Çekme](#fetch-paywall-designed-with-paywall-builder) bölümünde ayrıntılandırıldığı gibi `getPaywall` metoduyla paywall çekmek olduğunu anlamak önemlidir. :::warning `getPaywall` kullanmanızı neden öneriyoruz `getPaywallForDefaultAudience` metodu birkaç önemli dezavantajla birlikte gelir: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri için (mevcut ve gelecekteki) farklı paywalllar göstermeniz gerekiyorsa, zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywalllar tasarlamak zorunda kalacaksınız ya da mevcut (eski) sürüme sahip kullanıcıların render edilmemiş paywalllarla sorun yaşayabileceğini kabul edeceksiniz. - **Hedefleme kaybı**: Tüm kullanıcılar **Tüm Kullanıcılar** kitlesi için tasarlanmış aynı paywall'u görecek; bu da kişiselleştirilmiş hedeflemeyi (ülkeler, pazarlama attribution veya kendi özel özelliklerinize dayalı hedefleme dahil) kaybetmeniz anlamına gelir. Daha hızlı paywall çekme avantajından yararlanmak için bu dezavantajları kabul etmeye hazırsanız, `getPaywallForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde [yukarıda](#fetch-paywall-designed-with-paywall-builder) açıklanan `getPaywall` metoduna bağlı kalın. ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const paywall = await adapty.getPaywallForDefaultAudience(id, locale); // the requested paywall } catch (error) { // handle the error } ``` :::note `getPaywallForDefaultAudience` metodu, React Native SDK 2.11.2 sürümünden itibaren kullanılabilir. ::: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](react-native-localizations-and-locale-codes) konusuna bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere sahip olmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internetle karşılaştığını düşünüyorsanız, önbellekte veri varsa önbelleğe alınmış verileri döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süresi yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
| ## Varlıkları özelleştirme \{#customize-assets\} Paywallınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görselleri ve videolarının önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leri aracılığıyla hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID ayarlamanız](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterme. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterme. - Bir video çalıştırmadan önce önizleme görseli gösterme. :::important Bu özelliği kullanmak için, Adapty React Native SDK'yı sürüm 3.8.0 veya üzerine güncelleyin. ::: Özel asset'leri basit bir sözlük aracılığıyla nasıl sağlayabileceğinize dair bir örnek: ```javascript const customAssets: Record
## Paywall görüntüleme sayısı çok yüksek \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntüleme sayısı beklenenin iki katını gösteriyor.
**Neden**: Kodunuzda `logShowFlow` (React Native SDK v4+) / `logShowPaywall` çağırıyor olabilirsiniz; bu, Paywall Builder veya Flow Builder kullanıyorsanız görüntüleme sayısını ikiye katlar. Bu araçlarla oluşturulmuş flow'lar ve paywall'lar için analizler otomatik olarak izlenir, bu yüzden bu metodu kullanmanıza gerek yoktur.
**Çözüm**: Paywall Builder veya Flow Builder kullanıyorsanız, kodunuzda `logShowFlow` (React Native SDK v4+) / `logShowPaywall` çağırmadığınızdan emin olun.
## Diğer sorunlar \{#other-issues\}
**Sorun**: Yukarıda ele alınmayan başka Paywall Builder sorunları yaşıyorsunuz.
**Çözüm**: Gerekirse [migration kılavuzlarını](react-native-sdk-migration-guides) kullanarak SDK'yı en son sürüme güncelleyin. Pek çok sorun yeni SDK sürümlerinde çözülmüştür.
---
# File: react-native-quickstart-manual
---
---
title: "React Native SDK'da özel paywall'ınızda satın almaları etkinleştirme"
description: "Uygulama içi satın almaları etkinleştirmek için Adapty SDK'yı özel React Native paywall'larınıza entegre edin."
---
Bu rehber, Adapty'yi özel paywall'larınıza nasıl entegre edeceğinizi açıklar. Paywall uygulamanız üzerinde tam kontrolü elinizde tutarken, Adapty SDK ürünleri getirir, yeni satın almaları yönetir ve önceki satın almaları geri yükler.
:::important
**Bu rehber, özel paywall'lar geliştiren geliştiriciler içindir.** Satın almaları etkinleştirmenin en kolay yolunu istiyorsanız, [Adapty Flow Builder](react-native-quickstart-paywalls)'ı kullanın. Flow Builder ile flow'ları kod gerektirmeyen görsel bir editörde oluşturursunuz, Adapty tüm satın alma mantığını otomatik olarak yönetir ve farklı tasarımları uygulamanızı yeniden yayınlamadan test edebilirsiniz.
:::
## Başlamadan önce \{#before-you-start\}
### Ürünleri ayarlayın \{#set-up-products\}
Uygulama içi satın almaları etkinleştirmek için üç temel kavramı anlamanız gerekir:
- [**Ürünler**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Paywalllar**](paywalls) – hangi ürünlerin sunulacağını tanımlayan yapılandırmalar. Adapty'de paywalllar, ürünleri almanın tek yoludur; ancak bu tasarım sayesinde uygulama kodunuza dokunmadan ürünleri, fiyatları ve teklifleri değiştirebilirsiniz.
- [**Placement'lar**](placements) – uygulamanızda paywallları nerede ve ne zaman göstereceğiniz (`main`, `onboarding`, `settings` gibi). Kontrol panelinde placement'lar için paywalllar ayarlarsınız, ardından kodunuzda placement ID'si ile bunları talep edersiniz. Bu, A/B testleri yapmanızı ve farklı kullanıcılara farklı paywalllar göstermenizi kolaylaştırır.
Özel paywall üzerinde çalışıyor olsanız bile bu kavramları anladığınızdan emin olun. Temel olarak bunlar, uygulamanızda sattığınız ürünleri yönetme yönteminizdir.
Özel paywallinizi uygulamak için bir **paywall** oluşturmanız ve bunu bir **placement**'a eklemeniz gerekir. Bu yapılandırma, ürünlerinizi almanıza olanak tanır. Kontrol panelinde ne yapmanız gerektiğini anlamak için [buradaki](quickstart) hızlı başlangıç kılavuzunu takip edin.
### Kullanıcıları yönetin \{#manage-users\}
Kendi tarafınızda backend kimlik doğrulaması ile veya olmadan çalışabilirsiniz.
Ancak Adapty SDK, anonim ve kimliği doğrulanmış kullanıcıları farklı şekilde ele alır. Ayrıntıları anlamak ve kullanıcılarla doğru şekilde çalıştığınızdan emin olmak için [kimlik doğrulama hızlı başlangıç kılavuzunu](react-native-quickstart-identify) okuyun.
## Adım 1. Ürünleri getirin \{#step-1-get-products\}
Özel paywall'ınız için ürünleri getirmek üzere şunları yapmanız gerekir:
1. `getFlow` metoduna [placement](placements) ID'sini geçirerek `flow` nesnesini alın.
2. `getPaywallProducts` metodunu kullanarak bu flow için ürünler dizisini alın.
```typescript showLineNumbers
async function loadPaywall() {
try {
const flow: AdaptyFlow = await adapty.getFlow('YOUR_PLACEMENT_ID');
const products: AdaptyPaywallProduct[] = await adapty.getPaywallProducts(flow);
// Use products to build your custom paywall UI
} catch (error) {
// Handle the error
}
}
```
## Adım 2. Satın almaları kabul edin \{#step-2-accept-purchases\}
Kullanıcı özel paywallınızdaki bir ürüne dokunduğunda, seçilen ürünle birlikte `makePurchase` metodunu çağırın. Bu işlem satın alma akışını yönetir ve güncellenmiş profili döndürür.
```typescript showLineNumbers
async function purchaseProduct(product: AdaptyPaywallProduct) {
try {
const purchaseResult: AdaptyPurchaseResult = await adapty.makePurchase(product);
switch (purchaseResult.type) {
case 'success':
// Purchase successful, profile updated
break;
case 'user_cancelled':
// User canceled the purchase
break;
case 'pending':
// Purchase is pending (e.g., user will pay offline with cash)
break;
}
} catch (error) {
// Handle the error
}
}
```
## Adım 3. Satın almaları geri yükleyin \{#step-3-restore-purchases\}
Uygulama mağazaları, abonelik sunan tüm uygulamaların kullanıcılara satın almalarını geri yükleyebilecekleri bir yol sağlamasını zorunlu kılar.
Kullanıcı geri yükle düğmesine dokunduğunda `restorePurchases` metodunu çağırın. Bu işlem, satın alma geçmişlerini Adapty ile senkronize eder ve güncellenmiş profili döndürür.
```typescript showLineNumbers
async function restorePurchases() {
try {
const profile: AdaptyProfile = await adapty.restorePurchases();
// Restore successful, profile updated
} catch (error) {
// Handle the error
}
}
```
## Sonraki adımlar \{#next-steps\}
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
Paywallınız uygulamada gösterilmeye hazır. [App Store sandbox](test-purchases-in-sandbox) ortamında veya [Google Play Store](testing-on-android)'da satın almalarınızı test ederek paywall üzerinden bir test satın almasını tamamlayabildiğinizden emin olun. Bunun üretime hazır bir uygulamada nasıl çalıştığını görmek için örnek uygulamamızdaki [CustomPurchaseScreen.tsx](https://github.com/adaptyteam/AdaptySDK-React-Native/blob/master/examples/ExpoGoWebMock/src/CustomPurchaseScreen.tsx) dosyasına göz atın; bu dosya, uygun hata işleme, yükleme durumları ve UI durum yönetimiyle satın alma işlemini göstermektedir.
Ardından, paywallı gösterip göstermeyeceğinizi veya ücretli özelliklere erişim izni verip vermeyeceğinizi belirlemek için [kullanıcıların satın almalarını tamamlayıp tamamlamadığını kontrol edin](react-native-check-subscription-status).
---
# File: fetch-paywalls-and-products-react-native
---
---
title: "React Native SDK'da remote config paywall'ları için paywall'ları ve ürünleri getirme"
description: "Kullanıcı para kazanımını artırmak için Adapty React Native SDK'da paywall'ları ve ürünleri getirin."
---
Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
Adapty SDK, flow'ları ve paywall'ları iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](react-native-use-fallback-paywalls) . Ayrıca flow'ları ve paywall'ları daha hızlı getirmek için CDN'i ve CDN erişilemez olduğunda bağımsız bir yedek sunucuyu kullanırız. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman flow'larınızın en son sürümünü almanızı garanti etmek için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, bu metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa, önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun, işlem alt katmanda farklı isteklerden oluşabileceği için `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın.
| :::note v4'te `getFlow` artık `locale` parametresi almaz. Özel paywall'lar için, mevcut tüm locale'ler flow'un remote config'inde (`flow.remoteConfigs`) döndürülür—kullanıcının cihazına veya uygulama ayarına uyanı seçin. ::: Ürün ID'lerini koda gömmeyin (hardcode)! Flow'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz denemeler gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları yönettiğinden emin olun. Örneğin, başlangıçta 2 ürün getirirseniz, uygulamanız bu 2 ürünü göstermelidir. Ancak daha sonra 3 ürün getirirseniz, uygulamanız herhangi bir kod değişikliği gerektirmeden 3'ünü de göstermelidir. Koda gömmeniz gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Placement'ı, tanımlayıcıları (`id`, `variationId`), adı, paywall varyasyonlarını (`paywalls`) ve bir `remoteConfigs` dizisini (yapılandırılmış her locale için bir girdi) içeren bir `AdaptyFlow` nesnesi. Flow için ürünleri getirmek üzere `getPaywallProducts(flow)` çağırın. | ## Ürünleri getirme \{#fetch-products\} Flow'a sahip olduğunuzda, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```typescript showLineNumbers try { // ...flow const products = await adapty.getPaywallProducts(flow); // the requested products list } catch (error) { // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer birkaç özelliği içeren [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnesindeki bu özelliklere erişmeniz gerekecektir. Aşağıda en sık kullanılan özellikler gösterilmektedir; mevcut tüm özellikler için bağlantılı belgeye başvurun. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Ürünün başlığını görüntülemek için `product.localizedTitle` kullanın. Yerelleştirmenin, cihazın locale'inden ziyade kullanıcıların seçtiği mağaza ülkesine dayandığını unutmayın. | | **Price** | Fiyatın yerelleştirilmiş bir sürümünü görüntülemek için `product.price?.localizedString` kullanın. Bu yerelleştirme, cihazın locale bilgisine dayanır. Fiyata `product.price?.amount` kullanarak bir sayı olarak da erişebilirsiniz. Değer yerel para biriminde sağlanır. İlgili para birimi sembolünü almak için `product.price?.currencySymbol` kullanın. | | **Subscription Period** | Süreyi (örneğin hafta, ay, yıl vb.) görüntülemek için `product.subscription?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme, cihazın locale'ine dayanır. Abonelik süresini programatik olarak getirmek için `product.subscription?.subscriptionPeriod` kullanın. Oradan, uzunluğu almak için `unit` özelliğine erişebilirsiniz (yani 'day', 'week', 'month', 'year' veya 'unknown'). `numberOfUnits` değeri size süre birimi sayısını verir. Örneğin, üç aylık bir abonelik için, unit özelliğinde `'month'` ve numberOfUnits özelliğinde `3` görürsünüz. | | **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerdiğini gösteren bir rozet veya başka bir gösterge görüntülemek için, `product.subscription?.offer?.phases` özelliğine göz atın. Bu, en fazla iki indirim aşaması içerebilen bir listedir: ücretsiz deneme aşaması ve başlangıç fiyatı aşaması. Her aşama nesnesinde şu yararlı özellikler bulunur:Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
|isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel kod hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel kodlar](react-native-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri mevcutsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en son verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywallları iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve [yedek paywalllar](react-native-use-fallback-paywalls). Paywallları daha hızlı çekmek için CDN ve CDN'e ulaşılamadığında bağımsız bir yedek sunucu da kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman en güncel paywall sürümünü almanızı garantilemek için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini doğrudan koda yazmayın! Paywalllar uzaktan yapılandırıldığından mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları yönettiğinden emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız o 2 ürünü göstermelidir. Ancak daha sonra 3 ürün alırsanız uygulamanız herhangi bir kod değişikliği gerektirmeden 3 ürünü de göstermelidir. Doğrudan koda yazmanız gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'leri listesi, paywall tanımlayıcısı, remote config ve diğer birkaç özelliği içeren [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) nesnesi. | ## Ürünleri çekme \{#fetch-products\} Paywall'ı aldıktan sonra ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```typescript showLineNumbers try { // ...paywall const products = await adapty.getPaywallProducts(paywall); // the requested products list } catch (error) { // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Şunları içeren [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnelerinin listesi: ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik uzunluğu ve diğer birkaç özellik. | Kendi paywall tasarımınızı uygularken, muhtemelen [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnesindeki bu özelliklere erişmeniz gerekecek. Aşağıda en yaygın kullanılan özellikler gösterilmiştir, ancak mevcut tüm özelliklerle ilgili tam ayrıntılar için bağlantılı belgeye bakın. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Ürünün başlığını görüntülemek için `product.localizedTitle` kullanın. Yerelleştirmenin, cihazın locale'inden ziyade kullanıcıların seçtiği mağaza ülkesine dayandığını unutmayın. | | **Price** | Fiyatın yerelleştirilmiş bir sürümünü görüntülemek için `product.price?.localizedString` kullanın. Bu yerelleştirme, cihazın locale bilgisine dayanır. Fiyata `product.price?.amount` kullanarak bir sayı olarak da erişebilirsiniz. Değer yerel para biriminde sağlanır. İlgili para birimi sembolünü almak için `product.price?.currencySymbol` kullanın. | | **Subscription Period** | Süreyi (örneğin hafta, ay, yıl vb.) görüntülemek için `product.subscription?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme, cihazın locale'ine dayanır. Abonelik süresini programatik olarak getirmek için `product.subscription?.subscriptionPeriod` kullanın. Oradan, uzunluğu almak için `unit` özelliğine erişebilirsiniz (yani 'day', 'week', 'month', 'year' veya 'unknown'). `numberOfUnits` değeri size süre birimi sayısını verir. Örneğin, üç aylık bir abonelik için, unit özelliğinde `'month'` ve numberOfUnits özelliğinde `3` görürsünüz. | | **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerdiğini gösteren bir rozet veya başka bir gösterge görüntülemek için, `product.subscription?.offer?.phases` özelliğine göz atın. Bu, en fazla iki indirim aşaması içerebilen bir listedir: ücretsiz deneme aşaması ve başlangıç fiyatı aşaması. Her aşama nesnesinde şu yararlı özellikler bulunur:isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel kod hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel kodlar](react-native-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri mevcutsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en son verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
|İstek başarılıysa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile) nesnesi; kullanıcının uygulama içindeki access level'ları, abonelikleri ve abonelik dışı satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Apple'ın StoreKit sürümü 2.0'ın altında ve Adapty SDK sürümü 2.9.0'ın altındaysa, bunun yerine [Apple App Store paylaşılan gizli anahtarı](app-store-connection-configuration#step-5-enter-app-store-shared-secret) sağlamanız gerekir. Bu yöntem Apple tarafından artık kullanımdan kaldırılmıştır. ::: ## Satın alma sırasında aboneliği değiştirme \{#change-subscription-when-making-a-purchase\} Bir kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu işlemin nasıl gerçekleşeceği uygulama mağazasına göre değişir: - App Store'da abonelik, abonelik grubu içinde otomatik olarak güncellenir. Kullanıcı bir gruptan abonelik satın alırken başka bir gruptan aktif aboneliği varsa, her iki abonelik de aynı anda aktif olur. - Google Play'de abonelik otomatik olarak güncellenemez. Geçişi, aşağıda açıklandığı şekilde mobil uygulama kodunuzda yönetmeniz gerekir. Android'de aboneliği başka bir abonelikle değiştirmek için `.makePurchase()` metodunu ek parametre ile çağırın: ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product, params); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Ücretli özelliklere erişim izni ver } break; case 'user_cancelled': // Kullanıcının satın almayı iptal ettiği durumu işle break; case 'pending': // Ertelenmiş satın almaları işle (örn. kullanıcı nakit ile offline ödeme yapacak) break; } } catch (error) { // Hatayı işle } ``` Ek istek parametresi: | Parametre | Zorunluluk | Açıklama | | :--------- | :------- | :----------------------------------------------------------- | | **params** | zorunlu | [`MakePurchaseParamsInput`](https://react-native.adapty.io/types/makepurchaseparamsinput) türünde bir nesne. | :::info **3.8.2+ sürümü**: `MakePurchaseParamsInput` yapısı güncellendi. `oldSubVendorProductId` ve `prorationMode` artık `subscriptionUpdateParams` altında iç içe yer alıyor; `isOfferPersonalized` ise üst seviyeye taşındı. ```javascript makePurchase(product, { android: { subscriptionUpdateParams: { oldSubVendorProductId: 'old_product_id', prorationMode: 'charge_prorated_price' }, isOfferPersonalized: true } }); ``` ::: Abonelikler ve değiştirme modları hakkında daha fazla bilgiyi Google Developer belgelerinde bulabilirsiniz: - [Değiştirme modları hakkında](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Google'ın değiştirme modları için önerileri](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Değiştirme modu [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Not: bu yöntem yalnızca abonelik yükseltmeleri için kullanılabilir. Düşürme işlemleri desteklenmez. - Değiştirme modu [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Not: Gerçek abonelik değişikliği yalnızca mevcut abonelik fatura dönemi sona erdiğinde gerçekleşir. ## iOS'ta teklif kodlarını kullanma \{#redeem-offer-codes-in-ios\}Bir [`AdaptyProfile`](https://react-native.adapty.io/interfaces/adaptyprofile) nesnesi. Bu model, access level'lar, abonelikler ve abonelik dışı satın almalar hakkında bilgi içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level** durumunu kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: implement-observer-mode-react-native --- --- title: "React Native SDK'da Observer modu uygulama" description: "React Native SDK'da kullanıcı abonelik olaylarını takip etmek için Adapty'de observer modu uygulayın." --- Kendi satın alma altyapınız varsa ve henüz tamamen Adapty'ye geçmeye hazır değilseniz, [Observer modu](observer-vs-full-mode)'nu inceleyebilirsiniz. Temel haliyle Observer Modu, gelişmiş analitik ve attribution ile analitik sistemlerle sorunsuz entegrasyon sunar. Bu ihtiyaçlarınızı karşılıyorsa yalnızca şunları yapmanız gerekir: 1. Adapty SDK'yı yapılandırırken `observerMode` parametresini `true` olarak ayarlayarak Observer modu'nu etkinleştirin. Kurulum talimatlarını [React Native](sdk-installation-reactnative) için takip edin. 2. Mevcut satın alma altyapınızdan [işlemleri Adapty'ye bildirin](report-transactions-observer-mode-react-native). ### Observer modu kurulumu \{#observer-mode-setup\} Satın alma ve abonelik durumunu kendiniz yönetiyorsanız ve Adapty'yi yalnızca abonelik olayları ile analitik göndermek için kullanıyorsanız Observer modu'nu etkinleştirin. :::important Observer modu çalışırken Adapty SDK hiçbir işlemi kapatmaz; bu nedenle işlemleri kendiniz yönettiğinizden emin olun. ::: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { observerMode: true, // Enable observer mode }); ``` Parametreler: | Parametre | Açıklama | | --------------------------- | ------------------------------------------------------------ | | observerMode | [Observer modu](observer-vs-full-mode)'nu kontrol eden boolean değer. Varsayılan değer `false`'tur. | ## Observer Modunda Adapty paywall'larını kullanma \{#using-adapty-paywalls-in-observer-mode\} Adapty'nin paywall ve A/B testi özelliklerini de kullanmak istiyorsanız bunu yapabilirsiniz; ancak Observer modunda biraz ek kurulum gereklidir. Yukarıdaki adımlara ek olarak şunları yapmanız gerekir: 1. [Remote config paywall'lar](present-remote-config-paywalls-react-native) için paywall'ları her zamanki gibi gösterin. 3. Satın alma işlemleriyle [paywall'ları ilişkilendirin](report-transactions-observer-mode-react-native). --- # File: report-transactions-observer-mode-react-native --- --- title: "React Native SDK'da Observer Mode'da işlemleri raporlama" description: "React Native SDK'da kullanıcı içgörüleri ve gelir takibi için Adapty Observer Mode'da satın alma işlemlerini raporlayın." ---iOS, StoreKit 1 için: bir [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction) nesnesi.
iOS, StoreKit 2 için: [Transaction](https://developer.apple.com/documentation/storekit/transaction) nesnesi.
Android için: Satın almanın string tanımlayıcısı (purchase.getOrderId); burada satın alma, billing kütüphanesi [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) sınıfının bir örneğidir.
| | variationId | zorunlu | Varyasyonun string tanımlayıcısı. [AdaptyPaywall](https://react-native.adapty.io/interfaces/adaptypaywall) nesnesinin `variationId` özelliği kullanılarak elde edilebilir. |phoneNumber
firstName
lastName
| String | | gender | Enum, izin verilen değerler: `female`, `male`, `other` | | birthday | Date | ### Özel kullanıcı nitelikleri \{#custom-user-attributes\} Kendi özel niteliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanımıyla ilgilidir. Örneğin fitness uygulamalarında haftalık egzersiz sayısı, dil öğrenme uygulamalarında kullanıcının bilgi düzeyi gibi değerler olabilir. Bu nitelikleri segmentlerde kullanarak hedefli paywall'lar ve teklifler oluşturabilir, ayrıca analitik amaçlarla hangi ürün metriklerinin geliri en çok etkilediğini anlamak için de kullanabilirsiniz. ```typescript showLineNumbers try { await adapty.updateProfile({ codableCustomAttributes: { key_1: 'value_1', key_2: 2, }, }); } catch (error) { // handle `AdaptyError` } ``` Mevcut bir anahtarı kaldırmak için `.withRemoved(customAttributeForKey:)` metodunu kullanın: ```typescript showLineNumbers try { // to remove a key, pass null as its value await adapty.updateProfile({ codableCustomAttributes: { key_1: null, key_2: null, }, }); } catch (error) { // handle `AdaptyError` } ``` Bazen daha önce hangi özel niteliklerin ayarlandığını öğrenmeniz gerekebilir. Bunun için `AdaptyProfile` nesnesinin `customAttributes` alanını kullanın. :::warning `customAttributes` değerinin güncel olmayabileceğini unutmayın; kullanıcı nitelikleri farklı cihazlardan herhangi bir zamanda gönderilebilir, bu nedenle sunucudaki nitelikler son senkronizasyondan bu yana değişmiş olabilir. ::: ### Sınırlar \{#limits\} - Kullanıcı başına en fazla 30 özel nitelik - Anahtar adları en fazla 30 karakter uzunluğunda olabilir. Anahtar adı alfanümerik karakterler ve şunlardan herhangi birini içerebilir: `_` `-` `.` - Değer, en fazla 50 karakterlik bir string veya float olabilir. --- # File: react-native-listen-subscription-changes --- --- title: "React Native SDK'da abonelik durumunu kontrol etme" description: "React Native uygulamanızda müşteriyi elde tutmayı artırmak için Adapty'de kullanıcı abonelik durumunu takip edin ve yönetin." --- Adapty ile abonelik durumunu takip etmek son derece kolaydır. Ürün kimliklerini kodunuza manuel olarak eklemenize gerek yok. Bunun yerine, etkin bir [access level](access-level) olup olmadığını kontrol ederek kullanıcının abonelik durumunu zahmetsizce doğrulayabilirsiniz.Bir [AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile) nesnesi. Genellikle, kullanıcının uygulamaya premium erişimi olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu her zaman API'yi sorgulamaya çalıştığından en güncel sonucu döndürür. Herhangi bir nedenle (örneğin internet bağlantısı yoksa) Adapty SDK sunucudan bilgi alamazsa önbellekteki veriler döndürülür. Adapty SDK'nın `AdaptyProfile` önbelleğini düzenli aralıklarla güncelleyerek bilgileri mümkün olduğunca güncel tuttuğunu da belirtmek gerekir.
| `.getProfile()` metodu, access level durumunu alabileceğiniz kullanıcı profilini sağlar. Uygulama başına birden fazla access level tanımlayabilirsiniz. Örneğin, bir gazete uygulamanız varsa ve farklı konulara bağımsız abonelikler satıyorsanız "sports" ve "science" access level'ları oluşturabilirsiniz. Ancak çoğu durumda yalnızca bir access level'a ihtiyaç duyarsınız; bu durumda varsayılan "premium" access level'ını kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmek için bir örnek: ```typescript showLineNumbers try { const profile = await adapty.getProfile(); const isActive = profile.accessLevels?.["premium"]?.isActive; if (isActive) { // grant access to premium features } } catch (error) { // handle the error } ``` ### Abonelik durumu güncellemelerini dinleme \{#listening-for-subscription-status-updates\} Kullanıcının aboneliği her değiştiğinde Adapty bir olay tetikler. Adapty'den mesaj almak için bazı ek yapılandırmalar yapmanız gerekir: ```typescript showLineNumbers // Create an "onLatestProfileLoad" event listener adapty.addEventListener('onLatestProfileLoad', profile => { // handle any changes to subscription state }); ``` Adapty, uygulama başlangıcında da bir olay tetikler. Bu durumda önbellekteki abonelik durumu iletilir. ### Abonelik durumu önbelleği \{#subscription-status-cache\} Adapty SDK'da uygulanan önbellek, profilin abonelik durumunu depolar. Bu sayede sunucu erişilemez olsa bile önbellekteki veriler kullanılarak profilin abonelik durumu hakkında bilgi edinilebilir. Ancak önbellekten doğrudan veri talep etmenin mümkün olmadığını belirtmek gerekir. SDK, profille ilgili güncelleme veya değişiklik olup olmadığını kontrol etmek için her dakika periyodik olarak sunucuyu sorgular. Yeni işlemler veya başka güncellemeler gibi herhangi bir değişiklik varsa, önbellekteki verilerle sunucu arasında senkronizasyon sağlamak amacıyla bu değişiklikler önbelleğe iletilir. --- # File: react-native-deal-with-att --- --- title: "React Native SDK'da ATT ile Başa Çıkma" description: "Abonelik kurulumu ve yönetimini kolaylaştırmak için React Native'de Adapty'ye başlayın." --- Uygulamanız AppTrackingTransparency çerçevesini kullanıyor ve kullanıcıya uygulama takip yetkilendirme isteği sunuyorsa, [yetkilendirme durumunu](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) Adapty'ye göndermeniz gerekir. ```typescript showLineNumbers try { await adapty.updateProfile({ // you can also pass a string value (validated via tsc) if you prefer appTrackingTransparencyStatus: AppTrackingTransparencyStatus.Authorized, }); } catch (error) { // handle `AdaptyError` } ``` :::warning Bu değeri, değiştiği anda mümkün olduğunca erken göndermenizi önemle tavsiye ederiz. Yalnızca bu durumda veriler, yapılandırdığınız entegrasyonlara zamanında iletilecektir. ::: --- # File: kids-mode-react-native --- --- title: "React Native SDK'da Kids Mode" description: "Apple ve Google politikalarına uymak için Kids Mode'u kolayca etkinleştirin. React Native SDK'da IDFA, GAID veya reklam verisi toplanmaz." --- React Native uygulamanız çocuklara yönelikse, [Apple](https://developer.apple.com/kids/) ve [Google](https://support.google.com/googleplay/android-developer/answer/9893335) politikalarına uymanız gerekir. Adapty SDK kullanıyorsanız, birkaç basit adım onu bu politikalara uyacak ve uygulama mağazası incelemelerini geçecek şekilde yapılandırmanıza yardımcı olur. :::important iOS'ta Kids Mode, tüm IDFA, AdSupport ve AppTrackingTransparency kodunu derleme dışında bırakan `KidsMode` Swift package trait'i aracılığıyla etkinleştirilir. v4 SDK'yı (yerel iOS SDK'yı Swift Package Manager aracılığıyla yükler) ve **Xcode 26** veya sonrasını gerektirir. Aşağıdaki [iOS Podfile'ınızdaki güncellemeler](#updates-in-your-ios-podfile) bölümüne bakın. ::: ## Ne gereklidir? \{#whats-required\} Adapty SDK'yı aşağıdakilerin toplanmasını devre dışı bırakacak şekilde yapılandırmanız gerekir: - [IDFA (Reklamverenler için Tanımlayıcı)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Reklam Kimliği (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [IP adresi](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) Bunlara ek olarak, müşteri kullanıcı kimliğini dikkatli kullanmanızı öneririz. `isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla karşılaştığını düşünüyorsanız, varsa önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum süresince güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en son sürümünü almanızı garanti eder.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenin biraz daha gerisinde zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşuyor olabilir.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özellikleri içeren bir [`AdaptyOnboarding`](https://react-native.adapty.io/interfaces/adaptyonboarding) nesnesi. | ## Varsayılan kitle onboarding'i ile onboarding getirmeyi hızlandırın \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Genellikle onboarding'ler neredeyse anında getirilir, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitleniz ve onboarding'iniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, onboarding getirme istediğinizden daha uzun sürebilir. Bu durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir onboarding göstermek isteyebilirsiniz. Bunu ele almak için, belirtilen placement'ın **All Users** kitlesi için onboarding'i getiren `getOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding'i Getir](#fetch-onboarding) bölümünde ayrıntılı olarak açıklandığı gibi `getOnboarding` metoduyla onboarding getirmek olduğunu anlamak önemlidir. :::warning `getOnboardingForDefaultAudience` yerine `getOnboarding` kullanmayı tercih edin; çünkü ikincisinin önemli sınırlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorunlara yol açabilir; ya geriye dönük uyumlu tasarımlar gerektirirsiniz ya da eski sürümlerin yanlış görüntülenebileceğini kabul etmek durumunda kalırsınız. - **Kişiselleştirme yok**: Yalnızca "All Users" kitlesi için içerik gösterir; ülkeye, attribution'a veya özel niteliklere göre hedeflemeyi ortadan kaldırır. Kullanım durumunuzda daha hızlı getirme bu dezavantajlardan daha önemliyse `getOnboardingForDefaultAudience` kullanın (aşağıda gösterildiği gibi). Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı şekilde `getOnboarding` kullanın. ::: ```typescript showLineNumbers try { const placementId = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const onboarding = await adapty.getOnboardingForDefaultAudience(placementId, locale); // the requested onboarding } catch (error) { // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla karşılaştığını düşünüyorsanız, varsa önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum süresince güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en son sürümünü almanızı garanti eder.
| --- # File: react-native-present-onboardings --- --- title: "React Native SDK'da onboarding sunma" description: "Dönüşümleri ve geliri artırmak için React Native'de onboarding'lerin nasıl sunulacağını keşfedin." --- :::warning **Onboarding'ler SDK v4'te kullanımdan kaldırıldı ve gelecekteki bir sürümde kaldırılacak.** Artık düzeltme veya iyileştirme almıyorlar. Bunun yerine [flow'ları](react-native-get-pb-paywalls) kullanın: bir WebView içinde çalışan onboarding'lerin aksine, flow'lar cihazda yerel olarak render edilir — bu da size daha akıcı animasyonlar, tutarlı bir yerel görünüm ve his, daha hızlı yükleme süreleri ve WebView çalışma zamanı bağımlılığının olmaması avantajını sağlar. Başlamak için bkz. [Flow'ları ve paywall'ları getirme](react-native-get-pb-paywalls) ve [Flow'ları ve paywall'ları görüntüleme](react-native-present-paywalls). ::: Onboarding'i builder ile özelleştirdiyseniz, kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render etmenize gerek yok. Böyle bir onboarding; hem ne gösterileceğini hem de nasıl gösterileceğini kendi içinde barındırır. Başlamadan önce şunları sağlayın: 1. [Adapty React Native SDK](sdk-installation-reactnative) 3.8.0 veya daha yeni bir sürümünü yüklemiş olun. 2. Bir [onboarding oluşturmuş](create-onboarding) olun. 3. Onboarding'i bir [placement](placements)'a eklemiş olun. Adapty React Native SDK, onboarding'leri sunmak için iki yöntem sunar: - **React bileşeni**: Yerleşik bileşen, uygulamanızın mimarisine ve navigasyon sistemine entegre etmenizi sağlar. - **Modal sunum** ## React bileşeni \{#react-component\} Onboarding'i mevcut bileşen ağacınıza gömmek için `AdaptyOnboardingView` bileşenini doğrudan React Native bileşen hiyerarşinizde kullanın. Yerleşik bileşen, uygulamanızın mimarisine ve navigasyon sistemine entegre etmenizi sağlar. :::note Android'de `AdaptyOnboardingView` için görsel bir render sorununun önüne geçmek amacıyla ek yapılandırma yapmanızı öneririz. Bkz. [Android'de sistem arayüzü onboarding içeriğiyle çakışıyor](#system-ui-overlaps-onboarding-content-on-android). :::
Ardından bu ID'yi kodunuzda kullanabilir ve özel bir eylem olarak işleyebilirsiniz. Örneğin, bir kullanıcı **Login** veya **Allow notifications** gibi özel bir butona dokunduğunda, olay işleyicisi **Action ID** parametresiyle tetiklenir ve bu parametre builder'daki **Action ID** ile eşleşir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
:::important
Kullanıcı onboarding'i kapattığında ne olacağını yönetmeniz gerektiğini unutmayın. Örneğin, onboarding'in kendisini göstermeyi durdurmanız gerekir.
:::
2. Abonelik grubu adına tıklayın. Ürünlerinizi **Subscriptions** bölümü altında göreceksiniz.
3. Test ettiğiniz ürünün **Ready to Submit** olarak işaretlendiğinden emin olun.
4. Tablodaki ürün ID'sini Adapty Kontrol Paneli'ndeki [**Products**](https://app.adapty.io/products) sekmesindekiyle karşılaştırın. ID'ler eşleşmiyorsa, tablodaki ürün ID'sini kopyalayın ve Adapty Kontrol Paneli'nde bununla bir [ürün oluşturun](create-product).
## Adım 3. Ürün kullanılabilirliğini kontrol edin \{#step-4-check-product-availability\}
1. **App Store Connect**'e geri dönün ve aynı **Subscriptions** bölümünü açın.
2. Ürünlerinizi görüntülemek için abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Availability** bölümüne kaydırın ve gerekli tüm ülke ve bölgelerin listelendiğini kontrol edin.
## Adım 4. Ürün fiyatlarını kontrol edin \{#step-5-check-product-prices\}
1. **App Store Connect**'te tekrar **Monetization** → **Subscriptions** bölümüne gidin.
2. Abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Subscription Pricing** bölümüne kaydırın ve **Current Pricing for New Subscribers** bölümünü genişletin.
5. Gerekli tüm fiyatların listelendiğinden emin olun.
## Adım 5. Uygulamanın ücretli durumunu, banka hesabını ve vergi formlarının aktif olduğunu kontrol edin \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) ana sayfasında **Business** seçeneğine tıklayın.
2. Şirket adınızı seçin.
3. Aşağı kaydırın ve **Paid Apps Agreement**, **Bank Account** ile **Tax forms** alanlarının tümünün **Active** olarak göründüğünü doğrulayın.
Bu adımları izleyerek `InvalidProductIdentifiers` uyarısını çözebilir ve ürünlerinizi mağazada yayına alabilirsiniz.
## Adım 6. Ürün takılıp kaldıysa yeniden oluşturun \{#step-6-recreate-the-product-if-its-stuck\}
1–5 arası adımların hepsi geçebilir — `Approved` durumu, eşleşen Bundle ID, geçerli API anahtarı — ama SDK yine de `1000 noProductIDsFound` hatası döndürebilir. Bu durumda ürün Apple'ın kayıt defterinde takılı kalmış olabilir. Apple'ın ürün kayıt defteri zaman zaman öyle bir duruma girer ki ürün App Store Connect arayüzünde görünür ama StoreKit arama yoluna açık değildir.
Ürünü App Store Connect'ten silip aynı ürün ID'siyle yeniden oluşturun. Yeniden oluşturmanın ardından yayılması için 24 saate kadar bekleyin.
---
# File: cantMakePayments-react-native
---
---
title: "React Native SDK'da Code-1003 cantMakePayment hatasının çözümü"
description: "Adapty'de abonelikleri yönetirken oluşan ödeme yapılamıyor hatasını çözün."
---
1003 hatası, `cantMakePayments`, bu cihazda uygulama içi satın alımların yapılamayacağını belirtir.
`cantMakePayments` hatasıyla karşılaşıyorsanız, bu genellikle şu nedenlerden biriyle ilgilidir:
- Cihaz kısıtlamaları: Bu hata Adapty ile ilgili değildir. Aşağıdaki çözüm yollarına bakın.
- Observer mode yapılandırması: `makePurchase` metodu ve observer mode aynı anda kullanılamaz. Aşağıdaki bölüme bakın.
## Sorun: Cihaz kısıtlamaları \{#issue-device-restrictions\}
| Sorun | Çözüm |
|------------------------------|------------------------------------------------------------------------------------------------------------------------------|
| Ekran Süresi kısıtlamaları | [Ekran Süresi](https://support.apple.com/en-us/102470) ayarlarında Uygulama İçi Satın Alım kısıtlamalarını devre dışı bırakın |
| Hesap askıya alındı | Hesap sorunlarını çözmek için Apple Destek ile iletişime geçin |
| Bölgesel kısıtlamalar | Desteklenen bir bölgeden App Store hesabı kullanın |
## Sorun: Observer mode ve makePurchase'ı birlikte kullanmak \{#issue-using-both-observer-mode-and-makepurchase\}
Satın alımları yönetmek için `makePurchases` kullanıyorsanız Observer mode'u kullanmanıza gerek yoktur. [Observer mode](observer-vs-full-mode), yalnızca satın alma mantığını kendiniz uyguladığınızda gereklidir.
Dolayısıyla `makePurchase` kullanıyorsanız, SDK etkinleştirme kodundan Observer mode'u etkinleştiren kısmı güvenle kaldırabilirsiniz.
---
# File: migration-to-react-native-sdk-v4
---
---
title: "Adapty React Native SDK'yı v. 4.0'a geçirme"
description: "Paywall API'lerini flow API'leriyle değiştirerek Adapty React Native SDK v4.0 (beta) sürümüne geçin — hem Flow Builder hem de Paywall Builder ile uyumludur."
---
Adapty React Native SDK 4.0 (beta), flow'ları tanıtır ve paywall API'lerini buna göre yeniden adlandırır. Yeni API'ler hem yeni Flow Builder hem de mevcut Paywall Builder ile çalışır — Adapty Kontrol Paneli tarafında herhangi bir kurulum değişikliği gerekmez.
## Hızlı başvuru \{#quick-reference\}
| v3 | v4 |
|---|---|
| `adapty.getPaywall(placementId, locale?, params?)` | `adapty.getFlow(placementId, params?)` |
| `adapty.getPaywallForDefaultAudience(placementId, locale?, params?)` | `adapty.getFlowForDefaultAudience(placementId, params?)` |
| `adapty.getPaywallProducts(paywall)` | `adapty.getPaywallProducts(flow)` |
| `adapty.logShowPaywall(paywall)` | `adapty.logShowFlow(flow)` |
| `AdaptyPaywall` (tür) | `AdaptyFlow` |
| `createPaywallView(paywall)` | `createFlowView(flow)` |
| `AdaptyPaywallView` (bileşen) | `AdaptyFlowView` |
| `EventHandlers` (tür) | `FlowEventHandlers` |
| `onPaywallShown` | `onAppeared` |
| `onPaywallClosed` | `onDisappeared` |
| `onRenderingFailed` | `onError` |
`AdaptyPaywallProduct` adını korur — ürünler hâlâ bir flow'a aittir ve `getPaywallProducts` artık bir `AdaptyFlow` alır. `getFlow` ve `getFlowForDefaultAudience` metodları artık `locale` parametresi almaz. `present`, `dismiss`, `setEventHandlers` ve `showDialog` view metodları ile `onCloseButtonPress`, `onUrlPress`, `onCustomAction`, `onProductSelected`, `onPurchaseStarted`, `onPurchaseCompleted`, `onPurchaseFailed`, `onRestoreStarted`, `onRestoreCompleted`, `onRestoreFailed`, `onLoadingProductsFailed`, `onWebPaymentNavigationFinished` ve `onAndroidSystemBack` olay işleyicileri v3 ile aynı adları korur. Bazı varsayılan davranışlar değişti — bkz. [Varsayılan davranış değişiklikleri](#default-behavior-changes).
## Minimum iOS sürümü \{#minimum-ios-version\}
Adapty React Native SDK 4.0, minimum iOS dağıtım hedefini iOS 13.0'dan **iOS 15.0**'a yükseltir. Yükseltmeden önce iOS dağıtım hedefinizi 15.0 veya sonrasına ayarlayın.
## Kurulum \{#installation\}
### Paketi güncelleyin \{#update-the-package\}
v4.0 bir ön sürümdür, bu yüzden tam sürümü sabitleyin — npm, caret/tilde aralıkları üzerinden ön sürümleri seçmez:
```bash showLineNumbers
npm install react-native-adapty@4.0.0
# or
yarn add react-native-adapty@4.0.0
```
### iOS: Yerel SDK'lar artık Swift Package Manager üzerinden geliyor \{#ios-native-sdks-now-come-through-swift-package-manager\}
[CocoaPods'un spec deposu Aralık 2026'da salt okunur hale geliyor](https://blog.cocoapods.org/CocoaPods-Specs-Repo/), bu nedenle v4 itibarıyla yerel `Adapty`, `AdaptyUI` ve `AdaptyPlugin` SDK'ları **artık CocoaPods alt bağımlılığı olarak çekilmiyor** — podspec bunları **Swift Package Manager** üzerinden çekiyor (`spm_dependency` yardımcısı aracılığıyla). Bunun için iki şey gerekiyor:
- **React Native 0.75 veya üstü** — `spm_dependency` podspec yardımcısı için gereklidir. Daha eski bir sürümde `pod install` açık bir hata ile başarısız olur; önce React Native'i güncelleyin ya da `react-native-adapty` 3.x sürümünde kalın.
- **Dinamik framework'ler** — SPM bağımlılıkları dinamik bağlantı gerektirir. Bunu nasıl etkinleştireceğiniz Expo ve bare React Native için farklıdır.
#### Expo
[`expo-build-properties`](https://docs.expo.dev/versions/latest/sdk/build-properties/) config plugin'ini ekleyin ve `app.json` (veya `app.config.js`) dosyasında iOS framework'lerini dinamik olarak ayarlayın:
```json showLineNumbers title="app.json"
{
"expo": {
"plugins": [
[
"expo-build-properties",
{
"ios": {
"useFrameworks": "dynamic"
}
}
]
]
}
}
```
Ardından eklentiyi yükleyin ve native projeyi yeniden oluşturun:
```bash showLineNumbers
npx expo install expo-build-properties
npx expo prebuild --clean
```
#### Bare React Native \{#bare-react-native\}
iOS hedefinize dinamik framework'leri ekleyin, ardından pod'ları yeniden yükleyin:
```ruby showLineNumbers title="ios/Podfile"
use_frameworks! :linkage => :dynamic
```
```bash showLineNumbers
cd ios && pod install --repo-update
```
Daha önce `Adapty`, `AdaptyUI` veya `AdaptyPlugin`'i CocoaPods alt bağımlılığı olarak çektiyseniz, önce `Podfile` dosyanızdaki açık `pod 'Adapty'`, `pod 'AdaptyUI'` veya `pod 'AdaptyPlugin'` satırlarını kaldırın.
:::warning
Varsayılan statik bağlamadan dinamik framework'lere geçiş, modüler başlıkları henüz desteklemeyen kütüphanelerle çakışabilir ve Flipper ile uyumsuz olabilir. Derleme sorunlarıyla karşılaşırsanız, şu kaynağa bakın: [Swift Package Manager'ı React Native kütüphaneleriyle entegre etme](https://www.callstack.com/blog/integrating-swift-package-manager-with-react-native-libraries).
:::
Tam kurulum için [Adapty SDK'yı Yükle](sdk-installation-reactnative) sayfasına bakın.
## Flow'ları getirme \{#fetching-flows\}
### getPaywall → getFlow
Döndürülen tür `AdaptyPaywall`'dan `AdaptyFlow`'a değişiyor ve `locale` parametresi kaldırılıyor — bir flow render ederken locale otomatik olarak belirlenir; özel paywalllar için tüm locale'ler `flow.remoteConfigs` içinde döner:
```diff showLineNumbers
- const paywall = await adapty.getPaywall('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
```
`getPaywallForDefaultAudience` da aynı şekilde yeniden adlandırıldı:
```diff showLineNumbers
- const paywall = await adapty.getPaywallForDefaultAudience('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlowForDefaultAudience('YOUR_PLACEMENT_ID');
```
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` adını korur ancak artık bir `AdaptyFlow` alır:
```diff showLineNumbers
- const products = await adapty.getPaywallProducts(paywall);
+ const products = await adapty.getPaywallProducts(flow);
```
## Veri modeli \{#data-model\}
`getFlow`, `AdaptyPaywall` yerine bir `AdaptyFlow` döndürür ve nesne yapısı değişti:
| v3 `AdaptyPaywall` alanı | v4 `AdaptyFlow` alanı | İşlem |
|---|---|---|
| `remoteConfig?` (tek) | `remoteConfigs?: AdaptyRemoteConfig[]` (dizi) | Bir flow, yapılandırılmış her dil için bir remote config taşır. Kullanıcıyla eşleşeni okuyun: `flow.remoteConfigs?.find((c) => c.lang === 'en')`. |
| `products` | `flow.paywalls[i].productIdentifiers` | Ürün tanımlayıcıları artık flow'da değil, her flow varyasyonunda yer alır. |
| `webPurchaseUrl?` | `flow.paywalls[i].webPurchaseUrl` | Flow'dan her paywall varyasyonuna taşındı. |
| `version?: number` | `flowVersionId?: string` | Yeniden adlandırıldı ve tür `number`'dan `string`'e değiştirildi. |
| `hasViewConfiguration` | kaldırıldı | Kodunuzdaki tüm `hasViewConfiguration` kontrollerini kaldırın. |
| `requestLocale` | kaldırıldı | Dil artık modelin bir parçası değil. |
| _(yeni)_ | `paywalls: AdaptyFlowPaywall[]` | Her giriş, flow içindeki bir paywall varyasyonudur. |
| _(yeni)_ | `responseCreatedAt: number` | Sunucu yanıt zaman damgası, milisaniye cinsinden. |
Ürün tanımlayıcıları flow'dan her varyasyona taşındı:
```diff showLineNumbers
- const ids = paywall.products;
+ const ids = flow.paywalls[0].productIdentifiers;
```
## Web paywall metotları \{#web-paywall-methods\}
`openWebPaywall` ve `createWebPaywallUrl` adlarını korur, ancak ilk argüman artık `AdaptyPaywall` yerine bir `AdaptyFlowPaywall`'dır (bir flow varyasyonu). Yine de bir `AdaptyPaywallProduct` geçirebilirsiniz.
```diff showLineNumbers
const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
- await adapty.openWebPaywall(paywall);
+ await adapty.openWebPaywall(flow.paywalls[0]);
```
## Flow görüntülemelerini izleme \{#tracking-flow-views\}
### logShowPaywall → logShowFlow
`logShowPaywall`, `logShowFlow` olarak yeniden adlandırıldı ve artık bir `AdaptyFlow` alır. Olay hâlâ aynı varyasyona kaydedilir, dolayısıyla mevcut huni ve A/B testi metrikleri kontrol paneli değişiklikleri olmadan çalışmaya devam eder.
```diff showLineNumbers
- await adapty.logShowPaywall(paywall);
+ await adapty.logShowFlow(flow);
```
v3'te olduğu gibi, [Flow Builder](adapty-flow-builder) veya [Paywall Builder](adapty-paywall-builder) tarafından render edilen flow'ları ya da paywall'ları görüntülerken bu metodu çağırmanız gerekmez — Adapty bu görüntülemeleri otomatik olarak izler.
## Flow'ları görüntüleme \{#displaying-flows\}
### createPaywallView → createFlowView
Fabrika fonksiyonunu yeniden adlandırın ve `AdaptyFlow`'u geçirin. Dönen denetleyicinin metotları (`present`, `dismiss`, `setEventHandlers`, `showDialog`) değişmedi:
```diff showLineNumbers
- import { createPaywallView } from 'react-native-adapty';
+ import { createFlowView } from 'react-native-adapty';
- const view = await createPaywallView(paywall);
+ const view = await createFlowView(flow);
await view.present();
```
### AdaptyPaywallView → AdaptyFlowView
React bileşeniyle render ediyorsanız, bileşeni yeniden adlandırın ve `flow` prop'unu geçin:
```diff showLineNumbers
- import { AdaptyPaywallView } from 'react-native-adapty';
+ import { AdaptyFlowView } from 'react-native-adapty';
- ```diff showLineNumbers - subscriptionDetails?: AdaptySubscriptionDetails; + subscription?: AdaptySubscriptionDetails; ``` 2. [AdaptySubscriptionDetails](https://react-native.adapty.io/interfaces/adaptysubscriptiondetails): - `promotionalOffer` kaldırıldı. Artık promosyon teklifi, yalnızca mevcut olduğunda `offer` özelliği içinde iletilir. Bu durumda `offer?.identifier?.type` değeri `'promotional'` olacaktır. - `introductoryOfferEligibility` kaldırıldı (teklifler yalnızca kullanıcı uygunsa döndürülür). - `offerId` kaldırıldı. Teklif ID'si artık `AdaptySubscriptionOffer.identifier` içinde saklanır. - `offerTags`, `AdaptySubscriptionOffer.android` içine taşındı.
```diff showLineNumbers - introductoryOffers?: AdaptyDiscountPhase[]; + offer?: AdaptySubscriptionOffer; ios?: { - promotionalOffer?: AdaptyDiscountPhase; subscriptionGroupIdentifier?: string; }; android?: { - offerId?: string; basePlanId: string; - introductoryOfferEligibility: OfferEligibility; - offerTags?: string[]; renewalType?: 'prepaid' | 'autorenewable'; }; } ``` 3. [AdaptyDiscountPhase](https://react-native.adapty.io/interfaces/adaptydiscountphase): - `identifier` alanı `AdaptyDiscountPhase` modelinden kaldırıldı. Teklif tanımlayıcısı artık `AdaptySubscriptionOffer.identifier` içinde saklanıyor.
```diff showLineNumbers - ios?: { - readonly identifier?: string; - }; ``` ### Kaldırılan modeller \{#remove-models\} 1. `AttributionSource`: - Daha önce `AttributionSource`'un kullanıldığı yerlerde artık doğrudan string kullanılmaktadır. 2. `OfferEligibility`: - Bu model artık gerekli olmadığından kaldırılmıştır. Artık bir teklif yalnızca kullanıcı uygunsa döndürülmektedir. ## `getProductsIntroductoryOfferEligibility` metodunu kaldırma \{#remove-getproductsintroductoryoffereligibility-method\} Adapty SDK 3.3.1 öncesinde, ürün nesneleri kullanıcının uygun olup olmadığından bağımsız olarak her zaman teklifleri içeriyordu. Bu durum, teklifi kullanmadan önce uygunluğu manuel olarak kontrol etmenizi gerektiriyordu. 3.3.1 sürümünden itibaren ürün nesnesi, teklifleri yalnızca kullanıcı uygunsa içermektedir. Bu sayede bir teklif mevcutsa kullanıcının uygun olduğunu varsayabilirsiniz; bu da süreci basitleştirir. ## Satın alma işlemini güncelleme \{#update-making-purchase\} Önceki sürümlerde, iptal edilen ve bekleyen satın almalar hata olarak değerlendirilir ve sırasıyla `2: 'paymentCancelled'` ve `25: 'pendingPurchase'` kodları döndürülürdü. 3.3.1 sürümünden itibaren, iptal edilen ve bekleyen satın almalar artık başarılı sonuç olarak kabul edilmekte ve buna göre işleme alınması gerekmektedir: ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; } } catch (error) { // Handle the error } ``` ## Paywall Builder paywall sunumunu güncelleme \{#update-paywall-builder-paywall-presentation\} Güncellenmiş örnekler için [React Native'de yeni Paywall Builder paywalllerini sunma](react-native-present-paywalls) belgelerine bakın. ```diff showLineNumbers - import { createPaywallView } from '@adapty/react-native-ui'; + import { createPaywallView } from 'react-native-adapty/dist/ui'; const view = await createPaywallView(paywall); view.registerEventHandlers(); // handle close press, etc try { await view.present(); } catch (error) { // handle the error } ``` ## Geliştirici tanımlı zamanlayıcı uygulamasını güncelleme \{#update-developer-defined-timer-implementation\} `timerInfo` parametresini `customTimers` olarak yeniden adlandırın: ```diff showLineNumbers - let timerInfo = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } + let customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } //and then you can pass it to createPaywallView as follows: - view = await createPaywallView(paywall, { timerInfo }) + view = await createPaywallView(paywall, { customTimers }) ``` ## Paywall Builder satın alma etkinliklerini değiştirme \{#modify-paywall-builder-purchase-events\} Daha önce: - İptal edilen satın almalar `onPurchaseCancelled` callback'ini tetikliyordu. - Beklemedeki satın almalar `25: 'pendingPurchase'` hata kodunu döndürüyordu. Artık: - Her ikisi de `onPurchaseCompleted` callback'i tarafından işleniyor. #### Geçiş adımları: \{#steps-to-migrate\} 1. `onPurchaseCancelled` callback'ini kaldırın. 2. `25: 'pendingPurchase'` için hata kodu işlemeyi kaldırın. 3. `onPurchaseCompleted` callback'ini güncelleyin: ```typescript showLineNumbers const view = await createPaywallView(paywall); const unsubscribe = view.registerEventHandlers({ // ... other optional callbacks onPurchaseCompleted(purchaseResult, product) { switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; // highlight-start case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; // highlight-end } // highlight-start return purchaseResult.type !== 'user_cancelled'; // highlight-end }, }); ``` ## Paywall Builder özel eylem olaylarını değiştirme \{#modify-paywall-builder-custom-action-events\} Kaldırılan callback'ler: - `onAction` - `onCustomEvent` Eklenen callback: - Yeni `onCustomAction(actionId)` callback'i. Özel eylemler için bunu kullanın. ## `onProductSelected` callback'ini değiştirme \{#modify-onproductselected-callback\} Önceden `onProductSelected`, `product` nesnesini gerektiriyordu. Artık string olarak `productId` gerektirmektedir. ## `updateProfile` metodundan üçüncü taraf entegrasyon parametrelerini kaldırma \{#remove-third-party-integration-parameters-from-updateprofile-method\} Üçüncü taraf entegrasyon tanımlayıcıları artık `setIntegrationIdentifier` metodu kullanılarak ayarlanmaktadır. `updateProfile` metodu artık bunları kabul etmemektedir. ## Üçüncü taraf entegrasyon SDK yapılandırmasını güncelleme \{#update-third-party-integration-sdk-configuration\} Adapty React Native SDK 3.3.1 ve sonraki sürümlerle entegrasyonların düzgün çalışmasını sağlamak için aşağıdaki bölümlerde açıklandığı gibi SDK yapılandırmalarınızı güncelleyin. Ayrıca attribution tanımlayıcısını almak için `AttributionSource` kullandıysanız, gerekli tanımlayıcıyı string olarak sağlayacak şekilde kodunuzu değiştirin. ### Adjust Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Adjust entegrasyonu için SDK yapılandırması](adjust#connect-your-app-to-adjust) sayfasına bakın. ```diff showLineNumbers import { Adjust, AdjustConfig } from "react-native-adjust"; import { adapty } from "react-native-adapty"; var adjustConfig = new AdjustConfig(appToken, environment); // Before submiting Adjust config... adjustConfig.setAttributionCallbackListener(attribution => { // Make sure Adapty SDK is activated at this point // You may want to lock this thread awaiting of `activate` adapty.updateAttribution(attribution, "adjust"); }); // ... Adjust.create(adjustConfig); + Adjust.getAdid((adid) => { + if (adid) + adapty.setIntegrationIdentifier("adjust_device_id", adid); + }); ``` ### AirBridge \{#airbridge\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [AirBridge entegrasyonu için SDK yapılandırması](airbridge#connect-your-app-to-airbridge) bölümüne bakın. ```diff showLineNumbers import Airbridge from 'airbridge-react-native-sdk'; import { adapty } from 'react-native-adapty'; try { const deviceId = await Airbridge.state.deviceUUID(); - await adapty.updateProfile({ - airbridgeDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("airbridge_device_id", deviceId); } catch (error) { // handle `AdaptyError` } ``` ### Amplitude \{#amplitude\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Amplitude entegrasyonu için SDK yapılandırması](amplitude#sdk-configuration) bölümüne bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; try { - await adapty.updateProfile({ - amplitudeDeviceId: deviceId, - amplitudeUserId: userId, - }); + await adapty.setIntegrationIdentifier("amplitude_device_id", deviceId); + await adapty.setIntegrationIdentifier("amplitude_user_id", userId); } catch (error) { // handle `AdaptyError` } ``` ### AppMetrica Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [AppMetrica entegrasyonunda SDK yapılandırması](appmetrica#sdk-configuration) sayfasına bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import AppMetrica, { DEVICE_ID_KEY, StartupParams, StartupParamsReason } from '@appmetrica/react-native-analytics'; // ... const startupParamsCallback = async ( params?: StartupParams, reason?: StartupParamsReason ) => { const deviceId = params?.deviceId if (deviceId) { try { - await adapty.updateProfile({ - appmetricaProfileId: 'YOUR_ADAPTY_CUSTOMER_USER_ID', - appmetricaDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("appmetrica_profile_id", 'YOUR_ADAPTY_CUSTOMER_USER_ID'); + await adapty.setIntegrationIdentifier("appmetrica_device_id", deviceId); } catch (error) { // handle `AdaptyError` } } } AppMetrica.requestStartupParams(startupParamsCallback, [DEVICE_ID_KEY]) ``` ### AppsFlyer Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [AppsFlyer entegrasyonu için SDK yapılandırması](appsflyer#connect-your-app-to-appsflyer) bölümüne bakın. ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import appsFlyer from 'react-native-appsflyer'; appsFlyer.onInstallConversionData(installData => { try { - const networkUserId = appsFlyer.getAppsFlyerUID(); - adapty.updateAttribution(installData, AttributionSource.AppsFlyer, networkUserId); + const uid = appsFlyer.getAppsFlyerUID(); + adapty.setIntegrationIdentifier("appsflyer_id", uid); + adapty.updateAttribution(installData, "appsflyer"); } catch (error) { // handle the error } }); // ... appsFlyer.initSdk(/*...*/); ``` ### Branch \{#branch\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Branch entegrasyonu için SDK yapılandırması](branch#connect-your-app-to-branch) bölümüne bakın. ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import branch from 'react-native-branch'; branch.subscribe({ enComplete: ({ params, }) => { - adapty.updateAttribution(params, AttributionSource.Branch); + adapty.updateAttribution(params, "branch"); }, }); ``` ### Facebook Ads Aşağıda gösterildiği gibi mobil uygulama kodunuzu güncelleyin. Tam kod örneği için [Facebook Ads entegrasyonu için SDK yapılandırması](facebook-ads#connect-your-app-to-facebook-ads) bölümüne bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { AppEventsLogger } from 'react-native-fbsdk-next'; try { const anonymousId = await AppEventsLogger.getAnonymousID(); - await adapty.updateProfile({ - facebookAnonymousId: anonymousId, - }); + await adapty.setIntegrationIdentifier("facebook_anonymous_id", anonymousId); } catch (error) { // handle `AdaptyError` } ``` ### Firebase ve Google Analytics \{#firebase-and-google-analytics\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Firebase ve Google Analytics entegrasyonu için SDK yapılandırması](firebase-and-google-analytics) sayfasına bakın. ```diff showLineNumbers import analytics from '@react-native-firebase/analytics'; import { adapty } from 'react-native-adapty'; try { const appInstanceId = await analytics().getAppInstanceId(); - await adapty.updateProfile({ - firebaseAppInstanceId: appInstanceId, - }); + await adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId); } catch (error) { // handle `AdaptyError` } ``` ### Mixpanel \{#mixpanel\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Mixpanel entegrasyonu için SDK yapılandırması](mixpanel#sdk-configuration) bölümüne bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { Mixpanel } from 'mixpanel-react-native'; // ... try { - await adapty.updateProfile({ - mixpanelUserId: mixpanelUserId, - }); + await adapty.setIntegrationIdentifier("mixpanel_user_id", mixpanelUserId); } catch (error) { // handle `AdaptyError` } ``` ### OneSignal Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [OneSignal entegrasyonu için SDK yapılandırması](onesignal#sdk-configuration) bölümüne bakın.
:::important
**Sonraki adımlar, App Store ve/veya Google Play'de zaten ürününüz olup olmadığına bağlıdır:**
:::
5. **Save & Continue** düğmesine tıklayın ve mağaza için ürün ayrıntılarını doldurmak amacıyla **App Store** veya **Google Play** sekmesine geçin.
Bu paywalli uygulama kodunuzda oluşturacaksınız.
Uygulama kodunuzda yalnızca placement ID'lerini sabit olarak tanımlarsınız. Geri kalan her şey — hangi paywall'ın çalıştığı, hangi ürünleri sattığı, remote config — Adapty Kontrol Paneli'nde yapılandırılır ve uygulama güncellemesi gerektirmeden istediğiniz zaman değiştirilebilir.
:::tip
Adapty, farklı kullanıcı gruplarına farklı paywaller göstermenize ve performansı analiz etmenize olanak tanır. [Kitleler](audience) ve [A/B testleri](ab-tests) hakkında daha fazla bilgi edinin.
:::
## Sonraki adımlar \{#next-steps\}
Adapty'yi başarıyla kullanmaya başladığınız için tebrikler! Artık uygulama içi satın almalarınızı büyütmeye hazırsınız.
Üretim sürümüne hazırlanın:
Ya da aşağıdakilerle devam edebilirsiniz:
- **[A/B testi](ab-tests)**: En etkili kombinasyonları belirlemek için farklı fiyatlar, abonelik süreleri, deneme dönemleri ve görsel öğelerle deneyler yapın.
- **[Analitik](how-adapty-analytics-works)**: Kullanıcı davranışını anlamak ve gelir performansını optimize etmek için ayrıntılı monetizasyon metriklerini inceleyin.
- **Entegrasyonlar**: Adapty, [abonelik olaylarını](events) [Amplitude](amplitude), [AppsFlyer](appsflyer), [Adjust](adjust), [Branch](branch), [Mixpanel](mixpanel), [Facebook Ads](facebook-ads), [AppMetrica](appmetrica) ve özel [Webhook](webhook) gibi üçüncü taraf analitik ve attribution araçlarına gönderir.
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
---
# File: release-checklist
---
---
title: "Yayın kontrol listesi"
description: "Adapty'nin yayın kontrol listesini takip ederek uygulama güncelleme sürecinizin sorunsuz geçmesini sağlayın."
---
Adapty'yi tercih ettiğiniz için çok mutluyuz! Umarız entegrasyon süreci sorunsuz geçmiştir. Bu kılavuz, uygulamanızı mağazalarda yayınlamaya hazırlamak ve monetizasyon akışının düzgün çalıştığından emin olmak için izlemeniz gereken adımları açıklar.
## Başlamadan önce gerekenler \{#pre-flight-essentials\}
Doğrulamaya başlamadan önce şunlara ihtiyacınız var:
- Sandbox hesabı olan gerçek bir cihaz
- Adapty Kontrol Paneli'ne erişim
- App Store Connect / Google Play Console'a erişim
:::note
Sandbox satın almaları simülatörlerde çalışabilse de ödeme diyalogları ve biyometrik doğrulama gibi tüm akışları test etmek için gerçek cihaz gereklidir.
:::
## Genel doğrulamalar \{#universal-validations\}
- [ ] **Mağaza bağlantısı**: Adapty'yi App Store ve/veya Google Play'e bağladığınızdan emin olun:
- [ ] [App Store](initial_ios)
- [ ] [Google Play](initial-android)
- [ ] **Abonelik olay iletimi**: Sunucu bildirimlerinin yapılandırıldığını doğrulayın:
- [ ] [App Store sunucu bildirimleri](enable-app-store-server-notifications)
- [ ] [Gerçek zamanlı geliştirici bildirimleri (RTDN)](enable-real-time-developer-notifications-rtdn)
- [ ] **Profil tanımlama**: Kullanıcı tanımlama mantığını doğrulayın ve satın almaların doğru profile eşlendiğinden emin olun:
- [ ] [Uygulama kodunuzdaki tanımlama mantığının kullanım senaryonuzla uyuştuğunu kontrol edin](ios-quickstart-identify)
- [ ] [Kullanıcı profilleri arasında ücretli erişim paylaşımı için üst/mirasçı mantığını anladığınızdan emin olun](sharing-paid-access-between-user-accounts)
- [ ] **Teklifler**: Uygulamanızda App Store promosyon teklifleri kullanıyorsanız, [Uygulama içi satın alma anahtarını](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers) hem ana alana hem de **App Store promotional offers** bölümüne eklediğinizden emin olun.
- [ ] **Veri toplama**: Gizlilik uyumluluğunu sağlayın:
- [ ] GDPR veya CCPA gibi gizlilik düzenlemelerine uymak zorundaysanız ya da uygulamanız çocuklara yönelikse, [IDFA ve IP toplama ile paylaşımını etkinleştirip etkinleştirmeyeceğinizi](sdk-installation-ios#data-policies) belirleyin.
- [ ] Uygulamanız AppTrackingTransparency kullanıyorsa, [yetkilendirme durumunu Adapty'ye gönderdiğinizden](ios-deal-with-att) emin olun.
- [ ] **Gizlilik etiketleri**: Adapty'nin topladığı veriler ve inceleme için hangi işaretleri ayarlamanız gerektiği hakkında [daha fazla bilgi edinin](apple-app-privacy).
## Satın alma doğrulamaları \{#purchase-validations\}
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
Yayına geçmeden önce, uygulamanızdaki satın almaların düzgün çalıştığından ve paywallınızın mağaza incelemesine hazır olduğundan emin olun.
Uygulama içi satın almaları doğrulama yönteminiz, bunları nasıl uyguladığınıza bağlıdır:
- Adapty Paywall Builder'da oluşturulmuş bir paywall gösteriyorsunuz
- Kendi paywallınızı uyguladınız ve satın almaları yönetmek için içinde `makePurchase` metodunu kullanıyorsunuz
- Adapty'yi gözlemci modunda kullanıyorsunuz (Adapty Paywall Builder veya özel paywallınızla)
Mümkündür, ancak Full Mode'a kıyasla önemli miktarda ek kodlama ve yapılandırma gerektirir.
| ✅ | | **Uygulama Süresi** |Analitik ve entegrasyonlar için: Bir saatten az
A/B testleriyle birlikte: Kapsamlı testlerle birlikte bir haftaya kadar
| Birkaç saat | ## Observer Mode nasıl çalışır \{#how-observer-mode-works\} Observer mode'da Apple/Google'dan gelen yeni işlemleri Adapty SDK'ya bildirirsiniz ve Adapty SDK bunları Adapty backend'e iletir. Uygulamanızdaki ücretli içeriğe erişimi yönetmek, işlemleri tamamlamak, yenilemeleri yönetmek, ödeme sorunlarını çözmek ve benzeri konular sizin sorumluluğunuzdadır. ## Observer mode nasıl kurulur \{#how-to-set-up-observer-mode\} 1. Adapty'nin [Google Play](initial-android) ve [App Store](initial_ios) ile ilk entegrasyonunu kurun. 2. Adapty SDK'yı yapılandırırken `observerMode` parametresini `true` olarak ayarlayarak bu modu etkinleştirin. [iOS](sdk-installation-ios#activate-adapty-module-of-adapty-sdk), [Android](sdk-installation-android#activate-adapty-module-of-adapty-sdk), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter#activate-adapty-module-of-adapty-sdk), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform#activate-adapty-sdk) ve [Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk) için kurulum talimatlarını takip edin. 3. iOS ve iOS tabanlı çapraz platform framework'ler için mevcut satın alma altyapınızdaki işlemleri Adapty'ye [bildirin](report-transactions-observer-mode). 4. (isteğe bağlı) Üçüncü taraf entegrasyonları kullanmak istiyorsanız bunları [Üçüncü taraf entegrasyonunu yapılandırma](configuration) konusunda açıklandığı şekilde ayarlayın. :::warning Observer mode'da çalışırken Adapty SDK işlemleri sonlandırmaz, bu nedenle bu konuyu kendiniz yönettiğinizden emin olun. ::: ## Observer mode'da paywall ve A/B testleri nasıl kullanılır \{#how-to-use-paywalls-and-ab-tests-in-observer-mode\} Observer mode'da Adapty SDK, satın almaları kendi altyapınızda gerçekleştirdiğiniz için satın almaların kaynağını belirleyemez. Bu nedenle Observer mode'da paywall ve/veya A/B testi kullanmak istiyorsanız, işlem bildirirken uygulama mağazasından gelen işlemi mobil uygulama kodunuzda ilgili paywall ile ilişkilendirmeniz gerekir. Bunlara ek olarak, Paywall Builder ile tasarlanan paywall'ların Observer mode kullanılırken özel bir şekilde görüntülenmesi gerekir: - Observer mode'da paywall'ları [iOS](implement-observer-mode) veya [Android](android-present-paywall-builder-paywalls-in-observer-mode) için görüntüleyin. - Observer mode'da işlem bildirirken [satın alma işlemlerini paywall'larla ilişkilendirin](report-transactions-observer-mode). --- # File: migration-from-revenuecat --- --- title: "RevenueCat'ten Geçiş" description: "Adım adım rehberimizle RevenueCat'ten Adapty'ye geçiş yapın." --- Geçiş planınız 5 mantıksal adımdan oluşur ve ortalama 2 saat sürer. Geçişlerin %90'ı bir iş gününden kısa sürer. 1. Temel farklılıkları öğrenin; Adapty hesabı oluşturun ve hazırlayın _(5 dakika)_; 2. RevenueCat SDK yerine platformunuz için Adapty SDK'yı yükleyin ([iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity)) _(1 saat)_; 3. Adapty'ye [Apple App Store sunucu bildirimleri](enable-app-store-server-notifications) kurun ve isteğe bağlı olarak [ham olay iletmeyi](enable-app-store-server-notifications#raw-events-forwarding) etkinleştirin _(5 dakika)_; 4. Uygulamanızın güncellemelerini test edin ve yayınlayın _(30 dakika)_; 5. (İsteğe bağlı) RevenueCat desteğinden geçmiş verileri CSV formatında isteyin _(5 dakika)_; 6. (İsteğe bağlı) Adapty desteği aracılığıyla geçmiş verileri içe aktarın _(30 dakika)_. :::info Aboneleriniz otomatik olarak geçiş yapar Daha önce abonelik etkinleştirmiş tüm kullanıcılar, Adapty SDK içeren uygulamanın yeni sürümünü açar açmaz otomatik olarak Adapty'ye taşınır. Abonelik durumu doğrulaması ve premium erişim otomatik olarak geri yüklenir. ::: Adapty SDK içeren uygulamanızın yeni sürümünü yayınlamadan önce [yayın kontrol listemizi](release-checklist) gözden geçirdiğinizden emin olun. ## Temel farklılıkları öğrenin; Adapty hesabı oluşturun ve hazırlayın \{#learn-the-core-differences-create-and-prepare-an-adapty-account\} Adapty ve RevenueCat SDK'ları benzer şekilde tasarlanmıştır. En büyük fark ağ kullanımı ve hızdır: Adapty SDK, talep ettiğinizde bilgileri olabildiğince hızlı sunmak için tasarlanmıştır. Örneğin bir paywall talep ettiğinizde, onboarding veya paywallınızı önceden oluşturmak için önce [remote config](customize-paywall-with-remote-config) gelir, ardından ürünler ayrı bir istekle alınır. İsimlendirme biraz farklıdır: | RevenueCat | Adapty | | :---------- | :-------------- | | Package | Product | | Offering | Paywall | | Paywall | Paywall Builder | | Entitlement | Access level | Adapty'de [placement](placements) kavramı vardır. Placement, uygulamanızda kullanıcının satın alma yapabileceği mantıksal bir yerdir. Çoğu durumda bir ya da iki placement'ınız olur: - Onboarding (tüm satın almaların %80'i burada gerçekleşir); - Genel (onboarding sonrası ayarlarda veya uygulama içinde gösterilen).
## Adapty SDK'yı yükleyin ve RevenueCat SDK'yı değiştirin \{#install-adapty-sdk-and-replace-revenuecat-sdk\}
Uygulamanıza platformunuz için Adapty SDK'yı yükleyin ([iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity)).
Uygulama tarafında birkaç SDK metodunu değiştirmeniz gerekecek. En yaygın fonksiyonlara ve bunları Adapty SDK metodlarıyla nasıl değiştireceğinize bakalım.
### SDK aktivasyonu \{#sdk-activation\}
`Purchases.configure` yerine `Adapty.activate` kullanın.
### Paywall alma (offering'ler) \{#getting-paywalls-offerings\}
`Purchases.shared.getOfferings` yerine [`Adapty.getPaywall`](fetch-paywalls-and-products#fetch-paywall-information) kullanın.
Adapty'de paywallı her zaman [placement id](placements) üzerinden talep edersiniz. Pratikte en fazla 1-2 paywall çektiğinizden, bu yapıyı SDK'yı hızlandırmak ve ağ kullanımını azaltmak amacıyla bilerek böyle tasarladık.
### Kullanıcı (müşteri profili) alma \{#getting-a-user-customer-profile\}
`Purchases.shared.getCustomerInfo` yerine `Adapty.getProfile` kullanın.
### Ürün alma \{#getting-products\}
RevenueCat'te şu yapıyı kullanırsınız: `Purchases.shared.getOfferings` ve ardından `self.offering?.availablePackages`.
Adapty'de önce bir paywall talep edersiniz (yukarıya bakın) — bu sayede Adapty'nin [remote config](customize-paywall-with-remote-config)'una anında erişirsiniz — ardından [`Adapty.getPaywallProducts`](fetch-paywalls-and-products#fetch-products) ile ürünleri alırsınız.
### Satın alma yapma \{#making-a-purchase\}
`Purchases.shared.purchase` yerine [`Adapty.makePurchase`](making-purchases#make-purchase) kullanın.
### Access level (entitlement) kontrolü \{#checking-access-level-entitlement\}
Müşteri profilini alın (önce yukarıyı okuyun) ve ardından şunu değiştirin:
`customerInfo?.entitlements["premium"]?.isActive == true`
şununla:
[`profile.accessLevels["premium"]?.isActive == true`](subscription-status#retrieving-the-access-level-from-the-server).
### Satın alma geri yükleme \{#restore-purchase\}
`Purchases.shared.restorePurchases` yerine [`Adapty.restorePurchases`](restore-purchase) kullanın.
### Kullanıcının giriş yapıp yapmadığını kontrol etme \{#check-if-the-user-is-logged-in\}
`Purchases.shared.isAnonymous` yerine `if profile.customerUserId == nil` kullanın.
### Kullanıcı girişi \{#log-in-user\}
`Purchases.shared.logIn` yerine [`Adapty.identify`](identifying-users#set-customer-user-id-after-configuration) kullanın.
### Kullanıcı çıkışı \{#log-out-user\}
`Purchases.shared.logOut` yerine [`Adapty.logout`](identifying-users#logging-out-and-logging-in) kullanın.
## App Store sunucu tarafı bildirimlerini Adapty'ye geçirin \{#switch-app-store-server-side-notifications-to-adapty\}
Bunu nasıl yapacağınızı [buradan](migrate-to-adapty-from-another-solutions#changing-apple-server-notifications) okuyun.
## Uygulamanızın yeni sürümünü test edin ve yayınlayın \{#test-and-release-a-new-version-of-your-app\}
Buradasanız şunları yapmışsınızdır:
- [x] Adapty Kontrol Panelini yapılandırdınız
- [x] Adapty SDK'yı yüklediniz
- [x] SDK mantığını Adapty fonksiyonlarıyla değiştirdiniz
- [x] App Store sunucu tarafı bildirimlerini Adapty'ye geçirdiniz ve isteğe bağlı olarak RevenueCat'e ham olay iletmeyi etkinleştirdiniz
- [ ] Sandbox satın alması yaptınız
- [ ] Yeni bir uygulama sürümü yayınladınız
Yukarıdaki maddeleri işaretlediyseniz, Sandbox'ta bir test satın alması yapın ve uygulamayı yayınlayın.
:::info
[Yayın kontrol listesini](release-checklist) gözden geçirin.
Mevcut entegrasyonu doğrulamak ya da [attribution](attribution-integration) veya [analitik](analytics-integration) entegrasyonları gibi ek özellikler eklemek için listemizi kullanarak son kontrolü yapın.
:::
## (İsteğe bağlı) RevenueCat geçmiş verilerinizi CSV formatında dışa aktarın \{#optional-export-your-revenuecat-historical-data-in-csv-format\}
:::warning
Geçmiş veri aktarımını aceleye getirmeyin
SDK içeren sürümü yayınladıktan sonra en az bir hafta beklemeniz gerekir. Bu süre zarfında SDK üzerinden satın alma fiyatlarına ilişkin tüm bilgileri alırız; böylece içe aktardığınız veriler çok daha doğru olur.
:::
RevenueCat'ten geçmiş verilerinizi CSV formatında [RevenueCat'in resmi belgelerindeki](https://www.revenuecat.com/docs/integrations/scheduled-data-exports) talimatları izleyerek dışa aktarın.
## (İsteğe bağlı) RevenueCat desteğinden Google Purchase Token'larını isteyin \{#optional-ask-revenuecat-support-for-google-purchase-tokens\}
Google Play işlemlerini içe aktarmanız gerekiyorsa, [destek sayfaları](https://app.revenuecat.com/settings/support) üzerinden RevenueCat desteğiyle iletişime geçerek Google Purchase Token'larını içeren bir CSV dosyası talep edin. Google Purchase Token, Google Play'in her işlem için sağladığı benzersiz bir tanımlayıcıdır ve Adapty'de satın almaların doğru şekilde takip edilip doğrulanması için gereklidir. Bu bilgi standart dışa aktarma dosyasına dahil değildir. Dosya şu üç sütunu içerir:
- `user_id`
- `google_purchase_token`
- `google_product_id`
## Geçmiş verilerinizi aktarmak için bize yazın \{#write-us-to-import-your-historical-data\}
Web sitesi mesajlaşma aracı üzerinden veya CSV dosyalarınızla birlikte [support@adapty.io](mailto:support@adapty.io) adresine e-posta göndererek bizimle iletişime geçin.
1. RevenueCat'ten dışa aktardığınız CSV dosyasını doğrudan destek ekibimize gönderin.
2. Google Play işlemlerini içe aktarıyorsanız, RevenueCat desteğinden aldığınız Google Purchase Token'larını içeren CSV dosyasını da ekleyin.
3. Customer User ID olarak (Adapty'nin birincil kullanıcı tanımlayıcısı) hangi kullanıcı ID'sinin kullanılması gerektiğini belirtin: `rc_original_app_user_id` mi yoksa `rc_last_seen_app_user_id_alias` mi.
Destek Ekibimiz işlemlerinizi Adapty'ye aktaracaktır. Her işlem için aşağıdaki veriler Adapty'ye aktarılır:
| Parametre | Açıklama |
| ----------------------------- | ------------------------------------------------------------ |
| user_id | Customer User ID, Adapty'deki ve sisteminizde kullanıcınızın ana tanımlayıcısı. |
| apple_original_transaction_id | Abonelik zincirleri için bu, `store_original_transaction_id` ile bağlantılı orijinal işlemin satın alma tarihidir. |
| google_product_id | Google Play Store'daki ürün ID'si. |
| google_purchase_token | Google Play'in her işlem için sağladığı, doğrulama için gerekli benzersiz tanımlayıcı. |
| country | Kullanıcının ülkesi. |
| created_at | Kullanıcının oluşturulma tarihi ve saati. |
| subscription_expiration_date | Aboneliğin sona erme tarihi ve saati. |
| email | Son kullanıcının e-posta adresi. |
| phone_number | Son kullanıcının telefon numarası. |
| idfa | Apple'ın bir kullanıcının cihazına atadığı Reklamverenler için Tanımlayıcı (IDFA). |
| idfv | Bir geliştirici tarafından tüm uygulamalara atanan ve o uygulamalar arasında cihazda paylaşılan Satıcılar için Tanımlayıcı (IDFV). |
| advertising_id | Reklamcıların takip amacıyla kullanabileceği, Android işletim sistemi tarafından sağlanan benzersiz tanımlayıcı. |
| attribution_channel | Pazarlama kanalı adı. |
| attribution_campaign | Pazarlama kampanyası adı. |
| attribution_ad_group | Attribution reklam grubu. |
| attribution_ad_set | Attribution reklam seti. |
| attribution_creative | Attribution kreatif anahtar kelimesi. |
Bunlara ek olarak, şu entegrasyonlara ait entegrasyon tanımlayıcıları da içe aktarılacaktır: Amplitude, Mixpanel, AppsFlyer, Adjust ve FacebookAds.
## SSS \{#faq\}
### Adapty SDK'yı başarıyla yükledim ve yeni bir uygulama sürümü yayınladım. Adapty SDK'lı sürüme geçmeyen eski abonelerime ne olacak? \{#i-successfully-installed-adapty-sdk-and-released-a-new-app-version-with-it-what-will-happen-to-my-legacy-subscribers-who-did-not-update-to-a-version-with-adapty-sdk\}
Kullanıcıların büyük çoğunluğu telefonlarını geceleri şarj eder; App Store da genellikle tüm uygulamaları bu sırada otomatik olarak günceller, dolayısıyla bu bir sorun olmamalıdır. Güncelleme yapmayan küçük bir ücretli abone grubu olabilir, ancak bu kullanıcılar premium içeriğe erişmeye devam eder. Onları güncellemeye zorlamanıza gerek yok.
### RevenueCat'teki geçmiş verilerimi mümkün olduğunca hızlı dışa aktarmam mı gerekiyor, yoksa kaybeder miyim? \{#do-i-need-to-export-my-historical-data-from-revenuecat-as-quickly-as-possible-or-will-i-lose-it\}
Çok acele etmenize gerek yok; önce Adapty SDK ile bir sürüm yayınlayın, ardından geçmiş verilerinizi bize iletin. Kullanıcılarınızın ödeme geçmişini geri yükleyip [profiller](profiles-crm) ve [grafikler](charts) bölümlerini dolduracağız.
### MMP (AppsFlyer, Adjust vb.) ve analitik (Mixpanel, Amplitude vb.) kullanıyorum. Her şeyin düzgün çalışacağından nasıl emin olabilirim? \{#i-use-mmp-appsflyer-adjust-etc-and-analytics-mixpanel-amplitude-etc-how-do-i-make-sure-that-everything-will-work\}
Öncelikle SDK'mız aracılığıyla veri göndermek istediğiniz üçüncü taraf hizmetlerinin ID'lerini bize iletmeniz gerekir. [Attribution entegrasyonu](attribution-integration) ve [analitik entegrasyonu](analytics-integration) kılavuzlarını okuyun. Geçmiş veriler ve eski kullanıcılar için **RevenueCat'ten dışa aktardığınız verilerdeki bu ID'leri bize aktardığınızdan emin olun.**
---
# File: migration-from-superwall
---
---
title: "Superwall'dan Geçiş"
description: "Her SDK çağrısını ve kavramı eşleştiren adım adım kılavuzla Superwall'dan Adapty'ye geçin."
---
Superwall'dan Adapty'ye geçişlerin büyük çoğunluğu yaklaşık iki saat sürer. SDK'yı değiştirirsiniz, mağaza sunucu bildirimlerinizi Adapty'ye yönlendirirsiniz ve yeni bir uygulama sürümü yayınlarsınız. Ücretli aboneleriniz erişimlerini korur — Adapty, ilk açılışta bunu App Store ve Google Play makbuzlarından otomatik olarak geri yükler.
:::info
Aboneleriniz otomatik olarak geçiş yapacak
Bir aboneliği etkinleştirmiş olan tüm kullanıcılar, Adapty SDK'sı ile yeni bir uygulama sürümünü açtıklarında Adapty'ye geçer. Abonelik durumu doğrulama ve premium erişim otomatik olarak geri yüklenir.
:::
## Bu kılavuz nasıl düzenlenmiştir \{#how-this-guide-is-organized\}
Geçiş altı adımdan oluşur:
1. [Superwall kavramlarını Adapty'ye eşleştirin](#map-your-superwall-concepts-to-adapty)
2. [Adapty SDK'sını yükleyin](#install-the-adapty-sdk)
3. [SDK çağrılarını değiştirin](#replace-sdk-calls)
4. [App Store ve Google Play sunucu bildirimlerini değiştirin](#switch-app-store-and-google-play-server-notifications)
5. [Test edin ve yayınlayın](#test-and-release)
6. [(İsteğe bağlı) Geçmiş verileri içe aktarın](#optional-import-historical-data)
## Superwall kavramlarını Adapty'ye eşleştirin \{#map-your-superwall-concepts-to-adapty\}
Superwall kavramlarının büyük çoğunluğunun Adapty'de doğrudan bir karşılığı vardır:
| Superwall | Adapty | Ne değişiyor |
| :------------------- | :------------------------------------------------ | :--------------------------------------------------------------------------- |
| Campaign | [Placement](placements) + [Audience](audience) | Kampanya mantığı, bir placement (konum) ve bir kitle (kural) olarak ikiye ayrılır. |
| Placement | [Placement](placements) | Aynı kavram, aynı isim. |
| Audience filter | [Audience](audience) | Kural kümeleri bir placement içinde bulunur. |
| Entitlement | [Access level](access-level) | Adlandırılmış tanımlayıcı (örneğin, `premium`). |
| WebView paywall | [Paywall Builder paywall](adapty-paywall-builder) | Adapty SDK tarafından `WKWebView` yerine native olarak render edilir. |
| `PurchaseController` | Yerleşik | Uygulanacak protokol yok — satın almaları Adapty yönetir. |
| Feature gating | [Access level](access-level) kontrolü | `profile.accessLevels["premium"]?.isActive` değerini kontrol edin. |
Koda dokunmadan önce dikkat edilmesi gereken iki zihinsel değişim var:
- **Getirme ve gösterme ayrı adımlardır**: Superwall'un `register` fonksiyonu, paywallı getirir, kampanyayı değerlendirir ve UI'ı tek bir çağrıda sunar. Adapty bu adımları ayırır — paywallı getirirsiniz, yapılandırmasını alırsınız ve ardından gösterirsiniz. Bu değişiklik birkaç satır ekler ama yapılandırmaları önceden yüklemenize, özel bir yükleme durumu göstermenize veya kendi mantığınıza göre gösterimi iptal etmenize olanak tanır.
- **Abonelik durumu access level başınadır**: Superwall, tek bir yayımlanan `subscriptionStatus` özelliği sunar. Adapty, adlandırılmış access level'larla bir [`AdaptyProfile`](https://swift.adapty.io/documentation/adapty/adaptyprofile) döndürür; böylece bir kullanıcı `sports` ve `science` access level'larını bağımsız olarak tutabilir. Eş zamanlı okumalar için, her görünüm yüklemesinde `getProfile()` çağırmak yerine profili `AdaptyDelegate`'ten önbelleğe alın.
## Adapty SDK'sını yükleyin \{#install-the-adapty-sdk\}
Platformunuz için Adapty SDK'sını yükleyin — [iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity) veya [Capacitor](sdk-installation-capacitor) — ve aynı anda projenizden SuperwallKit'i kaldırın.
## SDK çağrılarını değiştirin \{#replace-sdk-calls\}
Entegrasyonunuzun her alanını inceleyin ve Superwall çağrısını Adapty karşılığıyla değiştirin. Her alt bölümün sonundaki bağlantılar yedi platform SDK'sının tamamını kapsar — uygulamanızla eşleşen platformu takip edin.
### SDK'yı başlatın \{#initialize-the-sdk\}
`Superwall.configure` yerine `Adapty.activate` kullanın.
Platformunuz için kurulum kılavuzuna bakın — [iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity) veya [Capacitor](sdk-installation-capacitor).
### Kullanıcıları tanımlayın ve oturumu kapatın \{#identify-and-log-out-users\}
`Superwall.shared.identify` yerine `Adapty.identify`, `Superwall.shared.reset` yerine `Adapty.logout` kullanın. Her iki SDK de ilk açılışta anonim bir profil oluşturur, bu nedenle bu çağrılar yalnızca kullanıcı oturum açtığında veya kapattığında gereklidir. Tanımladıktan sonra paywallları yeniden getirin — yeni kullanıcı farklı bir kitleye çözümlenebilir.
Platformunuz için tanımlama kılavuzuna bakın — [iOS](identifying-users), [Android](android-identifying-users), [React Native](react-native-identifying-users), [Flutter](flutter-identifying-users), [Kotlin Multiplatform](kmp-identifying-users), [Unity](unity-identifying-users) veya [Capacitor](capacitor-identifying-users).
### Paywall getirin ve gösterin \{#fetch-and-present-a-paywall\}
`Superwall.shared.register` yerine iki adımlı bir flow kullanın: `Adapty.getPaywall` ile paywallı getirin, `AdaptyUI.getPaywallConfiguration` ile görünüm yapılandırmasını yükleyin ve ardından gösterin.
Dikkat edilmesi gereken iki fark:
- **Feature gating, `feature:` kapanışının yerini alır**: Paywall kapandıktan sonra, dönen profildeki (veya `Adapty.getProfile` üzerindeki) aktif access level'ı kontrol edin ve oradan devam edin.
- **Paywalllar SDK tarafından render edilir**: Superwall, paywallları bir `WKWebView` içinde render eder. Adapty, Paywall Builder paywalllarını native olarak render eder — fontlar, ürün bilgileri ve düğmeler SDK tarafından çizilir.
Platformunuz için paywall hızlı başlangıç kılavuzuna bakın — [iOS](ios-quickstart-paywalls), [Android](android-quickstart-paywalls), [React Native](react-native-quickstart-paywalls), [Flutter](flutter-quickstart-paywalls), [Kotlin Multiplatform](kmp-quickstart-paywalls), [Unity](unity-quickstart-paywalls) veya [Capacitor](capacitor-quickstart-paywalls).
### Abonelik durumunu kontrol edin \{#check-subscription-status\}
`Superwall.shared.subscriptionStatus` yerine profilin adlandırılmış access level'ında şu kontrolü yapın: `profile.accessLevels["premium"]?.isActive`. `@Published` özellik deseni yerine `AdaptyDelegate.didLoadLatestProfile(_:)` aracılığıyla değişiklikleri izleyin ve eş zamanlı okumalar için profili kendi tarafınızda önbelleğe alın.
Platformunuz için abonelik durumu kılavuzuna bakın — [iOS](ios-check-subscription-status), [Android](android-check-subscription-status), [React Native](react-native-check-subscription-status), [Flutter](flutter-check-subscription-status), [Kotlin Multiplatform](kmp-check-subscription-status), [Unity](unity-check-subscription-status) veya [Capacitor](capacitor-check-subscription-status).
### Satın almaları ve geri yüklemeleri yönetin \{#handle-purchases-and-restores\}
Paywall Builder ile her iki SDK de satın almaları paywall UI'ı içinde otomatik olarak işler — **bu adımı atlayabilirsiniz**.
Özel paywalllar için Superwall bir `PurchaseController` uygulaması gerektirir. Adapty gerektirmez: `PurchaseController.purchase` yerine `Adapty.makePurchase`, `PurchaseController.restorePurchases` yerine `Adapty.restorePurchases` kullanın. SDK, doğrulamayı kendi başına yönetir.
Platformunuz için özel paywall hızlı başlangıç kılavuzuna bakın — [iOS](ios-quickstart-manual), [Android](android-quickstart-manual), [React Native](react-native-quickstart-manual), [Flutter](flutter-quickstart-manual), [Kotlin Multiplatform](kmp-quickstart-manual), [Unity](unity-quickstart-manual) veya [Capacitor](capacitor-quickstart-manual).
### Kullanıcı özelliklerini ayarlayın \{#set-user-attributes\}
`Superwall.shared.setUserAttributes` yerine `Adapty.updateProfile` kullanın.
Platformunuz için kullanıcı özellikleri kılavuzuna bakın — [iOS](setting-user-attributes), [Android](android-setting-user-attributes), [React Native](react-native-setting-user-attributes), [Flutter](flutter-setting-user-attributes), [Kotlin Multiplatform](kmp-setting-user-attributes), [Unity](unity-setting-user-attributes) veya [Capacitor](capacitor-setting-user-attributes).
## App Store ve Google Play sunucu bildirimlerini değiştirin \{#switch-app-store-and-google-play-server-notifications\}
Mağaza sunucu bildirimlerinizi Adapty'ye yönlendirin. Adapty bunlar olmadan da çalışır; ancak analitik, üçüncü taraf entegrasyonlar ve A/B testi metrikleri bunlara bağlıdır:
- **App Store**: [App Store sunucu bildirimlerini etkinleştirin](enable-app-store-server-notifications) kılavuzunu takip edin.
- **Google Play**: [Gerçek zamanlı geliştirici bildirimlerini etkinleştirin](enable-real-time-developer-notifications-rtdn) kılavuzunu takip edin.
Yayın sürecinde Superwall ve Adapty'yi paralel çalıştırmak istiyorsanız [raw events forwarding](enable-app-store-server-notifications#raw-events-forwarding) özelliğini kullanın — Adapty, yeni entegrasyonu doğrularken mağaza olaylarını Superwall'a proxy'ler.
## Test edin ve yayınlayın \{#test-and-release\}
Yayınlamadan önce her maddeyi işaretleyin:
- [x] Adapty Kontrol Paneli yapılandırıldı (ürünler, paywalllar, placement'lar, access level'lar)
- [x] Adapty SDK'sı yüklendi
- [x] Superwall SDK çağrıları Adapty karşılıklarıyla değiştirildi
- [x] App Store ve Google Play sunucu bildirimleri Adapty'ye yönlendirildi
- [ ] Sandbox satın alması yapıldı
- [ ] Yeni uygulama sürümü gönderildi
Son bir doğrulama geçişi için [yayın kontrol listesine](release-checklist) bakın.
## (İsteğe bağlı) Geçmiş verileri içe aktarın \{#optional-import-historical-data\}
Superwall, abonelik durumunuza sahip değildir — App Store ve Google Play sahiptir. Adapty, ilk açılışta makbuzları doğrular, bu nedenle ücretli kullanıcılar herhangi bir içe aktarma olmadan erişimlerini korur.
Adapty analitiğine geçmiş işlemlerin yedeklenmesini istiyorsanız [Adapty'ye geçmiş verileri içe aktarın](importing-historical-data-to-adapty) kılavuzunu takip edin. SDK'nın güncel satın alma fiyatlarını toplaması için zaman tanımak amacıyla SDK sürümünden en az bir hafta sonra bekleyin.
## SSS \{#faq\}
### Uygulamayı güncellemeyen abonelere ne olur? \{#what-happens-to-subscribers-who-dont-update-the-app\}
Kullanıcıların büyük çoğunluğu uygulamalarını gece otomatik olarak günceller, bu nedenle eski sürümdeki kullanıcı payı hızla azalır. Eski sürümdeki aboneler erişimlerini doğrudan App Store veya Google Play aracılığıyla korur — güncellemeyi zorunlu kılmanıza gerek yoktur.
### Superwall kampanya kitleleri aktarılıyor mu? \{#do-my-superwall-campaign-audiences-carry-over\}
Hayır. Superwall kitle filtreleri ve Adapty kitleleri farklı kontrol panellerinde yapılandırılır ve farklı tanımlayıcılar kullanır. Hedeflemenizi Adapty [placement'ları](placements) içinde [kitle](audience) olarak yeniden oluşturun. Çoğu uygulama bir veya iki placement çalıştırır (onboarding ve genel uygulama içi tetikleyici), bu nedenle yeniden yapılandırma genellikle kısa sürer.
### Adapty'nin `getPresentationResult` karşılığı var mı? \{#does-adapty-have-an-equivalent-to-getpresentationresult\}
Tek bir çağrı olarak mevcut değil. Bir placement'ın paywall gösterip göstermeyeceğini kontrol etmek için `Adapty.getPaywall(placementId:)` çağırın ve sonuca göre yönlendirin. Çağrı başarılı olursa, o kullanıcının kitlesi için bir paywall atanmış demektir. Hiçbir paywall yapılandırılmadığı için başarısız olursa, gösterimi atlayın ve yedek mantığınızı çalıştırın.
---
# File: importing-historical-data-to-adapty
---
---
title: "Geçmiş verileri Adapty'ye aktarma"
description: "Ayrıntılı analizler için geçmiş verileri Adapty'ye aktarın."
---
Adapty SDK'yı yükleyip uygulamanızı yayınladıktan sonra, kullanıcılarınıza ve abonelerinize [Profiller](profiles-crm) bölümünden erişebilirsiniz. Peki ya eski bir altyapınız varsa ve Adapty'ye geçiş yapmanız gerekiyorsa ya da mevcut verilerinizi Adapty'de görmek istiyorsanız?
:::note
Veri aktarımı zorunlu değildir
Adapty SDK entegre edilmiş uygulamayı açtıklarında Adapty, geçmiş kullanıcılara otomatik olarak access level tanıyacak ve satın alma olaylarını geri yükleyecektir. Bu kullanım senaryosunda geçmiş veri aktarımı gerekli değildir. Ancak önemli miktarda geçmiş işleminiz varsa veri aktarımı, analizlerinizin daha doğru olmasını sağlar; yine de genel olarak geçiş için zorunlu değildir.
:::
Verileri Adapty'ye aktarmak için:
1. İşlemlerinizi bir CSV dosyasına aktarın (iOS, Android ve Stripe için ayrı dosyalar hazırlanmalıdır). Ayrıntılı gereksinimler için aşağıdaki [İçe aktarma dosyası formatı bölümüne](importing-historical-data-to-adapty#import-file-format) bakın.
2. Herhangi bir dosya 1 GB'ı aşıyorsa, yaklaşık 100 satırlık bir veri örneği hazırlayın.
3. Tüm dosyaları Google Drive'a yükleyin (sıkıştırabilirsiniz, ancak ayrı tutun).
4. iOS işlemleri için, StoreKit 1 kullansanız bile [**App settings**](https://app.adapty.io/settings/ios-sdk) içindeki **In-app purchase API** bölümünün **Issuer ID**, **Key ID** ve **Private key** (.P8 dosyası) ile doldurulduğundan emin olun. Ayrıntılı talimatlar için [Issuer ID ve Key ID Sağlama](app-store-connection-configuration#step-2-provide-issuer-id-and-key-id) ve [In-App Purchase Key Dosyası Yükleme](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file) bölümlerine bakın.
5. Bağlantıları ekibimizle [e-posta](mailto:support@adapty.io) aracılığıyla veya Adapty Kontrol Paneli'ndeki çevrimiçi sohbet üzerinden paylaşın.
Geçmiş verilerin aktarılması, mevcut Adapty girdileriyle çakışsa bile yinelenen kayıtlar oluşturmaz.
## Android için bilinen kısıtlamalar \{#known-limitations-for-android\}
1. Yalnızca aktif abonelikler geri yüklenecektir; süresi dolmuş işlemler geri yüklenmez.
2. Bir abonelikteki yalnızca en son yenilemeler geri yüklenecektir; satın alma zincirinin tamamı geri yüklenmez.
3. Satın alma tarihinden bu yana ürün fiyatı değişmişse, mevcut fiyat kullanılır ve bu da yanlış fiyatlandırmaya yol açabilir.
:::note
Büyük hacimde Android işleminiz varsa, varsayılan API sınırını aşmamak için içe aktarmaya başlamadan önce [Google Play Developer API kota artışı talep etmeniz](google-play-quota-increase) gerekebilir.
:::
## İçe aktarma dosyası formatı \{#import-file-format\}
:::tip
RevenueCat'ten geçiş yapıyorsanız, RevenueCat dışa aktarma dosyasını doğrudan gönderebilirsiniz — dönüştürme gerekmez. Dışa aktarma talimatları için [RevenueCat belgelerine](https://www.revenuecat.com/docs/integrations/scheduled-data-exports) bakın.
:::
Lütfen verilerinizi aşağıdaki kurallara uyan bir veya birden fazla dosyada hazırlayın:
- [ ] Dosya formatı .CSV olmalıdır.
- [ ] Android, iOS ve Stripe içe aktarmaları için ayrı dosyalar hazırlanmalıdır.
- [ ] Her içe aktarma dosyası tüm [zorunlu sütunları](importing-historical-data-to-adapty#required-fields) içermelidir.
- [ ] İçe aktarma dosyalarındaki sütunların başlıkları olmalıdır.
- [ ] Sütun başlıkları aşağıdaki tablodaki **Column name** sütunuyla birebir aynı olmalıdır. Yazım hatalarını kontrol edin.
- [ ] Zorunlu olmayan sütunlar dosyada bulunmayabilir. Verisini almadığınız alanlar için boş sütun eklemeyin.
- [ ] İçe aktarma dosyaları tabloda belirtilmeyen ekstra sütunlar içermemelidir. Varsa lütfen silin.
- [ ] Değerler virgülle ayrılmalıdır.
- [ ] Değerler tırnak içine alınmamalıdır.
- [ ] Bir kullanıcı için birden fazla **apple_original_transaction_id** varsa, her **apple_original_transaction_id** için ayrı satır olarak hepsini ekleyin. Aksi takdirde consumable satın almaları geri yükleyemeyebiliriz.
Örnek dosyalar için lütfen [iOS](https://raw.githubusercontent.com/adaptyteam/adapty-docs/refs/heads/main/Downloads/adapty_import_ios_sample.csv) ve [Android](https://raw.githubusercontent.com/adaptyteam/adapty-docs/refs/heads/main/Downloads/adapty_import_android_sample.csv) bağlantılarını kullanın.
### Kullanılabilir içe aktarma dosyası sütunları \{#available-import-file-columns\}
| Sütun adı | Varlık | Açıklama |
|-----------|--------|-----------|
| **user_id** | zorunlu | Kullanıcınızın kimliği |
| **apple_original_transaction_id** | iOS için zorunlu | Orijinal işlem kimliği veya OTID ([daha fazla bilgi](https://developer.apple.com/documentation/appstoreserverapi/originaltransactionid)), StoreKit 2 içe aktarma mekanizmasında kullanılır. Bir kullanıcının birden fazla OTID'i olabileceğinden, başarılı bir içe aktarma için en az birini sağlamak yeterlidir.
**Not:** Bu içe aktarmanın çalışması için Adapty Kontrol Paneli'nizde In-app purchase API kimlik bilgilerinin ayarlanmış olması gerekir. Nasıl yapacağınızı [buradan](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file) öğrenin.
| | **google_product_id** | Google için zorunlu | Google Play Store'daki ürün kimliği. | | **google_purchase_token** | Google için zorunlu | Kullanıcıyı ve satın aldıkları uygulama içi ürünün ürün kimliğini temsil eden benzersiz tanımlayıcı | | **google_is_subscription** | Google için zorunlu | Olası değerler: `1` \| `0` | | **stripe_token** | Stripe için zorunlu | Benzersiz bir satın almayı temsil eden Stripe nesnesinin token'ı. Stripe'ın Abonelik (`sub_...`) veya Ödeme Niyeti (`pi_...`) token'ı olabilir. | | **subscription_expiration_date** | isteğe bağlı | Abonelik bitiş tarihi, yani bir sonraki ödeme tarihi; saat dilimi bilgisiyle birlikte tarih ve saat (2020-12-31T23:59:59-06:00) | | **created_at** | isteğe bağlı | Profil oluşturma tarihi ve saati (2019-12-31 23:59:59-06:00) | | **birthday** | isteğe bağlı | Kullanıcının doğum tarihi, format: 2000-12-31 | | **email** | isteğe bağlı | Kullanıcınızın e-posta adresi | | **gender** | isteğe bağlı | Kullanıcının cinsiyeti | | **phone_number** | isteğe bağlı | Kullanıcınızın telefon numarası | | **country** | isteğe bağlı | [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) formatı | | **first_name** | isteğe bağlı | Kullanıcınızın adı | | **last_name** | isteğe bağlı | Kullanıcınızın soyadı | | **last_seen** | isteğe bağlı | Saat dilimi bilgisiyle birlikte tarih ve saat (2020-12-31T23:59:59-06:00) | | **idfa** | isteğe bağlı | Reklam verenler için tanımlayıcı (IDFA), Apple'ın kullanıcının cihazına atadığı rastgele bir cihaz tanımlayıcısıdır. Yalnızca iOS uygulamaları için geçerlidir | | **idfv** | isteğe bağlı | Satıcılar için tanımlayıcı (IDFV), tek bir geliştiricinin geliştirdiği tüm uygulamalara (bu durumda sizin uygulamalarınıza) atanan benzersiz bir koddur. Yalnızca iOS uygulamaları için geçerlidir | | **advertising_id** | isteğe bağlı | Reklam kimliği, reklamverenlerin bir kullanıcının cihazını benzersiz şekilde tanımlamak için kullanabileceği Android İşletim Sistemi tarafından atanan benzersiz bir koddur | | **amplitude_user_id** | isteğe bağlı | Amplitude'deki kullanıcı kimliği | | **amplitude_device_id** | isteğe bağlı | Amplitude'deki cihaz kimliği | | **mixpanel_user_id** | isteğe bağlı | Mixpanel'deki kullanıcı kimliği | | **appmetrica_profile_id** | isteğe bağlı | AppMetrica'daki kullanıcı profil kimliği | | **appmetrica_device_id** | isteğe bağlı | AppMetrica'daki cihaz kimliği | | **appsflyer_id** | isteğe bağlı | AppsFlyer'dan benzersiz tanımlayıcı | | **adjust_device_id** | isteğe bağlı | Adjust'taki cihaz kimliği | | **facebook_anonymous_id** | isteğe bağlı | Facebook'un, uygulamanız veya web sitenizle Facebook'a giriş yapmadan (anonim olarak) etkileşime giren kullanıcılar için oluşturduğu benzersiz tanımlayıcı | | **branch_id** | isteğe bağlı | Branch'ten benzersiz tanımlayıcı | | **attribution_source** | isteğe bağlı | Attribution'ın kaynak entegrasyonu, örneğin appsflyer | | **attribution_status** | isteğe bağlı | organic | | **attribution_channel** | isteğe bağlı | İşlemi getiren attribution kanalı | | **attribution_campaign** | isteğe bağlı | İşlemi getiren attribution kampanyası | | **attribution_ad_group** | isteğe bağlı | İşlemi getiren attribution reklam grubu | | **attribution_ad_set** | isteğe bağlı | İşlemi getiren attribution reklam seti | | **attribution_creative** | isteğe bağlı | Tıklama, dönüşüm veya yükleme gibi istenen eylemleri yönlendirmedeki etkinliklerini belirlemek için takip edilen bir reklam veya pazarlama kampanyasında kullanılan belirli görsel veya metinsel öğeler | | **custom_attributes** | isteğe bağlı | Anahtar-değer formatında JSON sözlüğü olarak en fazla 30 özel öznitelik tanımlayın:Format: `"{'string_value': 'some_value', 'float_value': 123.0, 'int_value': 456}"`.
Formatta çift ve tek tırnak kullanımına dikkat edin. Boolean ve tam sayı değerlerinin float'a dönüştürüleceğini unutmayın.
| ### Zorunlu Alanlar \{#required-fields\} Her platform için 2 grup zorunlu alan vardır: **user_id** ve ilgili platforma özgü satın almaları tanımlayan veriler. Platform başına zorunlu alanlar için aşağıdaki tabloya bakın. | Platform | Zorunlu alanlar | |--------|---------------| | iOS |user_id
apple_original_transaction_id
| | Android |user_id
google_product_id
google_purchase_token
google_is_subscription
| | Stripe |user_id
stripe_token
| Bu alanlar olmadan Adapty işlemleri getiremez. Doğru kohort analitiği için lütfen `created_at` alanını belirtin. Sağlanmazsa, yükleme tarihinin ilk satın alma tarihiyle aynı olduğu varsayılır. ### Verileri Adapty'ye Aktar \{#import-data-to-adapty\} Lütfen bizimle iletişime geçin ve içe aktarma dosyalarınızı [support@adapty.io](mailto:support@adapty.io) adresi veya [Adapty Kontrol Paneli](https://app.adapty.io/overview)'ndeki çevrimiçi sohbet aracılığıyla paylaşın. --- # File: migrate-integrations-to-adapty --- --- title: "Adapty'ye entegrasyonları taşıma" description: "Analytics ve attribution entegrasyonlarını eski bir çözümden Adapty'ye, etkinlikleri çoğaltmadan veya kampanyaları aksatmadan geçirin." --- Adapty'ye geçiş yapmak, yalnızca SDK'yı değiştirmekten fazlasını gerektirir. Amplitude ve Adjust gibi üçüncü taraf analytics ve attribution entegrasyonlarınızın da koordineli bir şekilde değiştirilmesi gerekir. Dikkatli yapıldığında, geçiş sırasında çok az sayıda tekrarlanan veya eksik etkinlik oluşur ve kampanyalarınız sekteye uğramaz. ## Etkinliklerinizi eşleştirin \{#map-your-events\} Etkinlik adları, çoğu Adapty entegrasyonunda özelleştirilebilir. Bunları kontrol panellerinizde ve kampanyalarınızda zaten kullanılan adlarla eşleşecek şekilde yapılandırabilirsiniz. Analytics ve kampanya raporlarınız, geçişin ardından aynı etkinlik adlarıyla çalışmaya devam eder. Adapty'de mevcut etkinliklerin tam listesini görmek için [Etkinlikler](events) sayfasına bakın. Adjust için entegrasyon, özel etkinlik adları yerine etkinlik ID'leri kullanır. Mevcut etkinlik ID'lerinizi Adjust kontrol panelinden Adapty entegrasyon yapılandırmasına aktarın. Ayrıntılar için [Adjust entegrasyon kılavuzuna](adjust) bakın. ## Adapty entegrasyon etkinliklerini nasıl oluşturur \{#how-adapty-creates-integration-events\} Bir entegrasyona etkinlik göndermek için Adapty'nin bir kullanıcı profiline sahip olması gerekir. Profil iki şekilde oluşturulur: - **Geçmiş veri içe aktarma**: [Geçmiş işlem verilerini içe aktardığınızda](importing-historical-data-to-adapty) SDK devreye girmeden önce profil oluşturulur. - **SDK etkileşimi**: Kullanıcı uygulamayı Adapty SDK'sı ile ilk kez açtığında profil otomatik olarak oluşturulur. Adapty, eski sistemde gerçekleştirilen satın almaları gerçek zamanlı olarak öğrenir. Ancak entegrasyon etkinliğini yalnızca satın alan kullanıcının profili mevcut olduğunda gönderebilir. Profil, kullanıcı uygulamayı Adapty SDK'sı ile açtığında oluşturulur. Yeni sürüme güncelleme yapmayan kullanıcılar entegrasyon etkinliği oluşturmaz. ## Geçiş gününden önce hazırlanın \{#prepare-before-migration-day\} ### Geçmiş etkinlikleri hariç tutun \{#exclude-historical-events\} [Entegrasyon ayarlarınızda](configuration) **Exclude Historical Events** seçeneğini etkinleştirin. Bu, kullanıcının ilk Adapty SDK oturumundan önceki etkinliklerin entegrasyona gönderilmesini engeller. Bu ayar özellikle [geçmiş veri içe aktarma](importing-historical-data-to-adapty) sırasında önemlidir; Adapty bu süreçte büyük hacimde geçmiş işlemi aynı anda işler. Bu ayar olmadan söz konusu işlemler, analytics aracınızda büyük hacimde etkinlik üretir. ### Entegrasyonu önceden kurun \{#set-up-the-integration-in-advance\} Adapty, bir entegrasyonu devre dışı tutarken yapılandırmanıza ve test etmenize olanak tanır. Entegrasyonu etkinleştirmeye hazır olana kadar kimlik bilgilerini, etkinlik eşleştirmeyi ve filtreleri ayarlayabilirsiniz. Kurulum, etkinleştirdiğinizde korunur; dolayısıyla geçiş gününe kadar kapalı tutmak hiçbir şeyi kaybettirmez. Entegrasyonunuzu bulmak için [Attribution entegrasyonları](attribution-integration), [Analytics entegrasyonları](analytics-integration), [Mesajlaşma servisi entegrasyonları](messaging) veya [Webhook ve ETL entegrasyonları](webhook-and-etl) sayfalarına bakın. ## Geçiş günü değişikliği yapın \{#switch-on-migration-day\} Eski çözümünüzdeki entegrasyonu devre dışı bırakın ve aynı anda Adapty'deki entegrasyonu etkinleştirin. Her ikisini aynı anda çalıştırmak tekrarlanan etkinliklere neden olur. Geçiş günü büyük kullanıcı edinme kampanyalarını duraklatın. Bu, örtüşme penceresi boyunca oluşan etkinliklerin neden olabileceği kampanya optimizasyon hatalarının riskini azaltır. ## Ne beklemelisiniz \{#what-to-expect\} Geçiş sırasında bazı eksik veya tekrarlanan entegrasyon etkinlikleri kaçınılmazdır. Geçiş doğru yapıldığında, etkilenen etkinliklerin sayısı göz ardı edilebilecek düzeyde azdır. Boşlukların temel kaynağı yukarıda açıklanan zamanlama sorunudur: Adapty, bir satın alma için entegrasyon etkinliğini ancak kullanıcının profili mevcut olduktan sonra gönderebilir. Eski sistemde yapılan satın almalar, alıcı uygulamayı Adapty SDK'sı ile açana kadar Adapty entegrasyon etkinliği oluşturmaz. ## Entegrasyonlar ve sunucudan sunucuya bildirimler \{#integrations-vs-server-to-server-notifications\} Adapty, ham sunucudan sunucuya mağaza bildirimlerini doğrudan analytics veya attribution araçlarınıza yönlendirmek yerine entegrasyonları kullanmanızı önerir. Entegrasyonlarla: - **Birleşik format**: App Store, Google Play, Stripe gibi tüm mağazalardan gelen etkinlikler aynı etkinlik formatını kullanır. - **Zenginleştirilmiş veri**: Etkinlikler, abonelik durumu ve kullanıcı öznitelikleri gibi Adapty'nin topladığı verileri içerir. Ham bildirimler bunu içermez. --- # File: whats-new --- --- title: "Neler yeni" description: "Adapty'deki en son özellikler ve geliştirmelerden haberdar olun" --- En son özellikler, geliştirmeler, SDK güncellemeleri ve uygulamanızın para kazanma stratejisini optimize etmenize yardımcı olan dokümantasyon iyileştirmeleri hakkında bilgi edinin. Bu sayfa her ay en önemli sürümleri öne çıkarır. :::note Yeni özellikler hakkında geri bildiriminiz mi var? Sizden duymaktan mutluluk duyarız! [Ürün geri bildirim panosu](https://adapty.featurebase.app/en?b=69831ba5e82e7a3391632ec2) aracılığıyla bizimle iletişime geçin. ::: ## Temmuz 2026 \{#july-2026\} - **Sanal para birimleri**: Token, coin veya gem gibi uygulama içi para birimlerini tanımlayın, her kullanıcı için bakiye atayın ve takip edin; bu bakiyeleri sunucu tarafı API üzerinden okuyun. [Daha fazla bilgi](virtual-currencies) - **Apple Ads Manager'da AI Agent**: Apple Ads performansınızı danışmanlık sohbet aracısına sorun ve kampanya verilerinizden elde edilen yanıtları elle rapor oluşturmak zorunda kalmadan alın. [Daha fazla bilgi](ads-manager-ai-agent) - **Apple Ads Manager'da yeni otomasyonlar**: Mevcut anahtar kelime ve arama terimi otomasyonlarının yanı sıra iki yeni kural türüyle kampanya ve reklam grubu düzeylerinde değişiklikleri otomatikleştirin. [Kampanya kuralları](ads-manager-automations-campaign-rules) | [Reklam grubu kuralları](ads-manager-automations-ad-group-rules) - **Adapty Mail'de profiller**: Her kullanıcının yolculuğunu, mevcut abonelik durumunu ve abonelikten çıkma durumunu tek bir yerde gösteren aboneye özel görünüm. [Daha fazla bilgi](mail-profiles) - **React Native, Flutter, Capacitor ve Kotlin Multiplatform için SDK v4**: Flow'ları destekleyen v4 SDK'lar yayında. React Native, Flutter ve Capacitor genel kullanıma sunuldu; Kotlin Multiplatform v4 de kendi geçiş rehberiyle birlikte çıktı. [React Native](migration-to-react-native-sdk-v4) | [Flutter](migration-to-flutter-sdk-v4) | [Capacitor](migration-to-capacitor-sdk-v4) | [Kotlin Multiplatform](migration-to-kmp-sdk-v4) - **Yeni webhook alanları**: Webhook payload'ları artık her işlem için orijinal fiyatı ve indirimi içeriyor; böylece promosyon ve başlangıç fiyatlandırmasını aşağı akışta takip edebilirsiniz. Bu alanlar yalnızca webhook'larda mevcuttur. [Daha fazla bilgi](webhook-event-types-and-fields) - **Flow'larda üstü çizili fiyatlar**: İndirim rozeti ile birlikte indirimli fiyatın yanında orijinal fiyatı üstü çizili olarak doğrudan Flow Builder'da gösterin. [Daha fazla bilgi](strikethrough-price) - **Flow şablon galerisi**: Boş bir tuvalle başlamak yerine, profesyonelce tasarlanmış bir şablondan yeni bir flow başlatın ve uygulamanıza uyacak şekilde özelleştirin. [Daha fazla bilgi](paywall-builder-templates) - **Install tools butonu**: Artık her dokümantasyon makalesinin başlığında bir **Install tools** butonu bulunuyor. Bu buton, Adapty SDK entegrasyon becerisini Claude Code, Copilot CLI, Gemini CLI, Codex ve diğer yapay zeka kodlama asistanlarına yüklemek için kopyalamaya hazır komutlar içeren bir modal açar. [Daha fazla bilgi](adapty-sdk-integration-skill) - **Yeni Unity SDK kurulum yöntemi**: Unity SDK'yı artık Swift Package Manager üzerinden kurabilirsiniz; yaygın kurulum sorunları için sorun giderme rehberi de eklendi. [Daha fazla bilgi](sdk-installation-unity) - **Flow Builder'da alt bilgi konteyneri**: Ekranın geri kalanı kaydırılırken sabit kalan yapışkan bir alt panel — CTA butonları, yasal metinler ve bağlantılar için idealdir. [Daha fazla bilgi](builder-containers#footer) - **Yeni Flow Builder video eğitimleri**: Flow Builder kılavuzlarına eklenen, flow oluşturmaya yönelik adım adım YouTube video oynatma listesi. [Daha fazla bilgi](adapty-flow-builder) ## Haziran 2026 \{#june-2026\} - **Flow'lar artık Android'i destekliyor**: Paywall ve onboarding'ler için görsel no-code builder artık iOS'un yanı sıra Android SDK v4 ve üzerinde de çalışıyor. Ekranlar, web görünümü olmadan yerel olarak render ediliyor. [Daha fazla bilgi](adapty-flow-builder) - **Apple Ads Manager'da CPP A/B Testleri**: Özel ürün sayfalarını Apple Ads içinde birbirleriyle karşılaştırın. Mevcut varsayılan sayfanız dahil 2 ila 4 sayfa seçin; Apple Ads aralarındaki trafiği döngüsel olarak dağıtır ve hangisinin en iyi dönüşüm sağladığını raporlar. [Daha fazla bilgi](ads-manager-cpp-ab-tests) - **Adapty Mail API**: Kullanıcı profillerini ve işlemleri, Adapty SDK üzerinden yönlendirmeden doğrudan sunucunuzdan Adapty Mail'e gönderin. Abone tabanı oluşturmak, diğer uygulamalarınızdaki aboneleri yeniden kullanmak veya backend'inizi gerçeğin kaynağı olarak tutmak için kullanabilirsiniz. [Daha fazla bilgi edinin](mail-send-data-via-api) - **İlk açılışta Apple Ads hedefli paywall gösterme**: Apple Ads attribution verisi SDK etkinleştikten sonra geldiği için çok erken istenen bir paywall, Apple Ads kitlenizi kaçırır. Attribution verisi gelir gelmez Apple Ads hedefli paywallı göstermek için `AdaptyProfile.appliedAttributionSources` kullanın. [iOS](ios-show-aa-targeted-paywall) | [React Native](react-native-show-aa-targeted-paywall) | [Capacitor](capacitor-show-aa-targeted-paywall) - **Flow Builder'da Otomatik Kaydetme**: Flow Builder artık ilerlemenizi dakikada bir otomatik olarak kaydediyor; böylece sayfadan ayrıldığınızda kaydedilmemiş çalışmalarınızı kaybetmiyorsunuz. **Cmd/Ctrl + S** kısayoluyla taslağı manuel olarak da kaydedebilirsiniz. [Daha fazla bilgi](builder-save-publish) - **Yeni Flow Builder video eğitimleri**: İki yeni rehber; flow ekranları arasında gezinme oluşturmayı ve seçili, etkin ve devre dışı gibi element durumlarını tasarlamayı ele alıyor. [Flow'larda gezinme](onboarding-navigation-branching) | [Element durumları](builder-element-states) - **Japonca ve Vietnamca Dokümantasyon**: Adapty dokümantasyonu artık Japonca (日本語) ve Vietnamca (Tiếng Việt) dillerinde de mevcut. Dil değiştirmek için üst navigasyondaki dil seçicisini kullanın. ## Mayıs 2026 \{#may-2026\} - **Flow'lar (Beta)**: Görsel bir no-code builder'da ekran dizileri oluşturun — tek ekranlı paywall'lar, çok adımlı onboarding'ler ve bunların arasındaki her şey, hepsi tek bir flow içinde. Ekranlar web view kullanmadan native olarak render edilir; uygulama güncellemesi yayınlamadan metin, tasarım ve mantığı güncelleyebilirsiniz. Şu an iOS, Android, React Native, Flutter ve Capacitor SDK v4 ve üzerini desteklemektedir. [Daha fazla bilgi](adapty-flow-builder) - **Autopilot artık test sonuçlarınıza göre uyum sağlıyor**: Yapay zeka büyüme yöneticisi gibi davranarak her tamamlanan turdan sonra büyüme planını günceller. Bir sonraki hipotez, hangi deneyleri yürüttüğünüze, hangilerinin kazandığına ve hangi yönlerin hâlâ keşfedilmeye değer olduğuna dayanır — sabit bir sırayı takip etmek yerine. [Daha fazla bilgi edinin](autopilot-how-it-works#how-ai-growth-advisor-decides-what-to-recommend) - **Autopilot Market Insights'ta Aktivasyon ARPU'su**: Yeni bir grafik, uygulamanızın yeni kurulum başına ortalama gelirini kategori ortalamasıyla karşılaştırır. Dönüşüm hunisiyle birlikte değerlendirin — yüksek dönüşümle birlikte düşük Aktivasyon ARPU'su, fiyatlandırmanın düşük tutulduğuna işaret edebilir. [Daha fazla bilgi](autopilot-analysis#activation-arpu) - **Adapty Mail'de Analytics**: Her kampanya için teslimat metriklerini ve e-postaya atfedilen geliri tek bir görünümde karşılaştırın. Kampanya, segment, A/B varyantı, mesaj veya tetikleyiciye göre gruplandırın, detaylandırın ve filtreleyin; ardından herhangi bir satıra tıklayarak derinlemesine inceleyin. [Daha fazla bilgi](mail-analytics) - **Adapty Mail'deki marka profili**: E-posta içeriğini, tonunu, görsellerini ve web paywall içeriğini yönlendiren birleşik bir profil. Adapty, bu profili uygulamanızın mağaza sayfasından, açılış sayfasından, yasal sayfalarından ve sosyal profillerinizden oluşturur; her bölümü satır içinde inceleyip düzenleyebilirsiniz. [Daha fazla bilgi](mail-brand) - **Adapty UA'da Tahminler**: Her kohort için tahmini gelir, ROAS, reklam kârı, ARPU ve ARPPU; böylece kampanyalarınız olgunlaşmadan önce karşılaştırabilirsiniz. Tahminler, uygulamanızın kendi geçmiş kohort verilerinden oluşturulur, günlük güncellenir ve D0'dan D360'a kadar veya özel bir gün için kohort dönemlerinde kullanılabilir. [Daha fazla bilgi](ua-predicted-metrics) - **Adapty UA özel S3 dışa aktarımında yeni alanlar**: Özel S3 dışa aktarımı artık `bundle_id`, `device_brand`, `device_model`, `os_version`, `app_version` ve `sdk_version` alanlarını içeriyor. Attribution verilerini aşağı akışta cihaz ve uygulama sürümüne göre dilimleyin ve birleştirin. [Daha fazla bilgi](ua-custom-s3) - **CLI'da Placement kitleleri**: `adapty placements create` ve `adapty placements update` komutları artık `--audiences` bayrağını destekliyor — `{segment_ids, paywall_id, priority}` girdilerinden oluşan bir JSON dizisi — böylece terminalden farklı segmentlere farklı paywalllar hedefleyebilirsiniz. Yeni `adapty paywalls placements` komutu, belirli bir paywall'ı kullanan tüm placement'ları listeler; böylece paywall'ı değiştirmeden önce etkisini önizleyebilirsiniz. [Daha fazla bilgi](developer-cli-reference#placements) - **İspanyolca Dokümantasyon**: Adapty dokümantasyonu artık İspanyolca (Español) olarak da mevcut. Dil seçicisini üst navigasyondan kullanarak diller arasında geçiş yapabilirsiniz. ## Nisan 2026 \{#april-2026\} - **Adapty Mail**: Deneme kullanıcılarını ücretli abonelere dönüştüren yapay zeka destekli e-posta kampanyaları. Kampanyalarınızı Adapty projenizden oluşturun, gönderin ve ilişkilendirin — ayrı bir e-posta platformuna gerek yok. [Daha fazla bilgi](adapty-mail) - **Autopilot'ta Paywall Tanılama**: Test oluşturmadan önce paywallınızda neyi düzeltmeniz gerektiğini öğrenin. Bir ekran görüntüsü yükleyin; Autopilot, kategorinizdeki en iyi performans gösteren uygulamalardan referans alınmış öneriler ve yapay zeka tarafından üretilen düzen ile metin önerileri sunar. Referans alınan öneriler, büyüme planınızdaki A/B testi turlarına dönüşür. [Daha fazla bilgi edinin](autopilot-analysis#paywall-analysis) - **Her Autopilot önerisi için daha net rehberlik**: Her hipotez artık neden önemli olduğunu (paywall'ınızın yerleşik kalıplardan nasıl saptığına dair veriye dayalı bir açıklama), neyi değiştireceğinizi ve A/B testini nasıl kuracağınızı, ayrıca yeni "Sonuçlarınızı nasıl yorumlarsınız" bölümünde hangi metrikleri izleyeceğinizi açıkça ortaya koyuyor. [Daha fazla bilgi edinin](autopilot-execute-plan#step-1-view-the-hypothesis) - **Autopilot büyüme planınızı güncel tutun**: En son pazar verilerini ve yeni önerileri çekmek için analizi yenileyin; yeni öneriler işe yaramazsa sürüm geçmişindeki eski önerilere geri dönün. Hipotezler Üst öncelik, Tümü, Fiyatlandırma, Görsel, Coğrafi fiyatlandırma ve Arşivlenenler sekmeleri altında gruplandırılmıştır. [Daha fazla bilgi edinin](autopilot-growth-plan) - **Autopilot'ta süreye göre gelir dağılımı**: Gelirinizin tek bir abonelik süresinde aşırı yoğunlaşıp yoğunlaşmadığını görün. Yeni bir Market Insights grafiği, kategori ve ülkenize ait sektör ortalamasıyla birlikte süreye göre gelir karışımınızı gösterir. [Daha fazla bilgi](autopilot-analysis#revenue-distribution-by-duration) - **Güncellenmiş LTV ve gelir tahminleri**: Tahmini LTV ve gelir artık yeterli geçmiş veri olduğunda uygulamanızın kendi kohort elde tutma verilerini, yoksa uygulamalar arası ortalamaları kullanıyor; böylece daha yeni uygulamalar bile analitik ve A/B testlerinde kullanılabilir tahminler elde ediyor. [Daha fazla bilgi](predicted-ltv-and-revenue) - **Adapty UA'da tüm etkinlikleri gönder**: Meta ve TikTok'a daha kapsamlı bir dönüşüm görünümü sunarak kitle modellemesini keskinleştirin. Adapty artık yalnızca bir kampanyayla eşleşen kullanıcılar için değil, organik ve attribution yapılmamış kullanıcılardan gelen yükleme ve işlemleri de pikselinize iletmeyi destekliyor. [Meta](ua-facebook#send-all-events) | [TikTok](ua-tiktok#send-all-events) - **Rusça ve Türkçe dokümantasyon**: Adapty dokümantasyonu artık Rusça (Русский) ve Türkçe (Türkçe) olarak kullanılabilir. Dil seçimi için üst gezinti çubuğundaki dil seçiciyi kullanabilirsiniz. ## Mart 2026 \{#march-2026\} - **Geliştirici CLI'ı**: Adapty hesabınızı kontrol panelini açmadan terminalden yönetin. CLI sayesinde uygulama oluşturabilir, access level tanımlayabilir, ürün kurabilir, paywall oluşturabilir ve placement yapılandırabilirsiniz — tüm bunlar otomatik ortamlar için betiklenebilir. AI kodlama asistanlarının CLI ile çalışmasına yardımcı olmak için bir [Adapty CLI becerisi](https://github.com/adaptyteam/adapty-cli/tree/main/skills/adapty-cli) de mevcuttur. [Daha fazla bilgi](developer-cli) - **Apple Ads Manager'daki Genel Bakış sayfası**: Tüm temel Apple Ads metriklerini tek bir yerde, her biri bir trend grafiğiyle görün. Başlık açılır menüsünden uygulamaya göre filtreleyin, hangi metriklerin görüneceğini özelleştirin ve grafik türü ile gelir görünümünü ayarlayın. [Daha fazla bilgi](ads-manager-overview) - **Apple Ads Manager'da Market Intelligence**: Rakiplerinizin 50'den fazla ülkede hangi anahtar kelimelerde reklam yayınladığını görün ve en iyi performans gösteren anahtar kelimeleri doğrudan kampanyalarınıza ekleyin. [Daha fazla bilgi](ads-manager-market-intelligence) - **Apple Ads Manager'da tam döngülü anahtar kelime otomasyonları**: Tanımladığınız performans kurallarına göre teklifleri otomatik olarak ayarlayın, anahtar kelimeleri durdurun veya etkinleştirin ve bunları reklam grupları arasında taşıyın. [Daha fazla bilgi](ads-manager-automations-keyword-rules) - **Apple Ads Manager'da teklif geçmişi**: Herhangi bir anahtar kelimenin CPT teklifi için tam değişiklik günlüğünü görüntüleyin — her değişikliğin ne zaman gerçekleştiğini, önceki ve yeni değerleri ve hangi otomasyon kuralının tetiklediğini öğrenin. [Daha fazla bilgi](ads-manager-manage-keywords#bid-history) - **Autopilot'ta görsel turlar**: Paywall tasarım önerileri artık büyüme planınızda birinci sınıf turlar — monetizasyon turlarının yanında kenar çubuğunda listeleniyor. Her görsel tur, bir tasarım maketini, kalıbın en iyi ne zaman işe yaradığının açıklamasını ve hedeflediği temel metrikleri içeriyor. [Daha fazla bilgi edinin](autopilot-growth-plan#view-the-growth-plan) - **Autopilot'a kendi hipotezinizi ekleyin**: Büyüme planınızı özel turlarla genişletin. Bir başlık, açıklama, tur türü (monetizasyon veya görsel), hedef metrikler ve — monetizasyon turları için — dahil olan ürünleri ekleyin. [Daha fazla bilgi](autopilot-growth-plan#add-your-own-hypothesis) - **Autopilot turlarını yeniden sıralayın**: Büyüme planınızın aşamalarını sürükleyip sıralayarak deneyleri stratejinize en uygun sırayla çalıştırın. [Daha fazla bilgi](autopilot) - **Autopilot'ta Coğrafi Fiyatlandırma Turları**: Büyüme planınızda yeni bir tur türü olarak ülkeye özel fiyat değişikliklerini test edin. Market Insights verilerine dayanarak Autopilot, her ülkede fiyatların artırılması, düşürülmesi veya sabit tutulması gerektiğini önerir. Bir öneriyi A/B testi olarak çalıştırmak için coğrafi fiyatlandırma turu olarak ekleyin — aynı anda en fazla 5 tur çalışabilir. [Daha fazla bilgi](autopilot-growth-plan#geo-pricing-hypotheses) - **Apple Ads Manager'da arama terimi otomasyonları**: Kazanan arama terimlerini tam eşleşme anahtar kelimelere otomatik olarak yükseltin ve manuel rapor indirmeye gerek kalmadan kaynakta negatifleyin. Kurallar şablonlardan oluşturulabilir ya da özel koşullar ve zamanlamalarla sıfırdan inşa edilebilir. [Daha fazla bilgi](ads-manager-automations-search-terms) - **Apple Ads Manager'da Maximize Conversions teklif stratejisi**: Kampanya oluştururken artık teklif stratejisi olarak Maximize Conversions'ı seçebilirsiniz. Apple'ın algoritması, isteğe bağlı bir hedef EBM rehberliğinde bütçeniz dahilinde indirmeleri maksimuma çıkarır. [Daha fazla bilgi](ads-manager-create-campaign) - **Adapty UA'da FunnelFox entegrasyonu**: Adapty UA'da FunnelFox ile yeni entegrasyon artık kullanılabilir. [FunnelFox](ua-funnelfox) - **Çince dokümantasyon**: Adapty dokümantasyonu artık Çince (中文) olarak da mevcut. Üst gezinti çubuğundaki dil seçicisini kullanarak diller arasında geçiş yapabilirsiniz. ## Şubat 2026 \{#february-2026\} - **Ülkeye özgü ürün fiyatlandırması**: Adapty Kontrol Paneli üzerinden her ülke için ayrı fiyat belirleyin — Adapty değişiklikleri App Store Connect ve Google Play'e otomatik olarak yansıtır. Her fiyat güncellemesi denetim günlüğüne kaydedilir, hiçbir değişiklik takip dışı kalmaz. [Daha fazla bilgi](edit-product) - **Autopilot'ta ülke bazında rakip fiyatlandırması**: Abonelik fiyatlarınızı en büyük pazarlarınızdaki rakiplerinizle karşılaştırın. [Daha fazla bilgi](autopilot-analysis#market-and-competitor-analysis) - **Onboarding versiyon kontrolü**: Tam versiyon geçmişiyle onboarding'lerinizin versiyonlarını takip edin ve yönetin. Değişiklikleri inceleyin ve gerektiğinde geri alın. - **Analizlerde paywall dönüşüm grafikleri**: Paywall görüntüleme → Deneme ve Paywall görüntüleme → Ücretli olmak üzere iki yeni dönüşüm grafiği, paywall'larınızın ziyaretçileri aboneye ne kadar dönüştürdüğünü gösterir. [Daha fazla bilgi](analytics-conversion) - **Yinelenen segmentler**: Benzer bir segmenti sıfırdan yeniden oluşturmak yerine, mevcut bir segmenti tüm filtreleriyle kopyalayın. Birden fazla kampanya veya örtüşen kitlelere sahip A/B testleri yürütürken kullanışlıdır. [Daha fazla bilgi](segments#duplicate-segments) - **Adapty mobil uygulamasında push bildirimleri**: Abonelik etkinliğini takip etmek için kontrol panelini açmadan, doğrudan Adapty iOS uygulamasında 14 etkinlik türü için push bildirimlerini yapılandırın. [Daha fazla bilgi](push-notifications) - **Kotlin Multiplatform SDK 3.15**: Onboarding desteği, web paywalls ve API iyileştirmeleri ekler. [Daha fazla bilgi](migration-to-kmp-315) - **Capacitor SDK 3.16**: Capacitor 8 desteği ekler. Capacitor 7 kullanan projeler SDK v3.15'te kalmalıdır. [Daha fazla bilgi](migration-to-capacitor-316) - **LLM destekli SDK entegrasyon rehberleri**: AI kodlama asistanlarının yardımıyla Adapty entegrasyonu için adım adım rehberler. Her rehber, LLM'inizi kontrol paneli kurulumundan satın almalara kadar tüm implementasyon sürecinde yönlendirir. [iOS](adapty-cursor) | [Android](adapty-cursor-android) | [React Native](adapty-cursor-react-native) | [Flutter](adapty-cursor-flutter) | [Unity](adapty-cursor-unity) | [Kotlin Multiplatform](adapty-cursor-kmp) | [Capacitor](adapty-cursor-capacitor). Tek komutlu otomatik bir flow için yeni **adapty-sdk-integration skill**'i deneyin (beta): [iOS](adapty-sdk-integration-skill) | [Android](adapty-sdk-integration-skill-android) | [React Native](adapty-sdk-integration-skill-react-native) | [Flutter](adapty-sdk-integration-skill-flutter) | [Unity](adapty-sdk-integration-skill-unity) | [Kotlin Multiplatform](adapty-sdk-integration-skill-kmp) | [Capacitor](adapty-sdk-integration-skill-capacitor) ## Ocak 2026 \{#january-2026\} - **Capacitor SDK resmi olarak yayınlandı**: Kapsamlı testlerin ardından Capacitor SDK artık production kullanımına hazır. Capacitor kullanarak iOS ve Android için abonelik uygulamaları oluşturun; tam Adapty entegrasyon desteğinden yararlanın. [Daha fazla bilgi](capacitor-sdk-overview) - **Yeni uygulamalar için Autopilot**: Autopilot analizi, uygulamanızın henüz kapsamlı bir işlem geçmişi olmasa bile artık kullanılabilir. Veriye dayalı fiyat optimizasyonu önerileri alın ve büyüme planınızı ilk günden oluşturun. [Daha fazla bilgi](autopilot) - **Autopilot'ta küresel fiyatlandırma fırsatları**: En iyi performans gösteren pazarlarınızdaki gelir potansiyelini ülkeye özgü fiyatlandırma önerileriyle keşfedin. Autopilot, sonraki en iyi 5 ülkeniz için dönüşüm oranlarını ve satın alma gücünü analiz ederek Adapty Pricing Index'e dayalı olarak fiyatları artırma, düşürme veya koruma konusunda veri odaklı öngörüler sunar. [Daha fazla bilgi](autopilot) - **Faturalama kurtarma dönüşüm metrikleri**: Yeni analitik grafikler, faturalama sorunlarından ve ek sürelerden kurtarılan geliri takip eder. Elde tutma kurtarma çabalarınızı ölçmek için "Billing issue converted", "Billing issue converted revenue", "Grace period converted" ve "Grace period converted revenue" metriklerini izleyin. - **Apple Ads Manager'da doğrudan reklam yönetimi**: Apple Ads kampanyalarınızı platformlar arasında geçiş yapmadan doğrudan Adapty içinde oluşturun ve yönetin. [Daha fazla bilgi](ads-manager-manage-ads) - **Apple Ads Manager analytics**: Adapty içinde detaylı reklam düzeyinde performans metrikleri ve attribution verilerine erişin. Kampanya performansını, reklam grubu analizlerini ve attribution içgörülerini tek bir kontrol panelinde görüntüleyin. [Daha fazla bilgi](adapty-ads-manager-analytics) - **Apple Ads attribution grafikleri**: Birden fazla attribution metriğini özelleştirilebilir grafiklerde birleştirerek Apple Ads performansınızı abonelik verileriyle birlikte analiz edin. [Daha fazla bilgi](adapty-ads-manager-analytics#charts) - **Apple Ads attribution segmentleri**: Apple Ads attribution verileriyle, iki tıkla segment oluşturun. Kampanya, reklam grubu veya anahtar kelimeye göre kullanıcıları hedefleyerek daha hassas analizler ve deneyler yapın. [Daha fazla bilgi](ads-manager-create-segments) - **Yeni dokümantasyon platformu**: Dokümantasyon sitesi yeni bir platforma taşındı. Bu sayede daha hızlı özellik güncellemeleri sunuluyor; geliştirilmiş arama, gezinme ve içerik düzeniyle kullanıcı deneyimi de iyileştirildi. ## Aralık 2025 \{#december-2025\} - **Apple Ads Manager dokümantasyonu**: Apple Search Ads kampanya verilerinizi gelir metrikleriyle tek bir analitik kontrol panelinde birleştirin. Yeni dokümantasyon; kampanya oluşturma, reklam grubu yönetimi ve reklam harcaması ROI'nizi abonelik performansıyla birlikte takip etmenin yollarını ele alıyor. [Daha fazla bilgi edinin](ads-manager) - **Uygulama içi web paywallları**: Web tabanlı paywallları, harici yönlendirme olmadan sorunsuz bir deneyim sunmak amacıyla uygulama içi tarayıcı üzerinden görüntüleyin. [iOS](ios-web-paywall#open-web-paywalls-in-an-in-app-browser) | [Android](android-web-paywall#open-web-paywalls-in-an-in-app-browser) | [React Native](react-native-web-paywall#open-web-paywalls-in-an-in-app-browser) | [Flutter](flutter-web-paywall#open-web-paywalls-in-an-in-app-browser) - **Rolling segmentler**: Hareketli zaman pencerelerine göre otomatik güncellenen dinamik kitle segmentleri oluşturun. Örneğin, "son 7 günde uygulamayı yükleyen kullanıcılar" için sürekli yenilenen ve en yeni müşterilerinizi her zaman gösteren bir segment oluşturabilirsiniz. [Daha fazla bilgi](segments#available-attributes) - **Meta ve TikTok kampanya kurulum kılavuzları**: Meta (Facebook & Instagram) ve TikTok'ta kampanya oluşturmak ve takip etmek için dönüşüm takibi ve analitik entegrasyonuyla birlikte adım adım dokümantasyon. [Meta](meta-create-campaign) | [TikTok](tiktok-create-campaign) - **Manuel paywall uygulama hızlı başlangıç kılavuzları**: Adapty SDK'yı özel paywall arayüzünüze nasıl entegre edeceğinizi adım adım anlatan hızlı başlangıç kılavuzlarıyla uygulama içi satın almaları daha hızlı hayata geçirin. [iOS](ios-implement-paywalls-manually) | [Android](android-implement-paywalls-manually) | [React Native](react-native-implement-paywalls-manually) | [Flutter](flutter-implement-paywalls-manually) | [Unity](unity-implement-paywalls-manually) | [Kotlin Multiplatform](kmp-quickstart-manual) | [Capacitor](capacitor-quickstart-manual) - **Onboarding linkleri için uygulama içi tarayıcı**: Onboarding'lerdeki harici linkler artık varsayılan olarak uygulama içi tarayıcıda açılıyor; böylece kullanıcılar uygulamanızdan çıkmıyor. İsterseniz bu davranışı harici tarayıcı kullanacak şekilde özelleştirebilirsiniz. [iOS](ios-present-onboardings#customize-how-links-open-in-onboardings) | [Android](android-present-onboardings#customize-how-links-open-in-onboardings) | [React Native](react-native-present-onboardings#customize-how-links-open-in-onboardings) - **Geliştirilmiş Autopilot önerileri**: Autopilot artık abonelik verilerinizin daha kapsamlı analizine dayalı olarak daha iyi fiyat optimizasyonu önerileri sunuyor. [Autopilot'u deneyin](autopilot) - **Dokümantasyon karanlık modu**: Dokümanlar artık sistem tercihinizi otomatik algılayan veya sağ üstteki düğmeyle manuel olarak geçiş yapabileceğiniz karanlık modu destekliyor. --- # File: adapty-ecosystem --- --- title: "Adapty ekosistemi" description: "Adapty, mobil uygulamalar için bir uygulama içi satın alma platformudur. Her ürünün ne yaptığını ve nasıl birbirine bağlandığını öğrenin." --- Adapty, mobil uygulamalar için bir uygulama içi satın alma platformudur ve tek bir misyon etrafında inşa edilmiştir: uygulamaları kârlı hale getirmek. Gelir büyütmek için ihtiyacınız olan her şeyi sunar: kullanıcı kazanın, onları dönüştürün, aboneliklerini sürdürün ve ayrılanları geri kazanın. Tek bir kayıt, ilk günden itibaren tüm Adapty ekosistemine erişim sağlar. Ürünler arasında geçiş yapmak için Adapty logosuna tıklamanız yeterli: - **Core** — StoreKit veya Google Play Billing'e dokunmadan satın almaları işleyin, kodsuz paywall'lar tasarlayın ve geliri gerçek zamanlı takip edin. Diğer ürünler bu temelin üzerine inşa edilmiştir. - **Adapty Ads Manager** — gerçek abonelik gelirine göre ölçümlenerek Apple Ads kampanyalarını yönetin ve optimize edin. - **Adapty Attribution** — herhangi bir MMP gerektirmeden hangi reklam kanallarının gerçekten gelir getirdiğini görün. - **Adapty Mail** — otomatik e-postalarla deneme süresi kullananları dönüştürün ve kaybettiğiniz kullanıcıları geri kazanın. **FunnelFox** (web'den uygulamaya funneller ve hosted checkout) ve **Adapty Finance** (gelecekteki abonelik gelirlerine karşı avans) olmak üzere iki ürün daha temel dördünün yanında yer alıyor. ## Ürünler birbirine nasıl bağlanır? \{#how-the-products-fit-together\} Her ürün, müşteriyle yaşam döngüsünün farklı bir noktasında temas kurar. Bağlantılı herhangi bir özelliğin üzerine gelerek hızlı bir tanım görebilir ya da tıklayarak belgelerine ulaşabilirsiniz.
3. Açılan **Generate In-App Purchase Key** penceresinde, ileride başvurmak üzere anahtara bir ad girin. Bu ad Adapty'de kullanılmayacaktır.
4. **Generate** düğmesine tıklayın. **Generate in-App Purchase Key** penceresi kapandıktan sonra oluşturulan anahtarı **Active** listesinde göreceksiniz.
5. API anahtarınızı oluşturduktan sonra, anahtarı dosya olarak indirmek için **Download In-App Purchase Key** düğmesine tıklayın.
6. **Download in-App Purchase Key** penceresinde **Download** düğmesine tıklayın. Dosya bilgisayarınıza kaydedilir.
Bu dosyayı güvende tutmak ve ileride Adapty Kontrol Paneli'ne yüklemek için saklamak çok önemlidir. Oluşturulan dosya yalnızca bir kez indirilebileceğinden, yükleyene kadar güvenli bir yerde sakladığınızdan emin olun. **In-App Purchase** bölümünden oluşturulan .p8 anahtarı, [Adapty'nin App Store ile ilk entegrasyonu yapılandırılırken](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file) kullanılacaktır.
**Sırada ne var:**
- [App Store entegrasyonunu yapılandırın](app-store-connection-configuration)
---
# File: app-store-connection-configuration
---
---
title: "App Store entegrasyonunu yapılandırma"
description: "Sorunsuz abonelik takibi için App Store bağlantınızı yapılandırın."
---
3. **Issuer ID**'yi kopyalayıp Adapty Kontrol Paneli'ndeki **In-app purchase Issuer ID** alanına yapıştırın.
4. **Key ID**'yi kopyalayıp Adapty Kontrol Paneli'ndeki **In-app purchase Key ID** alanına yapıştırın.
## Adım 3. In-App Purchase Key dosyasını yükleyin \{#step-3-upload-in-app-purchase-key-file\}
[App Store Connect'te In-App Purchase Key Oluşturma](generate-in-app-purchase-key) bölümünde indirdiğiniz **In-App Purchase Key** dosyasını
Adapty Kontrol Paneli'ndeki **Private key (.p8 file)** alanına yükleyin.
## Adım 4. Deneme süreleri ve özel teklifler için – promosyon tekliflerini ayarlayın \{#step-4-for-trials-and-special-offers--set-up-promotional-offers\}
:::important
Bu adım, uygulamanızda [deneme süresi veya başka promosyon teklifleri](offers) varsa zorunludur.
:::
1. [Adım 2](#step-2-provide-issuer-id-and-key-id)'de kullandığınız Key ID'yi **App Store promotional offers** bölümündeki **Subscription key ID** alanına kopyalayın.
2. [Adım 3](#step-3-upload-in-app-purchase-key-file)'te kullandığınız **In-App Purchase Key** dosyasını **App Store promotional offers** bölümündeki **Subscription key (.p8 file)** alanına yükleyin.
## Adım 5. App Store paylaşılan sırrını girin \{#step-5-enter-app-store-shared-secret\}
**App Store shared secret**, aynı zamanda App Store Connect Shared Secret olarak da bilinir; uygulama içi satın almalar ve abonelik makbuzu doğrulaması için kullanılan 32 karakterlik onaltılık bir dizedir.
1. [App Store Connect](https://appstoreconnect.apple.com/apps)'i açın. Uygulamanızı seçip **General** → **App Information** bölümüne gidin.
2. **App-Specific Shared Secret** alt bölümüne kadar aşağı kaydırın.
:::info
**App-Specific Shared Secret** alt bölümü görünmüyorsa Account Holder veya Admin rolüne sahip olduğunuzdan emin olun. Admin rolünüz olmasına rağmen bu alt bölümü göremiyorsanız, uygulamanın Account Holder'ından (App Store Connect'te uygulamayı oluşturan kişiden) uygulama için App Store paylaşılan sırrını oluşturmasını isteyin. Bundan sonra alt bölüm Admin'lere de gösterilecektir.
:::
3. **Manage** düğmesine tıklayın.
4. Açılan **App-Specific Shared Secret** penceresinde **Shared Secret**'i kopyalayın. Paylaşılan sır görünmüyorsa önce mevcut olan **Manage** veya **Generate** düğmesine tıklayın, ardından **Shared Secret**'i kopyalayın.
5. Kopyaladığınız **Shared Secret**'i Adapty Kontrol Paneli'ndeki **App Store shared secret** alanına yapıştırın.
6. Değişiklikleri kaydetmek için Adapty Kontrol Paneli'nde **Save** düğmesine tıklayın.
## Adım 6. App Store Connect API anahtarı ekleyin \{#step-6-add-app-store-connect-api-key\}
[Adapty kontrol panelinden App Store'daki ürünlerinizi yönetebilmek](create-product#create-product-and-push-to-store) için bir App Store Connect API anahtarı oluşturun ve Adapty'ye ekleyin:
1. App Store Connect'te [**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api) bölümüne gidin ve **+** düğmesine tıklayın.
2. **Generate API key** penceresinde anahtar için bir ad girin ve **Admin** erişimi verin.
3. Anahtarınızın yanındaki **Download** düğmesine tıklayın. Anahtarı yalnızca bir kez indirebileceğinizi unutmayın.
4. Adapty kontrol panelinde [**App settings > iOS SDK**](https://app.adapty.io/settings/ios-sdk) bölümüne gidin ve **Connect API key** düğmesine tıklayın.
5. Açılan penceredeki alanları doldurun:
- **Issuer ID**: [**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api) bölümünden kopyalayın. **API keys** tablosunun üzerinde yer alır.
- **Key ID**: [**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api) bölümünden kopyalayın. Anahtarınızın yanında **API keys** tablosunda yer alır.
- **API key**: App Store Connect'ten indirdiğiniz API anahtar dosyasını yükleyin.
6. **Connect** düğmesine tıklayın.
**Sıradaki adım**
- [App Store sunucu bildirimlerini etkinleştirme](enable-app-store-server-notifications)
---
# File: enable-app-store-server-notifications
---
---
title: "App Store sunucu bildirimlerini etkinleştirin"
description: "Abonelik etkinliklerini gerçek zamanlı olarak takip etmek için App Store sunucu bildirimlerini etkinleştirin."
---
App Store sunucu bildirimlerini ayarlamak, veri doğruluğunu sağlamak açısından kritik öneme sahiptir; bu sayede iade işlemleri ve diğer etkinlikler dahil olmak üzere App Store'dan anlık güncellemeler alabilirsiniz.
:::important
App Store Server Notifications V2 desteği için Adapty iOS SDK 2.10.0 veya üzeri gereklidir.
:::
1. Adapty Kontrol Paneli'nde **URL for App Store server notification** bağlantısını kopyalayın.
2. [App Store Connect](https://appstoreconnect.apple.com/apps) sayfasını açın. Uygulamanızı seçin ve **General** → **App Information** bölümüne, ardından **App Store Server Notifications** alt bölümüne gidin.
3. Kopyaladığınız **URL for App Store server notification** değerini **Production Server URL** ve **Sandbox Server URL** alanlarına yapıştırın.
## Ham etkinlikleri iletme \{#raw-events-forwarding\}
Zaman zaman Apple'dan gelen ham S2S etkinliklerini doğrudan almak isteyebilirsiniz. Adapty kullanırken bunları almaya devam etmek için endpoint'inizi **URL for forwarding raw Apple events** alanına ekleyin; Apple'dan gelen ham etkinlikleri olduğu gibi size ileteceğiz.
**Sıradaki adım**
Adapty SDK'yı şu platformlar için kurun:
- [iOS](sdk-installation-ios)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: troubleshoot-app-store-integration
---
---
title: "App Store entegrasyonuyla ilgili sorunları giderme"
description: "Apple App Store kurulum sorunlarını çözün — bekleyen sözleşmeler, sunucu bildirimi gecikmeleri ve fiyat uyuşmazlıkları."
---
Bu makale, App Store entegrasyonuyla ilgili sık karşılaşılan sorunları ele almaktadır. Aşağıdaki her bölümde belirtiler, temel neden ve çözüm yolu açıklanmaktadır.
## Ürünler görünmüyor \{#products-dont-appear\}
İki farklı belirti aynı temel nedene işaret eder:
- App Store Connect API anahtarı doğru yapılandırılmış, ancak Adapty ürünleri hiç çekemiyor.
- Ürünler App Store Connect'te mevcut ama Adapty'de görünmüyor ya da beklenenden az ürün çıkıyor. SDK, satın alma denemelerinde "Product Id not found" hatası veriyor.
En yaygın temel neden **imzalanmamış Apple sözleşmeleri** — ücretli sözleşme, vergi formları veya bankacılık formları beklemede ya da imzalanmamış durumda. Sözleşmeler beklemedeyken App Store Connect API, ürünle ilgili endpoint'lerde sessizce 403 döndürür. Adapty'ye herhangi bir hata iletilmez; ürünler sessizce filtrelenir.
**App Store Connect → Agreements, Tax, and Banking** bölümüne gidin ve beklemedeki tüm sözleşmeleri imzalayın. Ardından Adapty'nin **App settings → iOS SDK** bölümünde yeniden senkronize edin.
## App Store Sunucu Bildirimleri "Delayed" Olarak Görünüyor \{#app-store-server-notifications-show-delayed\}
App Store Connect'te App Store Sunucu Bildirimleri durumu **Delayed** olarak görünebilir. Bu, Apple'ın abonelik olayı bildirimlerini — yenilemeler, iptaller ve ödeme sorunları — gecikmeli gönderdiği anlamına gelir; bu bildirimler kuyruğa alınır ve geç ulaşır.
Kurulum istatistikleri bundan etkilenmez. Adapty, kurulumları sunucu tarafı bildirimlerinden değil, uygulamanın ilk açılışından itibaren sayar.
Yenileme veya iptal verileri gecikmeli geliyorsa, bunun en olası nedeni Delayed durumudur. Bu durum genellikle Apple birikmiş bildirimleri işledikçe otomatik olarak düzelir.
## Adapty'deki fiyatlar App Store ile eşleşmiyor \{#prices-in-adapty-dont-match-app-store\}
Adapty'nin ürün düzenleme sayfasındaki **price** alanı, ürünün nasıl eklendiğine bağlı olarak farklı davranır.
Adapty'de bir ürün oluşturup kontrol panelinden mağazaya gönderirseniz, bu fiyat başlangıç mağaza fiyatı olarak kullanılır.
Mağazada zaten mevcut olan bir ürün eklerseniz, bu fiyat yalnızca bir yer tutucudur. Adapty'nin analizleri, entegrasyonları ve SDK, gerçek fiyatları App Store'dan çekerek kullanır. App Store'daki fiyat değişiklikleri yer tutucuyu güncellemek için geri senkronize edilmez ve şu an için yer tutucuyu kontrol panelinden düzenleyemezsiniz.
## CSV fiyat dışa aktarımı boş \{#csv-price-export-is-empty\}
CSV fiyat dışa aktarımınız yalnızca sütun başlıklarını döndürdüyse, App Store Connect API anahtarınız tam olarak yapılandırılmamış demektir. Bkz. [6. Adım — App Store Connect API anahtarı ekleme](app-store-connection-configuration#step-6-add-app-store-connect-api-key).
## App Store'a yeni ürün gönderilemiyor \{#cant-push-new-products-to-app-store\}
Adapty, kontrol panelinde oluşturduğunuz yeni ürünleri App Store Connect'e gönderebilir. App Store entegrasyonunuz tam olarak yapılandırılmamışsa bu seçenek engellenir. İki ayar gereklidir:
- **Apple app ID**: [1. Adım — Bundle ID ve Apple app ID'yi girin](app-store-connection-configuration#step-1-provide-bundle-id-and-apple-app-id) bölümünde yapılandırın.
- **App Store Connect API anahtarı**: [6. Adım — App Store Connect API anahtarı ekleyin](app-store-connection-configuration#step-6-add-app-store-connect-api-key) bölümünde yapılandırın.
---
# File: enabling-of-devepoler-api
---
---
title: "Google Play Console'da Geliştirici API'larını Etkinleştirme"
description: "Uygulamanızdaki abonelik yönetimini otomatikleştirmek ve kolaylaştırmak için Adapty'nin Geliştirici API'sini etkinleştirin."
---
3. [**Google Play Android Developer API**](https://console.cloud.google.com/apis/library/androidpublisher.googleapis.com) sayfasını açın.
4. **Enable** düğmesine tıklayın ve **Enabled** durumunun görünmesini bekleyin. Bu, Google Android Developer API'sinin etkinleştirildiği anlamına gelir.
5. [**Google Play Developer Reporting API**](https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com) sayfasını açın.
6. **Enable** düğmesine tıklayın ve **Enabled** durumunun görünmesini bekleyin.
7. [**Cloud Pub/Sub API**](https://console.cloud.google.com/marketplace/product/google/pubsub.googleapis.com) sayfasını açın.
8. **Enable** düğmesine tıklayın ve **Enabled** durumunun görünmesini bekleyin.
Geliştirici API'ları etkinleştirildi.
Bunu Google Cloud Console'un [**APIs & Services**](https://console.cloud.google.com/apis/dashboard) sayfasından doğrulayabilirsiniz. Sayfayı aşağı kaydırın ve sayfanın altındaki tablonun 3 API'ın tamamını içerdiğini kontrol edin:
- Google Play Android Developer API
- Google Play Developer Reporting API
- Cloud Pub/Sub API
**Sıradaki adım**
- [Google Cloud Console'da servis hesabı oluşturma](create-service-account)
---
# File: create-service-account
---
---
title: "Google Cloud Console'da servis hesabı oluşturma"
description: "Adapty'de güvenli API erişimi için servis hesabı oluşturmayı öğrenin."
---
Adapty'nin veri erişimini otomatikleştirebilmesi için Google Play Console'da bir servis hesabı gereklidir.
1. Google Cloud Console'un [**IAM & Admin** -> **Service accounts**](https://console.cloud.google.com/iam-admin/serviceaccounts) bölümünü açın. Doğru projeyi kullandığınızdan emin olun.
2. **Service accounts** penceresinde **Create service account** düğmesine tıklayın.
3. **Create service account** penceresinin **Service account details** alt bölümünde istediğiniz **Service Account Name**'i girin. Bu hesabın amacını belirtmek için adın içine "Adapty" eklemenizi öneririz. **Service account ID** otomatik olarak oluşturulacaktır.
4. Servis hesabı e-posta adresini kopyalayın ve ileride kullanmak üzere kaydedin.
5. **Create and continue** düğmesine tıklayın.
6. **Grant this service account access to project** alt bölümündeki **Select a role** açılır listesinden **Pub/Sub -> Pub/Sub Admin** seçeneğini seçin. Bu rol, gerçek zamanlı geliştirici bildirimlerini etkinleştirmek için gereklidir.
7. **Add another role** düğmesine tıklayın.
8. Yeni açılan **Role** açılır listesinden **Monitoring -> Monitoring Viewer** seçeneğini seçin. Bu rol, bildirim kuyruğunun izlenmesine olanak tanımak için gereklidir.
9. **Continue** düğmesine tıklayın.
10. Herhangi bir değişiklik yapmadan **Done** düğmesine tıklayın. **Service accounts** penceresi açılacaktır.
**Sırada ne var**
- [Google Play Console'da servis hesabına izin verme](grant-permissions-to-service-account)
---
# File: grant-permissions-to-service-account
---
---
title: "Google Play Console'da hizmet hesabına izin ver"
description: "Güvenli ve verimli API erişimi için hizmet hesaplarına izin verin."
---
Adapty'nin abonelikleri yönetmek ve satın almaları doğrulamak için kullanacağı hizmet hesabına gerekli izinleri verin.
1. Google Play Console'da [**Users and permissions**](https://play.google.com/console/u/0/developers/8970033217728091060/users-and-permissions) sayfasını açın ve **Invite new users** düğmesine tıklayın.
2. **Invite user** sayfasında, oluşturduğunuz hizmet kullanıcısının e-posta adresini girin.
3. **Account permissions** sekmesine geçin.
4. Aşağıdaki izinleri seçin:
- View app information and download bulk reports (read-only)
- View financial data, orders, and cancellation survey responses
- Manage orders and subscriptions
- Manage store presence
5. **Invite user** düğmesine tıklayın.
6. **Send invite?** penceresinde **Send invite** düğmesine tıklayın. Hizmet hesabı kullanıcı listesinde görünecektir.
**Sırada ne var**
- [Google Play Console'da hizmet hesabı anahtar dosyasını oluşturun](create-service-account-key-file)
---
# File: create-service-account-key-file
---
---
title: "Google Play Console'da servis hesabı anahtar dosyası oluşturma"
description: "Adapty ile sorunsuz entegrasyon için servis hesabı anahtar dosyası nasıl oluşturulur öğrenin."
---
Play Store'daki mobil uygulamanızı Adapty ile bağlamak için Google Play Console'da özel servis hesabı anahtar dosyaları oluşturmanız ve bunları Adapty'ye yüklemeniz gerekir. Bu dosyalar uygulamanızın güvenliğini sağlar ve yetkisiz erişimi engeller.
:::warning
Yeni servis hesabınızın aktif hale gelmesi genellikle en az 24 saat sürer. Ancak bir [püf nokta](https://stackoverflow.com/a/60691844) var. [Google Play Console](https://play.google.com/apps/publish/)'da servis hesabını oluşturduktan sonra herhangi bir uygulamayı açın ve **Monetize** -> **Products** -> **Subscriptions/In-app products** bölümüne gidin. Herhangi bir ürünün açıklamasını düzenleyip kaydedin. Bu işlem servis hesabını hemen etkinleştirmeli; değişiklikleri daha sonra geri alabilirsiniz.
:::
1. Google Play Console'da [**Service accounts**](https://console.cloud.google.com/iam-admin/serviceaccounts) bölümünü açın. Doğru projeyi seçtiğinizden emin olun.
2. Açılan pencerede **Add key** seçeneğine tıklayın ve açılır menüden **Create new key** öğesini seçin.
3. **Create private key for [Your_project_name]** penceresinde **Create** düğmesine tıklayın. Özel anahtarınız bilgisayarınıza JSON dosyası olarak kaydedilir. Dosyayı, **Private key saved to your computer** penceresinde gösterilen dosya adını kullanarak bulabilirsiniz.
4. **Create private key for Your_project_name** penceresinde **Create** düğmesine tıklayın. Bu işlem özel anahtarınızı bilgisayarınıza JSON dosyası olarak kaydeder. Gerekirse açılan **Private key saved to your computer** penceresindeki dosya adını kullanarak dosyayı bulabilirsiniz.
Bu dosyaya [Google Play Store entegrasyonunu yapılandırırken](google-play-store-connection-configuration) ihtiyacınız olacak.
:::warning
Yeni servis hesabınızın aktif hale gelmesi genellikle en az 24 saat sürer. Ancak bir [püf nokta](https://stackoverflow.com/a/60691844) var. [Google Play Console](https://play.google.com/apps/publish/)'da servis hesabını oluşturduktan sonra herhangi bir uygulamayı açın ve **Monetize** -> **Products** -> **Subscriptions/In-app products** bölümüne gidin. Herhangi bir ürünün açıklamasını düzenleyip kaydedin. Bu işlem servis hesabını hemen etkinleştirmeli; değişiklikleri daha sonra geri alabilirsiniz.
:::
**Sıradaki adım**
- [Google Play Store entegrasyonunu yapılandırın](google-play-store-connection-configuration)
---
# File: google-play-store-connection-configuration
---
---
title: "Google Play Store entegrasyonunu yapılandırma"
description: "Sorunsuz uygulama içi satın alma işlemleri için Adapty'de Google Play Store bağlantısını yapılandırın."
---
Bu bölüm, Google Play üzerinden satılan mobil uygulamanızı Adapty ile entegre etme sürecini açıklamaktadır. Play Store'daki uygulama yapılandırma verilerinizi Adapty Kontrol Paneli'ne girmeniz gerekecek. Bu adım, satın almaları doğrulamak ve Adapty içinde Play Store'dan abonelik güncellemeleri almak için kritik öneme sahiptir.
Bu işlemi ilk onboarding sırasında tamamlayabilir ya da daha sonra Adapty Kontrol Paneli'nin **App Settings** bölümünden değişiklik yapabilirsiniz.
:::danger
Yapılandırma değişikliği, yalnızca Adapty paywall'larını entegre ettiğiniz mobil uygulamanızı yayınlamadan önce kabul edilebilir. Yayın sonrasında yapılan değişiklik entegrasyonu bozar ve paywall'lar mobil uygulamanızda gösterilmeyi durdurur.
:::
## Adım 1. Paket adını girin \{#step-1-provide-package-name\}
Paket adı, uygulamanızın Google Play Store'daki benzersiz tanımlayıcısıdır. Bu, abonelik işleme gibi Adapty'nin temel işlevleri için gereklidir.
1. [Google Play Developer Console](https://play.google.com/console/u/0/developers)'u açın.
2. ID'sine ihtiyaç duyduğunuz uygulamayı seçin. **Dashboard** penceresi açılır.
3. Uygulama adının altındaki ürün ID'sini bulun ve kopyalayın.
4. Adapty üst menüsünden [**App settings**](https://app.adapty.io/settings/android-sdk)'i açın.
5. **App settings** penceresinin **Android SDK** sekmesine, kopyaladığınız **Package name** değerini yapıştırın.
## Adım 2. Hesap anahtarı dosyasını yükleyin \{#step-2-upload-the-account-key-file\}
1. [Servis hesabı anahtar dosyası oluşturma](create-service-account) adımında oluşturduğunuz JSON formatındaki servis hesabı özel anahtar dosyasını **Service account key file** alanına yükleyin.
Değişiklikleri onaylamak için **Save** düğmesine tıklamayı unutmayın.
**Sıradaki adım**
- [Google Play Console'da Gerçek zamanlı geliştirici bildirimlerini (RTDN) etkinleştirme](enable-real-time-developer-notifications-rtdn)
---
# File: enable-real-time-developer-notifications-rtdn
---
---
title: "Google Play Console'da Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN) Etkinleştirme"
description: "Adapty için Google Play Console'da Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN) etkinleştirerek kritik olaylar hakkında bilgi sahibi olun ve veri doğruluğunu koruyun. İade ve diğer önemli olaylar için Play Store'dan anında güncelleme almak üzere RTDN'yi nasıl kuracağınızı öğrenin"
---
Gerçek zamanlı geliştirici bildirimlerini (RTDN) kurmak, veri doğruluğu açısından kritik öneme sahiptir; bu sayede Play Store'dan iade bilgileri ve diğer olaylar dahil güncellemeleri anında alabilirsiniz.
## Bildirimleri Etkinleştirme \{#enable-notifications\}
1. **Google Cloud Pub/Sub**'ın etkin olduğundan emin olun. [Bu bağlantıyı](https://console.cloud.google.com/flows/enableapi?apiid=pubsub) açın ve uygulama projenizi seçin. **Google Cloud Pub/Sub**'ı henüz etkinleştirmediyseniz burada etkinleştirmeniz gerekir.
2. Adapty üst menüsünden [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) sayfasına gidin ve **Google Play RTDN topic name** başlığının yanındaki **Enable Pub/Sub API** alanının içeriğini kopyalayın.
:::note **Enable Pub/Sub API** alanının içeriği yanlış bir formattaysa (doğru format `projects/...` ile başlar), yardım için [Enable Pub/Sub API alanındaki yanlış formatı düzeltme](enable-real-time-developer-notifications-rtdn#fixing-incorrect-format-in-enable-pubsub-api-field) bölümüne bakın. ::: 3. [Google Play Console](https://play.google.com/console/)'u açın, uygulamanızı seçin ve **Monetize with Play** -> **Monetization setup** bölümüne gidin. **Google Play Billing** bölümünde **Enable real-time notifications** onay kutusunu işaretleyin. 4. Adapty **App Settings**'de kopyaladığınız **Enable Pub/Sub API** alanının içeriğini **Topic name** alanına yapıştırın. 5. Google Play Console'da **Save changes**'e tıklayın.
## Bildirimleri Test Etme \{#test-notifications\}
Gerçek zamanlı geliştirici bildirimlerine başarıyla abone olup olmadığınızı kontrol etmek için:
1. Google Play Console ayarlarındaki değişiklikleri kaydedin.
2. Google Play Console'daki **Topic name** alanının altında **Send test notification**'a tıklayın.
3. Adapty'de [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) sayfasına gidin. Test bildirimi gönderildiyse, konu adının üzerinde durumunu göreceksiniz.
## Enable Pub/Sub API Alanındaki Yanlış Formatı Düzeltme \{#fixing-incorrect-format-in-enable-pubsub-api-field\}
**Enable Pub/Sub API** alanının içeriği yanlış bir formattaysa (doğru format `projects/...` ile başlar), sorunu gidermek için şu adımları izleyin:
### 1. API Etkinleştirme ve İzinleri Doğrulama \{#1-verify-api-enablement-and-permissions\}
Gerekli tüm API'lerin etkinleştirildiğinden ve izinlerin servis hesabına doğru şekilde verildiğinden emin olun. Bu adımları daha önce tamamlamış olsanız bile, hiçbir alt adımın atlanmadığından emin olmak için tekrar gözden geçirmeniz önemlidir. Aşağıdaki bölümlerdeki adımları tekrarlayın:
1. [Google Play Console'da Geliştirici API'lerini Etkinleştirme](enabling-of-devepoler-api)
2. [Google Cloud Console'da Servis Hesabı Oluşturma](create-service-account)
3. [Google Play Console'da Servis Hesabına İzin Verme](grant-permissions-to-service-account)
4. [Google Play Console'da Servis Hesabı Anahtar Dosyası Oluşturma](create-service-account-key-file)
5. [Google Play Store Entegrasyonunu Yapılandırma](google-play-store-connection-configuration)
### 2. Alan Politikalarını Düzenleme \{#2-adjust-domain-policies\}
**Domain restricted contacts** ve **Domain restricted sharing** politikalarını değiştirin:
1. [Google Cloud Console](https://console.cloud.google.com/)'u açın ve uygulamanızı yönetmek için servis hesabını oluşturduğunuz projeyi seçin.
2. **Quick Access** bölümünde **IAM & Admin**'i seçin.
3. Sol panelde **Organization Policies**'i seçin.
4. **Domain restricted contacts** politikasını bulun.
5. **Actions** sütunundaki üç nokta düğmesine tıklayın ve **Edit policy**'yi seçin.
6. Politika düzenleme penceresinde:
1. **Policy source** altında **Override parent's policy** radyo düğmesini seçin.
2. **Policy enforcement** altında **Replace** radyo düğmesini seçin.
3. **Rules** altında **ADD A RULE** düğmesine tıklayın.
4. **New rule** -> **Policy values** altında **Allow All**'u seçin.
5. **SET POLICY**'ye tıklayın.
7. **Domain restricted sharing** politikası için 4-6. adımları tekrarlayın.
Son olarak, **Google Play RTDN topic name** başlığının yanındaki **Enable Pub/Sub API** alanının içeriğini yeniden oluşturun. Alan artık doğru formatta olacaktır.
Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN) başarıyla etkinleştirdikten sonra güncellenen politikalar için **Policy source**'u **Inherit parent's policy** olarak geri aldığınızdan emin olun.
## Ham Olay Yönlendirme \{#raw-events-forwarding\}
Bazen Google'dan ham S2S olaylarını almaya devam etmek isteyebilirsiniz. Adapty kullanırken bunları almaya devam etmek için endpoint'inizi **URL for forwarding raw Google events** alanına eklemeniz yeterlidir; ham olayları Google'dan geldiği gibi ileteceğiz.
---
**Sırada ne var**
Adapty SDK'yı şu platformlar için kurun:
- [Android](sdk-installation-android)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: stripe
---
---
title: "Stripe ile ilk entegrasyon"
description: "Sorunsuz abonelik ödeme işlemleri için Stripe'ı Adapty ile entegre edin."
---
Adapty, [Stripe](https://stripe.com/) üzerinden yapılan web ödemelerini ve abonelikleri takip ederek web2app abonelik akışlarını destekler.
Bu entegrasyon, web üzerinden başlatılan satın almaları (Stripe Checkout, barındırılan ödeme sayfaları veya özel web akışları) kapsar ve bunları mobil uygulama erişimiyle ve analitiğiyle senkronize eder.
Aşağıdaki senaryolarda işe yarar:
- Web'den satın alma yapan ancak daha sonra uygulamayı yükleyip hesabına giriş yapan kullanıcılara ücretli özelliklere otomatik olarak erişim sağlamak
- Tüm abonelik analitiğini tek bir Adapty Kontrol Paneli'nde toplamak (kohortlar, tahminler ve diğer analitik araçlarımız dahil)
Web üzerinden satın almalar uygulamalar için giderek daha popüler hale gelse de Apple App Store, yalnızca ABD'de dijital ürünler için uygulama içi satın alımlardan farklı bir sisteme izin vermektedir. Diğer ülkelerde web aboneliklerinizi uygulamanız içinde tanıtmadığınızdan emin olun; aksi takdirde uygulamanız reddedilebilir veya yasaklanabilir.
Aşağıdaki adımlar, Stripe entegrasyonunun nasıl yapılandırılacağını açıklar.
:::important
Bu entegrasyon, Stripe web satın almalarının takibine ve senkronizasyonuna odaklanır. Kullanıcıları uygulamadan web ödeme sayfasına yönlendirmeniz gerekiyorsa [Web paywalls](web-paywall) bölümüne bakın.
:::
## 1\. Stripe'ı Adapty'ye bağlama \{#1-connect-stripe-to-adapty\}
Bu entegrasyon, esas itibarıyla Adapty'nin webhook aracılığıyla Stripe'tan abonelik verilerini çekmesine dayanır. Bu nedenle, API Anahtarlarını sağlayarak ve Stripe'ta Adapty'nin webhook URL'sini kullanarak Adapty hesabınızı Stripe hesabınıza bağlamanız gerekir. Webhook yapılandırmanızı otomatikleştirmek için Stripe'a Adapty uygulamasını yükleyin:
:::note
Aşağıdaki adımlar hem Stripe'ın Production hem de Test modları için aynıdır; ancak her biri için farklı API anahtarları kullanmanız gerekecektir.
:::
0. Stripe'ı test modunda mı yoksa canlı modda mı bağlayacağınızı belirleyin. Başlangıçta bunu test modunda yapıyorsanız, aşağıdaki adımları canlı mod için de tekrarlamanız gerekecektir.
1. [Stripe App Marketplace](https://marketplace.stripe.com/apps/adapty)'e gidin ve Adapty uygulamasını yükleyin. Sandbox modunun uygulama yüklemeyi desteklemediğini unutmayın. Bunu yalnızca production veya test modunda yapabilirsiniz.
2. Uygulamaya gerekli izinleri verin. Bu, Adapty'nin abonelik verilerine ve geçmişine erişmesini sağlayacaktır. Ardından devam etmek için **Continue to app settings** düğmesine tıklayın.
İzin açılır penceresinin alt kısmında, uygulamayı canlı modda mı yoksa test modunda mı yükleyeceğinizi seçebilirsiniz.
3. Açılır pencerede yeni bir kısıtlı anahtar oluşturun. E-postanız, Touch ID veya güvenlik anahtarınızı kullanarak kimliğinizi doğrulamanız gerekecektir. Anahtarı oluşturduktan sonra tekrar göremezsiniz; bu nedenle bir parola yöneticisinde veya güvenli bir depoda saklayın.
4. Oluşturulan anahtarı açılır pencereden kopyalayın ve Adapty'nin [App Settings → Stripe](https://app.adapty.io/settings/stripe) sayfasına gidin. Anahtarı, modunuza göre **Stripe App Restricted API Key** bölümüne yapıştırın. Test ve canlı modlar için farklı anahtarlar oluşturmanız gerektiğini unutmayın.
Hepsi bu kadar! Şimdi Stripe'ta ürünlerinizi oluşturun ve bunları Adapty'ye ekleyin.
2. **Secret key** başlığının yanındaki **Reveal live (test) key button** düğmesine tıklayın, ardından kopyalayın ve Adapty'nin [App Settings → Stripe](https://app.adapty.io/settings/stripe) sayfasına gidin. Anahtarı buraya yapıştırın:
3. Ardından Adapty'deki aynı sayfanın alt kısmından Webhook URL'sini kopyalayın. Stripe'ta [**Developers** → **Webhooks**](https://dashboard.stripe.com/webhooks) bölümüne gidin ve **Add endpoint** düğmesine tıklayın:
4. Adapty'den kopyaladığınız webhook URL'sini **Endpoint URL** alanına yapıştırın. Ardından webhook **Version** alanında **Latest API version** seçeneğini seçin. Sonra aşağıdaki olayları seçin:
- charge.refunded
- customer.subscription.created
- customer.subscription.deleted
- customer.subscription.paused
- customer.subscription.resumed
- customer.subscription.updated
- invoice.created
- invoice.updated
- payment_intent.succeeded
5. "Add endpoint" düğmesine basın, ardından "Signing secret" altındaki "Reveal" düğmesine basın. Bu, webhook verilerinin Adapty tarafında çözümlenmesinde kullanılan anahtardır; açıkladıktan sonra kopyalayın:
6. Son olarak, bu anahtarı Adapty'nin App Settings → Stripe sayfasındaki "Stripe Webhook Secret" alanına yapıştırın:
:::warning
Şu anda Adapty yalnızca **Flat rate** (9,99 $/ay) veya **Package pricing** (9,99 $/10 birim) seçeneklerini desteklemektedir; bunlar uygulama mağazalarına benzer şekilde çalışır. **Tiered pricing**, **Usage-based fee** ve **Customer chooses price** seçenekleri desteklenmemektedir.
:::
## 3\. Stripe ürünlerini Adapty'ye ekleme \{#3-add-stripe-products-to-adapty\}
:::warning
Ürünler zorunludur! Stripe ürünlerinizi Adapty Kontrol Paneli'nde oluşturduğunuzdan emin olun. Adapty yalnızca bu ürünlere bağlı işlemler için olayları takip eder; bu adımı atlamamanız gerekir, aksi takdirde işlem olayları oluşturulmaz.
:::
Stripe'a App Store ve Google Play ile aynı şekilde davranıyoruz: dijital ürünlerinizi sattığınız başka bir mağazadır. Yapılandırması da benzer şekildedir: Stripe ürünlerini (`product_id` ve `price_id` değerleriyle birlikte) Adapty'nin Ürünler bölümüne ekleyin:
Stripe'taki ürün kimlikleri `prod_...`, fiyat kimlikleri ise `price_...` şeklinde görünür. Bunları Stripe'ın [Product Catalog](https://dashboard.stripe.com/products?active=true) bölümünde herhangi bir ürünü açtığınızda kolayca bulabilirsiniz:
Gerekli tüm ürünleri ekledikten sonra, bir sonraki adım Stripe'a satın almayı kimin yaptığını bildirmektir; böylece Adapty tarafından işlenebilir.
## 4\. Web'den yapılan satın almalara kullanıcı kimliğinizi ekleme \{#4-enrich-purchases-made-on-the-web-with-your-user-id\}
Adapty, kullanıcıların access level'larını sağlamak ve güncellemek için tek bilgi kaynağı olarak Stripe'tan gelen webhook'lara dayanır. Ancak bu entegrasyonun düzgün çalışması için kendi tarafınızdan Stripe ile çalışırken ek bilgi sağlamanız gerekir.
Access level'ların platformlar arası (web veya mobil) tutarlı olması için Adapty'nin webhook'lardan tanıyabileceği tek bir kullanıcı kimliğine güvenmeniz gerekir. Bu, kullandığınız yetkilendirme sisteminden kullanıcının e-postası, telefon numarası veya herhangi bir başka kimlik olabilir.
Kullanıcılarınızı tanımlamak için hangi kimliği kullanmak istediğinize karar verin. Ardından, Stripe üzerinden ödemeyi başlatan kod bölümüne erişin ve bu kullanıcı kimliğini [Stripe Subscription](https://docs.stripe.com/api/subscriptions/object#subscription_object-metadata) (`sub_...`) veya [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-metadata) nesnesinin (`ses_...`) `metadata` nesnesine `customer_user_id` olarak şu şekilde ekleyin:
```json showLineNumbers title="Stripe Metadata contents"
{'customer_user_id': "YOUR_USER_ID"}
```
Bu basit ekleme, kodunuzda yapmanız gereken tek şeydir. Bundan sonra Adapty, Stripe'tan aldığı tüm webhook'ları ayrıştıracak, bu `metadata`'yı çıkaracak ve abonelikleri müşterilerinizle doğru şekilde ilişkilendirecektir.
:::warning
Kullanıcı kimliği zorunludur
Aksi takdirde bu kullanıcıyı eşleştirip mobilden access level sağlamamızın hiçbir yolu yoktur.
`metadata`'ya `customer_user_id` sağlamazsanız, Adapty'nin `customer_user_id`'yi başka yerlerde aramasını sağlayabilirsiniz: Stripe'ın Customer nesnesindeki `email` veya Stripe'ın Session nesnesindeki `client_reference_id`.
Profil oluşturma davranışını yapılandırma hakkında daha fazla bilgi için [aşağıya bakın](stripe#profile-creation-behavior)
:::
:::note
Stripe'ta Customer da zorunludur
Checkout Sessions kullanıyorsanız, `customer_creation` değerini `always` olarak ayarlayarak [bir Stripe Customer oluşturduğunuzdan emin olun](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-customer_creation).
:::
## 5\. Mobil kullanıcılara erişim sağlama \{#5-provide-access-to-users-on-the-mobile\}
Web'den gelen mobil kullanıcıların ücretli özelliklere erişebilmesini sağlamak için, bir önceki adımda sağladığınız `customer_user_id` ile `Adapty.activate()` veya `Adapty.identify()` fonksiyonunu çağırmanız yeterlidir (daha fazlası için
2. Anahtara bir ad verin ve son kullanma tarihini belirleyin. API anahtarının Adapty ile çalışabilmesi için tüm varlıklara **Read** izni vermeniz gerekir. **Save** düğmesine tıklayın.
3. **Copy key** düğmesine tıklayın.
4. Adapty'de [App Settings → Paddle](https://app.adapty.io/settings/paddle) sayfasına gidin ve anahtarı **Paddle API key** bölümüne yapıştırın.
:::warning
Paddle API anahtarınız için bir son kullanma tarihi belirlediyseniz, süresi dolmadan önce yeni bir anahtar oluşturup Adapty'de güncellemeniz gerekir. Anahtar süresi dolduğunda entegrasyon herhangi bir uyarı vermeden çalışmayı durduracak ve kullanıcılar satın alma yapamayacaktır.
:::
### 1.2. Adapty'ye Gönderilecek Etkinlikleri Ekleme \{#12-add-events-that-will-be-sent-to-adapty\}
1. Adapty'deki **Paddle** sayfasından **Webhook URL**'yi kopyalayın.
2. Paddle'da [**Developer Tools → Notifications**](https://vendors.paddle.com/notifications-v2) sayfasına gidin ve bir webhook eklemek için **New destination** düğmesine tıklayın.
3. Webhook için açıklayıcı bir ad girin. Gerektiğinde kolayca bulabilmek için "Adapty" ifadesini eklemenizi öneririz.
4. Adapty'deki **Webhook URL**'yi **URL** alanına yapıştırın. Doğru ortam için webhook kullandığınızdan emin olun.
5. **Notification type** olarak **Webhook** seçeneğini belirleyin.
6. Aşağıdaki etkinlikleri seçin:
- `subscription.created`
- `subscription.updated`
- `transaction.created`
- `transaction.updated`
- `adjustment.created`
- `adjustment.updated`
7. Webhook kurulumunu tamamlamak için **Save destination** düğmesine tıklayın.
### 1.3. Webhook Gizli Anahtarını Alma ve Ekleme \{#13-retrieve-and-add-the-webhook-secret-key\}
1. **Notifications** penceresinde, az önce oluşturduğunuz webhook'un yanındaki üç noktaya tıklayın ve **Edit destination** seçeneğini seçin.
2. **Edit destination** panelinde **Secret key** adında yeni bir alan görünecektir. Kopyalayın.
3. Adapty'de [App Settings → Paddle](https://app.adapty.io/settings/paddle) sayfasına gidin ve anahtarı **Notification secret key** alanına yapıştırın. Bu anahtar, Adapty'deki webhook verilerini doğrulamak için kullanılır.
### 1.4. Paddle Müşterilerini Adapty Profilleriyle Eşleştirme \{#14-match-paddle-customers-with-adapty-profiles\}
Adapty'nin her satın almayı uygulamanızda kullanılabilmesi için bir [müşteri profiliyle](profiles-crm) ilişkilendirmesi gerekir. Varsayılan olarak, Adapty Paddle'dan webhook aldığında profiller otomatik olarak oluşturulur. Adapty'de `customer_user_id` olarak hangi değerin kullanılacağını seçebilirsiniz:
1. **Varsayılan ve önerilen:** `custom_data` alanında ilettiğiniz `customer_user_id` (bkz. [Paddle belgeleri](https://developer.paddle.com/build/transactions/custom-data))
2. Paddle Müşteri nesnesindeki `email` (bkz. [Paddle belgeleri](https://developer.paddle.com/paddle-js/methods/paddle-checkout-open/#parameters))
3. `ctm-...` formatındaki Paddle Müşteri Kimliği (bkz. [Paddle belgeleri](https://developer.paddle.com/paddle-js/methods/paddle-checkout-open/#parameters))
4. Profil oluşturma. Müşteri profilleriniz üzerinde daha fazla kontrol sahibi olmak ve bunu kendiniz yönetmek istiyorsanız bu seçeneği tercih edin.
Hangi değerin kullanılacağını [App Settings → Paddle](https://app.adapty.io/settings/paddle) sayfasındaki **Profile creation behavior** alanından yapılandırabilirsiniz.
## 2. Paddle Ürünlerini Adapty'ye Ekleme \{#2-add-paddle-products-to-adapty\}
:::warning
Paddle ürünlerinizi Adapty Kontrol Paneli'ne eklediğinizden ya da mevcut ürünlerinize bir Paddle ürün kimliği eklediğinizden emin olun. Adapty yalnızca bu ürünlere bağlı işlemlere ait etkinlikleri takip eder. Bu adımı atlarsanız işlem etkinlikleri oluşturulmaz.
:::
Paddle, Adapty'de App Store ve Google Play gibi çalışır; dijital ürünlerinizi sattığınız başka bir platformdur. Yapılandırmak için Adapty'deki [Products](https://app.adapty.io/products) bölümüne Paddle'dan ilgili `product_id` ve `price_id` değerlerini ekleyin.
Paddle'da ürün kimlikleri `pro_...`, fiyat kimlikleri ise `pri_...` şeklinde görünür. Bunları [Paddle ürün kataloğunuzda](https://vendors.paddle.com/products-v2) ilgili ürünü açtığınızda bulabilirsiniz:
Ürünlerinizi ekledikten sonra bir sonraki adım, Adapty'nin satın almayı doğru kullanıcıyla ilişkilendirebilmesini sağlamaktır.
## 3\. Mobil Uygulamada Kullanıcılara Erişim Sağlama \{#3-provide-access-to-users-on-the-mobile\}
Web üzerinden satın alan kullanıcıların mobil uygulamada da erişim kazanmasını sağlamak için `Adapty.activate()` veya `Adapty.identify()` çağrısını, satın alma sırasında ilettiğiniz `customer_user_id` ile yapın. Ayrıntılar için [Kullanıcıları Tanımlama](identifying-users) bölümüne bakın.
## 4\. Entegrasyonu Test Etme \{#4-test-your-integration\}
Her şeyi ayarladıktan sonra entegrasyonunuzu test edebilirsiniz. Paddle'ın Test ortamında yapılan işlemler Adapty'de **Test** olarak görünür. Production ortamındaki işlemler ise **Production** olarak görünür.
Entegrasyonunuz artık tamamdır. Kullanıcılar web sitenizden abonelik satın alabilir ve mobil uygulamanızda premium özelliklere otomatik olarak erişebilir; siz de tüm abonelik analitiğini tek bir Adapty Kontrol Paneli'nden takip edebilirsiniz.
## Önemli Noktalar \{#important-considerations\}
- Adapty'nin analitiğinde işlem tutarlarına vergiler ve Paddle ücretleri dahildir; bu durum, tutarların vergiler ve ücretler sonrası gösterildiği Paddle'ın kontrol panelinden farklıdır. Yani Adapty'de gördüğünüz rakamlar Paddle'dakinden daha yüksek olacaktır.
- Diğer mağazalardan farklı olarak, Paddle'daki iade işlemleri yalnızca iade edilen ilgili işlemi etkiler ve aboneliği otomatik olarak iptal etmez. Abonelik, açıkça iptal edilmediği sürece aktif kalmaya devam eder.
- Satın almaları belirli paywall örneklerine atfetmek için `custom_data` alanına `variation_id` de ekleyebilirsiniz. Adapty bu veriyi webhook'lardan işleyerek analitiğe dahil eder.
### Ücretli Denemeler \{#paid-trials\}
Paddle'da ücretli denemelerle çalışırken Adapty'de iki ürün oluşturmanız gerekir:
1. Bir consumable ürün oluşturun ve bunu deneme süresini ücretlendiren Paddle fiyatıyla ilişkilendirin.
2. Ardından bir abonelik ürünü (Aylık/Haftalık/vb.) oluşturun ve bunu ücretsiz deneme bileşeni içeren Paddle fiyatıyla ilişkilendirin.
Paddle'ın bakış açısından bu, tek bir işlemde iki fiyatı olan bir üründür: biri deneme ücreti için (ör. $0,99), diğeri ücretsiz deneme için ($0,00).
Adapty açısından ise bu iki ayrı etkinlik oluşturur: deneme ödemesi için abonelik dışı bir satın alma ve abonelik ürünü için bir deneme başlangıcı etkinliği.
Örneğin, bir kullanıcı aylık 9,99 $ değerinde bir abonelik için 0,99 $'lık ücretli deneme başlattığında, Paddle her iki fiyatı da içeren tek bir işlem oluşturur. Adapty ise bunu 0,99 $'lık abonelik dışı satın alma (anlık ödeme) ve 0,00 $'lık deneme başlangıcı etkinliği (gelecekte aylık 9,99 $) olarak işler.
:::note
Kullanıcılar ücretli bir denemeyi iptal ettiğinde **Trial expired** ve **Trial renewal canceled** etkinliklerini alırsınız.
:::
## Paddle verilerinizden daha fazla yararlanın \{#get-more-from-your-paddle-data\}
:::important
Paddle etkinliklerinizin entegrasyonlarla çalışabilmesi için kullanıcılarınızın uygulamaya en az bir kez App Store/Google Play hesaplarıyla giriş yapmış olması gerekir.
:::
Paddle entegrasyonunu tamamladıktan sonra Adapty, hemen içgörüler sunmaya hazır hale gelir. Paddle verilerinizden en iyi şekilde yararlanmak için ek Adapty entegrasyonları kurarak Paddle etkinliklerini iletebilir; böylece tüm abonelik analizlerinizi tek bir Adapty Kontrol Paneli'nde toplayabilirsiniz.
Paddle etkinliklerinizi iletmek ve analiz etmek için kullanabileceğiniz entegrasyonlar:
- [AppsFlyer](appsflyer)
- [Webhook](webhook)
- [Posthog](posthog)
## Mevcut sınırlamalar \{#current-limitations\}
- **İptal işlemleri**: Paddle'ın iki abonelik iptal seçeneği vardır:
1. Anında iptal: Abonelik hemen iptal edilir.
2. Dönem sonunda iptal: Abonelik, mevcut fatura döneminin sonunda iptal edilir (uygulama mağazalarındaki uygulama içi aboneliklerine benzer şekilde).
- **İadeler**: Adapty, tam ve kısmi iadeleri takip eder.
- **Ek süre**: Paddle, varsayılan olarak ödeme sorunları için sabit 30 günlük bir ek süre uygular; bu süre boyunca abonelik aktif kalır. [Ek sürenin uzunluğunu ve süre sonundaki eylemi (aboneliği duraklatma veya iptal etme) özelleştirebilirsiniz](https://developer.paddle.com/build/retain/configure-payment-recovery-dunning#prerequisites).
**Denemeler**: Deneme süresi sona erdikten sonra ödeme tahsilinde başarısızlık olursa abonelik durumu `past_due` olarak değişir. Production ortamında Paddle'ın Retain özelliği, abonelik iptal edilmeden veya duraklatılmadan önce ödemeyi kurtarmaya çalışmak için bir dunning penceresi uygular. Sandbox ortamında ise Retain kullanılamaz, bu nedenle ödeme yeniden denemesi yapılmaz ve abonelik süresiz olarak `past_due` durumunda kalır.
---
**Ayrıca bakın:**
- [Paddle'da satın almayı doğrulama, access level edinme ve sunucu taraflı API ile Paddle'dan işlem geçmişini içe aktarma](api-adapty/operations/validatePaddlePurchase)
---
# File: custom-store
---
---
title: "Diğer mağazalarla ilk entegrasyon"
description: "App Store ile Adapty İlk Entegrasyonu: Hızlı Bir Kılavuz"
---
Adapty'e hoş geldiniz! Önceliğimiz, uygulamanız için mümkün olan en iyi sonuçları elde etmenize yardımcı olmak.
İlk entegrasyon yalnızca [App Store](initial_ios), [Google Play](initial-android), [Stripe](stripe) ve [Paddle](paddle) için gereklidir; çünkü Adapty uygulama, ürün ve tekliflerinizi bu mağazalarla doğrular.
Adapty, diğer uygulama mağazalarıyla veri doğrulaması yapmaz ve bu mağazalar üzerinden gerçekleştirilen satın almaları işlemez. Bununla birlikte, diğer mağazalar üzerinden satılan ürünleri Adapty'de işaretleyerek başarılı bir satın almanın ardından ücretli içeriğe erişim sağlayabilir, işlemleri analizlerinize yansıtabilir ve entegrasyonlar aracılığıyla paylaşabilirsiniz.
:::important Backend'inizin satın almayı işlediğinden ve işlemi [Adapty sunucu taraflı API](getting-started-with-server-side-api) aracılığıyla Adapty'e gönderdiğinden emin olun. Adapty, işlem alındıktan sonra erişim sağlar, işlem olayı tetikler, entegrasyonlara gönderir ve analizlere yansıtır. ::: Bir ürünü özel bir uygulama mağazası üzerinden satılıyor olarak işaretlemek için ürün oluştururken ilgili uygulama mağazasını seçin. İhtiyacınız olan mağaza listede yoksa, nasıl oluşturulacağı aşağıda açıklanmıştır: 1. **Products** sayfasında, özel bir uygulama mağazası üzerinden satmak istediğiniz ürünü açın. 2. Satış yapmak istediğiniz uygulama mağazasını seçin. Listede yoksa **Create Custom Store** düğmesine tıklayın.
3. Mağazanın **Title** ve **Store ID** bilgilerini girin.
4. **Create store** düğmesine tıklayın.
Backend'iniz doğru şekilde yapılandırılmışsa Adapty, bu özel mağazadan gelen ürün işlemlerini alır, analizlere, [**Event Feed**](event-feed) sayfasına ve [entegrasyonlara](https://app.adapty.io/integrations) yansıtır ve erişimi buna göre sağlar.
## Özel mağaza verilerinizden daha fazlasını elde edin \{#get-more-from-your-custom-store-data\}
:::important
Özel mağaza olaylarınızın entegrasyonlarla çalışabilmesi için kullanıcılarınızın uygulamada en az bir kez App Store/Google Play hesaplarıyla oturum açmış olması gerekir.
:::
Özel mağaza entegrasyonunuzu kurduktan sonra Adapty hemen içgörüler sunmaya hazırdır. Verilerinizden en iyi şekilde yararlanmak için ek Adapty entegrasyonları kurarak özel mağaza olaylarını iletebilir ve tüm abonelik analizlerinizi tek bir Adapty Kontrol Paneli'nde toplayabilirsiniz.
Özel mağaza olaylarınızı iletmek ve analiz etmek için kullanabileceğiniz entegrasyonlar:
- [AppsFlyer](appsflyer)
- [Webhook](webhook)
- [Posthog](posthog)
---
# File: transfer-apps
---
---
title: "Uygulamanı farklı bir hesaba aktar"
description: "Adapty'de uygulama sahibini değiştir"
---
Şirketiniz satın alındığında, uygulamanızı satarken veya iş yapılanmanızı yeniden düzenlerken uygulamanızı farklı bir sahibine aktarabilirsiniz. Aktarım süreci; kesintisiz hizmet sağlamak için Adapty, App Store Connect ve Google Play Console'da yapılacak değişikliklerin koordineli şekilde yürütülmesini gerektirir.
## Uygulama sahipliğini aktar \{#transfer-app-ownership\}
Önce mağaza transferini tamamlayın, ardından Adapty'de uygulamayı aktarın. Bu sıralama, geçiş sürecinde satın alımların kesintisiz çalışmasını sağlar.
:::note
Aktarım süreci boyunca ürünleri silmeyin veya yeniden oluşturmayın. Transfer başarıyla tamamlandığını doğrulayana kadar ürün ID'lerini değiştirmeyin.
:::
### App Store (iOS) transferi \{#app-store-ios-transfer\}
:::important
App Store Connect API anahtarları (Issuer ID, Key ID, .p8 dosyası) uygulama kapsamlı değil, hesap kapsamlıdır. Transfer sonrasında yeni sahibin hesabından yeni API anahtarları oluşturmanız ve bunları Adapty'de güncellemeniz gerekir.
Uygulamaya özel paylaşılan gizli anahtar, transfer süreci boyunca makbuzları doğrulamaya devam eder; ancak yeni sahip, transfer tamamlandıktan sonra bunu yeniden oluşturmalı ve Adapty'de güncellemelidir.
:::
1. **Yeni sahip:** Hesabınız yoksa [app.adapty.io](https://app.adapty.io) adresinden bir Adapty hesabı oluşturun.
2. **Eski sahip:** Apple'ın [transfer kılavuzunu](https://developer.apple.com/help/app-store-connect/transfer-an-app/overview-of-app-transfer) takip ederek App Store Connect'te uygulama transferini başlatın.
3. **Yeni sahip:** App Store Connect'teki transferi kabul edin.
4. **Eski sahip:** Adapty'de uygulamayı aktarmak için [support@adapty.io](mailto:support@adapty.io) adresine e-posta gönderin. Uygulama adını ve yeni sahibin e-posta adresini belirtin.
5. **Yeni sahip:** Uygulamayı Adapty'de aldıktan sonra, tüm kimlik bilgilerini kendi hesabınız altında oluşturup yapılandırmak için [App Store entegrasyon kılavuzunu](initial_ios) tamamlayın.
### Google Play (Android) transferi \{#google-play-android-transfer\}
1. **Yeni sahip:** Hesabınız yoksa [app.adapty.io](https://app.adapty.io) adresinden bir Adapty hesabı oluşturun.
2. **Her iki sahip:** Her iki Google Play Developer hesabının da tam olarak kayıtlı olduğundan emin olun.
3. **Eski sahip:** Google Play Console veya Google Play Developer Support üzerinden transfer talebi gönderin. Google; DUNS numaraları, sözleşmeler veya satış kanıtı gibi ek belgeler isteyebilir.
4. **Yeni sahip:** Transfer talebini inceleyin ve onaylayın.
5. **Google:** Google destek ekibi transferi işleme alır; bu süreç genellikle birkaç iş günü sürer, ancak hesap doğrulama, abonelik karmaşıklığı ve ödeme kurulumuna bağlı olarak daha uzun sürebilir.
6. **Eski sahip:** Google transferi tamamladıktan sonra, Adapty'de uygulamayı aktarmak için [support@adapty.io](mailto:support@adapty.io) adresine e-posta gönderin. Uygulama adını ve yeni sahibin e-posta adresini belirtin.
7. **Yeni sahip:** Uygulamayı Adapty'de aldıktan sonra, tüm kimlik bilgilerini kendi hesabınız altında oluşturup yapılandırmak için [Google Play entegrasyon kılavuzunu](initial-android) tamamlayın.
Transfer; kullanıcıları, abonelikleri, istatistikleri, derecelendirmeleri ve mağaza listesini kapsar. Mevcut aboneler için faturalandırma sürekliliği korunur; ancak ödemeler, transfer tamamlandıktan sonra yalnızca yeni sahibin satıcı hesabına geçer. Transferden önceki ödeme raporları ve siparişler orijinal hesapta kalır. Ayrıntılı gereksinimler için Google'ın [transfer kılavuzunu](https://support.google.com/googleplay/android-developer/answer/6230247) inceleyin.
## Risk azaltma ve zamanlama \{#risk-mitigation-and-timing\}
**Transfer süresince çalışmaya devam edenler:**
- Satın almalar ve yenilemeler (uygulamaya özel paylaşılan gizli anahtar, transfer penceresi boyunca makbuzları doğrulamaya devam eder)
- Mevcut abonelerin erişimi
- SDK çalışmaya devam eder
**Geçici olarak duranlar:**
- App Store Connect API çağrıları (yeni anahtarlar yapılandırılana kadar)
- Sunucu bildirimleri (uç nokta yeniden yapılandırılana kadar)
- Kimlik bilgisi geçişi sırasında analizlerde boşluklar oluşabilir
**Önerilen zamanlama:**
- Transferleri düşük trafikli dönemlerde tamamlayın (birincil kullanıcı saat diliminizde sabah 03:00–06:00 arası)
- Yeni sahibin, mağaza transferini kabul ettikten hemen sonra kimlik bilgilerini yapılandırmaya hazır olmasını sağlayın
- Transferi kabul etmekle Adapty entegrasyonunu tamamlamak arasında 15-30 dakika süre ayırın
**Transfer tamamlandıktan sonra:**
- Makbuz doğrulamasını hemen test edin
- 48 saat boyunca otomatik yenileme başarı oranlarını izleyin
- Sunucu bildirimlerinin sistemlerinize ulaştığını doğrulayın
- Yeni satın alımların doğru şekilde takip edildiğini kontrol edin
## Transferin başarıyla tamamlandığını doğrula \{#verify-transfer-completed-successfully\}
Hem Adapty hem de mağaza transferlerini tamamladıktan sonra:
1. **Kontrol paneli erişimini kontrol edin**: Yeni sahip, uygulamayı Adapty Kontrol Paneli'nde görebilmelidir.
2. **API anahtarı bağlantısını doğrulayın**: Yeni App Store Connect API Anahtarı veya Google Play hizmet hesabının Adapty'de başarıyla bağlandığını kontrol edin.
3. **SDK bağlantısını test edin**: Uygulamanızı çalıştırın ve Adapty SDK'nın hatasız başlatıldığını doğrulayın.
---
# File: installation-of-adapty-sdks
---
---
title: "Adapty SDK Kurulumu"
description: "iOS, Android ve cross-platform uygulamalar için Adapty SDK'larını kurun."
---
Tercihlerinize göre başlamak için üç yol var:
- **Platforma özel hızlı başlangıç kılavuzlarını takip edin**: Kılavuzlar üretime hazır kod parçacıkları içerdiğinden uygulama fazla zaman almaz.
- [iOS](ios-sdk-overview)
- [Android](android-sdk-overview)
- [React Native](react-native-sdk-overview)
- [Flutter](flutter-sdk-overview)
- [Unity](unity-sdk-overview)
- [Kotlin Multiplatform](kmp-sdk-overview)
- [Capacitor](capacitor-sdk-overview)
- **LLM kullanın**: Dokümanlarımız LLM dostu. Adapty dokümantasyonuyla LLM'lerden en iyi şekilde yararlanmak için [kılavuzumuzu](adapty-cursor) okuyun.
- **Örnek uygulamaları inceleyin**:
- [iOS (Swift)](https://github.com/adaptyteam/AdaptySDK-iOS/tree/master/Examples)
- [Android (Kotlin)](https://github.com/adaptyteam/AdaptySDK-Android/tree/master/app)
- [React Native (Saf RN üzerinde temel örnek)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/BasicExample)
- [React Native (Gelişmiş örnek – daha karmaşık durumlarla çalışmanıza olanak tanıdığı için geliştirme sürecinde kullanışlıdır)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/AdaptyDevtools)
- [React Native (Expo dev build)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/FocusJournalExpo)
- [React Native (Expo Go & Web)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock)
- [Flutter (Dart)](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example)
- [Unity (C#)](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Assets)
- [Kotlin Multiplatform](https://github.com/adaptyteam/AdaptySDK-KMP/tree/main/example)
- [Capacitor](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples)
---
# File: sample-apps
---
---
title: "Örnek uygulamalar"
description: ""
---
Adapty SDK ile hızlıca başlamanıza yardımcı olmak için, temel özelliklerin nasıl entegre edileceğini ve kullanılacağını gösteren örnek uygulamalar hazırladık. Bu uygulamalar; paywall'lar, satın almalar ve analitik takibi için kullanıma hazır implementasyonlar sunuyor.
## Örnek uygulamaları neden kullanmalısınız? \{#why-use-sample-apps\}
- **Hızlı Entegrasyon:** Adapty SDK'nın gerçek bir uygulamada nasıl çalıştığını görün.
- **En İyi Pratikler:** Önerilen implementasyon kalıplarını takip edin.
- **Hata Ayıklama ve Test:** Adapty'yi kendi projenize entegre etmeden önce sorunları gidermek ve denemeler yapmak için örnek uygulamaları kullanın.
## Mevcut örnek uygulamalar \{#available-sample-apps\}
- [iOS (Swift)](https://github.com/adaptyteam/AdaptySDK-iOS/tree/master/Examples)
- [Android (Kotlin)](https://github.com/adaptyteam/AdaptySDK-Android/tree/master/app)
- [React Native (Saf RN ile temel örnek)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/BasicExample)
- [React Native (Gelişmiş örnek – daha karmaşık senaryolarla çalışmanıza olanak tanıdığı için geliştirme sürecinde kullanışlıdır)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/AdaptyDevtools)
- [React Native (Expo dev build)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/FocusJournalExpo)
- [React Native (Expo Go ve Web)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock)
- [Flutter (Dart)](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example)
- [Unity (C#)](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Assets)
- [Kotlin Multiplatform](https://github.com/adaptyteam/AdaptySDK-KMP/tree/main/example)
- [Capacitor (React)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-react-example)
- [Capacitor (Vue.js)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-vue-example)
- [Capacitor (Angular)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-angular-example)
- [Capacitor (Gelişmiş geliştirme araçları)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/adapty-devtools)
---
# File: paywall-builder-templates
---
---
title: "Flow oluşturma"
description: "Özel tasarlanmış bir galeri şablonundan veya minimal bir başlangıç noktasından yeni bir flow oluşturun."
---
Bir flow'u şablondan veya sıfırdan oluşturabilirsiniz.
:::link
Flow oluşturma hakkında daha fazla bilgi edinmek ister misiniz? [YouTube oynatma listemizde](https://www.youtube.com/playlist?list=PLMksWqaZiWtM) adım adım video eğitimlerini izleyin.
:::
## Flow oluşturma \{#create-flow\}
1. **Flows** sayfasını açın.
2. **Create flow** düğmesine tıklayın.
3. Bir seçenek belirleyin:
- **Browse templates** (Şablon kütüphanesini açar)
- **Start from scratch** (Boş bir flow oluşturur)
4. Flow adını düzenleyicide yeniden adlandırın. Başlık çubuğundaki flow adına tıklayın ve yeni bir isim girin.
:::warning
Adapty, aynı isimde birden fazla flow oluşturmanıza izin verir. Her yeni flow'a farklı bir isim verin, aksi hâlde birbirinden ayırt etmesi zor olan çok sayıda **Untitled** flow oluşturursunuz.
:::
### Şablon kullanma \{#use-a-template\}
Şablon kütüphanesi, flow'unuz için başlangıç noktası görevi gören birkaç şablon içerir. Her biri, birden fazla ekran, etkileşimli öğe ve çalışan navigasyona sahip eksiksiz bir flow'dur. Özelleştirmek için herhangi bir öğeyi düzenleyebilirsiniz.
Şablon uygulamak için:
1. Şablon kütüphanesinde şablon kartlarına göz atın. Her kartta bir flow'dan önizleme ekran görüntüleri gösterilir.
2. İstediğiniz kartın üzerindeki **Use as template** seçeneğine tıklayın.
Şablon, builder'da yüklenir. Buradan herhangi bir öğeyi, ekranı veya özelliği değiştirebilirsiniz.
### Sıfırdan başla \{#start-from-scratch\}
Sıfırdan başla seçeneği, tek bir boş ekranla bir flow oluşturur. Ekranı [öğe kütüphanesindeki](builder-elements) öğelerle tasarlayabilirsiniz.
## Şablonu değiştirin \{#change-the-template\}
Şablonu builder içinden değiştirebilirsiniz. Screens panelini açın ve Şablon kitaplığını yeniden açmak için **Templates** Templates düğmesine tıklayın, ardından yeni bir şablon seçin.
:::warning
Yeni bir şablon uygulamak mevcut flow taslağınızın üzerine yazar. Adapty onay ister — devam etmek için **Use template**'e, taslağınızı korumak için **Cancel**'a tıklayın. Onaylandıktan sonra önceki taslak geri yüklenemez. Yayınlanmış flow yayında kalmaya devam eder ve etkilenmez.
:::
## Şablonlarda özel fontlar \{#custom-fonts-in-templates\}
:::link
Ana makale: [Flow Builder'da özel fontlar](using-custom-fonts-in-flow-builder)
:::
**Custom font** etiketiyle işaretlenmiş şablonlar özel fontlar kullanır. Bu fontlar mobil SDK ile birlikte gelmez. Şablonun hangi fontları kullandığını görmek için etiketin üzerine gelin.
Cihazda istenen tipografiyi görmek için font dosyalarını uygulama paketinize ekleyin. Fontu içermeyen eski uygulama sürümleri sistem fontuna geri döner.
Daha eski sürümleri etkilemeden bir yazı tipini değiştirmek için flow'u kopyalayın, kopyada yazı tipini değiştirin ve kopyayı [yazı tipini içeren uygulama sürümlerindeki kullanıcılarla](segments) sınırlandırın.
---
# File: builder-ui
---
---
title: "Flow Builder Arayüzü"
description: "Flow Builder arayüzüne ve çalışma alanına genel bakış."
---
Ana Flow Builder arayüzü; görsel öğeler eklemek, özelliklerini düzenlemek ve kullanıcı flow'unun mantığını değiştirmek için gereken tüm araçları içerir. Bu makale, arayüzün her alanını kapsar: ne işe yaradığı ve nerede bulunduğu.
:::link
Flow oluşturma hakkında daha fazla bilgi edinmek ister misiniz? [YouTube oynatma listemizde](https://www.youtube.com/playlist?list=PLMksWqaZiWtM) adım adım video eğitimlerini izleyin.
:::
## Proje kontrolleri ve faydalı kısayollar (üst araç çubuğu) \{#project-controls-and-useful-shortcuts-top-toolbar\}
* **Kapat** Close: Flow düzenleyicisinden çıkıp flows sayfasına dönün.
* **Uygulama adı** App: Flow'un hangi uygulamaya ait olduğunu gösterir.
* **Tüm flow'lar** Flows: Bu uygulamaya ait tüm flow'ların listesini açın.
* **Flow durumu**: Flow adının solundaki simge, mevcut [flow durumunu](builder-save-publish#flow-status) gösterir:
- **Taslak** Draft
- **Yayımlanıyor** (dönen yükleyici)
- **Başarısız** Failed
- ya da **Canlı** Live.
* **Flow'u yeniden adlandırma**: Yeniden adlandırmak için flow adına tıklayın. Birden fazla flow aynı ada sahip olabilir; bu nedenle [her yeni flow'a benzersiz bir ad verin](paywall-builder-templates#create-flow).
* **Görünüm modu geçişi**: Tasarım görünümü Cursor ile [remote config görünümü](customize-flow-with-remote-config) Remote Config arasında geçiş yapın.
* **Geri Al/Yeniden Yap**: Flow değişikliklerini geri almak Undo veya yeniden yapmak Redo için ok simgelerine tıklayın. Geri almak için ⌘Z / Ctrl+Z kısayolunu da kullanabilirsiniz.
* **Taslağı kaydet / Yayımla**: İlerlemenizi canlıya almadan kaydetmek için **Save draft** düğmesine tıklayın (⌘ / Ctrl+S). [**Publish**](builder-save-publish) düğmesine erişmek için açılır menüyü Open dropdown açın. Flow'unuzu bir [placement'a](create-placement) yalnızca yayımlandıktan sonra ekleyebilirsiniz.
## Önizleme alanı (merkez) \{#preview-area-center\}
Çalışma alanının merkezi, flow'unuzun mobil cihazda nasıl görüneceğini simüle eder.
* Bir öğeyi seçmek ve özelliklerini düzenlemek için üzerine tıklayın. Bir kapsayıcının içindeki alt öğeyi seçmek için önce kapsayıcıya, ardından alt öğeye tıklayın.
* Ekranın kendine ait özellikleri düzenlemek için herhangi bir öğenin dışına tıklayın ya da Screens and Layers panelinden ekranı seçin.
* Bir öğenin sırasını değiştirmek için Screens and Layers panelinde o öğenin girişini yukarı veya aşağı sürükleyin.
:::warning
Flow editörü, duyarlı düzenler oluşturmak için tasarlanmıştır. Bu nedenle öğelerin konumlarını **manuel olarak değiştiremezsiniz** — yalnızca sıralarını değiştirebilirsiniz. Her container'ın düzen ayarları, içindeki öğelerin nasıl dağıtılacağını belirler.
:::
### Cihaz önizlemesinin üzerindeki aktif ekran çubuğu \{#active-screen-bar-above-the-device-preview\}
- **Screen name** — geçerli ekranın adını gösteren bir etiket.
- **Toggle animations** Toggle animations — element animasyon önizlemelerini açar veya kapatır; kapatılana kadar sürekli oynatılır. Yalnızca aktif ekranda en az bir [animasyon](builder-styling#animation) olduğunda görünür. Canlı cihazdaki animasyonların görünürlüğünü etkilemez.
- **Add element** Plus — geçerli ekranda [element kitaplığını](builder-elements) açar. Ekranlar ve Katmanlar panelinin üstündeki **+** düğmesiyle aynı işlevi görür; panel daraltıldığında kullanışlıdır.
### Görünüm kontrolleri (alt araç çubuğu) \{#view-controls-bottom-toolbar\}
Alt araç çubuğundaki araçlar, önizlemeyi kontrol etmenizi sağlar.
* **Cihaz**: Görüntü alanı boyutlarını ve cihaz çerçevesini değiştirmek için mevcut iPhone ve Android telefon modellerinden birini seçin.
* **Ekran yönü**: Flow'unuzu farklı yönlerde önizlemek için dikey Portrait ve yatay Landscape modlar arasında geçiş yapın.
* **Renk şeması**: Tasarımınızın farklı temalara nasıl uyum sağladığını görmek için açık Light mode ve koyu Dark mode modlar arasında geçiş yapın.
* **Yerel ayar**: Flow'unuzu yerelleştirilmiş içerikle önizlemek için bir yerel ayar seçin.
* **Görünüm seçenekleri**: Cihaz çerçevesini ve güvenli alan kılavuzlarını açın veya kapatın.
## Ekran ve öğe özellikleri (sağ panel) \{#screen-and-element-properties-right-panel\}
### Ekran ayarları ve düzeni \{#screen-settings-and-layout\}
:::link
Ana makale: [Ekranlar ve Katmanlar](paywall-layout-and-products)
:::
Hiçbir öğe seçili değilken, sağ panel aktif [flow ekranının](paywall-layout-and-products) özelliklerini ayarlamanıza olanak tanır. Ayarlayabileceğiniz başlıca özellikler şunlardır:
* Sistem arayüzüyle etkileşimler (ör. durum çubuğunun görünür olup olmadığı)
* Otomatik düzenleme kuralları
* Arka plan (renk, görsel veya video)
* Dolgu boyutu
* Dikey kaydırma davranışı
Ekran, [interaktif quizler](onboarding-quizzes) gibi belirli öğeler içeriyorsa, bu liste ilgili özelliklerle genişler.
### Element özellikleri \{#element-properties\}
Bir element seçtiğinizde, sağ panel onun stil ve etkileşim özelliklerini değiştirmenize olanak tanır.
#### Tasarım özellikleri \{#design-properties\}
:::link
Daha fazla bilgi: [Yerleşim ve konumlandırma](manage-paywall-ui-elements), [Stiller ve görünüm](builder-styling)
:::
**Design** sekmesi, seçili elementin görsel görünümünü ve yerleşimini yapılandırmanıza olanak tanır:
* **Visibility**: Öğeyi göster veya gizle. Öğenin ne zaman görünür olacağını belirleyen kurallar ayarlamak için **Conditional** görünürlüğü etkinleştir.
* **Position**: Relative, Absolute veya Fixed konumlandırma seçeneklerinden birini seç.
* **Content** (yalnızca metin öğeleri): Öğenin metin içeriğini düzenle, [değişken](#variables) ekle ve yerelleştirmeleri yönet.
* **Typography** (yalnızca metin öğeleri): Font, kalınlık, boyut, renk, hizalama, dekorasyon ve kırpma ayarlarını yapılandır.
* **Spacing**: Öğenin margin ve padding değerlerini ayarla.
* **Effects**: Dış gölge, iç gölge, arka plan bulanıklığı veya katman bulanıklığı ekle.
* **Animation**: Animasyonlu efektler ekle (ör. Pulse) ve bunların zamanlamasını ile yoğunluğunu yapılandır.
* **Appearance**: Opaklık ve döndürme ayarlarını düzenle.
* **Layout**: Düzen yönü seç (dikey veya yatay) ve alt öğelerin nasıl dağıtılacağını belirle.
#### Etkileşim özellikleri \{#interactions-properties\}
:::link
Daha fazla bilgi: [Eylemler](onboarding-actions), [Navigasyon ve Etkileşim](onboarding-navigation-branching)
:::
**Interactions** sekmesi, kullanıcı seçili öğeyle etkileşime girdiğinde ne olacağını tanımlamanıza olanak tanır. Her etkileşim bir **tetikleyici** ve bir veya daha fazla **eylemden** oluşur:
* **Tetikleyiciler**, *ne zaman* bir şeyin gerçekleşeceğini belirler — örneğin **On Tap** (kullanıcı elemana dokunur).
* **Eylemler**, *ne olacağını* belirler — örneğin başka bir ekrana geçmek veya bir değişkenin değerini değiştirmek. Birden fazla eylemi tek bir tetikleyiciye ekleyerek sırayla zincirleyebilirsiniz.
Birden fazla eylemi sırayla çalıştırmak için aynı elemana birden fazla tetikleyici ekleyebilirsiniz.
## Sol panel \{#left-panel\}
Sol panel, hangi düğmenin aktif olduğuna bağlı olarak işlevini değiştirir. Şunlar arasında seçim yapabilirsiniz:
* [Ekranlar ve katmanlar](#screens-and-layers)
* [Öğe ekle](#element-selection)
* [Ürünler](#products)
* [Stiller](#saved-styles)
* [Değişkenler](#variables)
* [Yerelleştirme](#localization)
### Ekranlar ve Katmanlar
:::link
Ana makale: [Ekranlar ve Katmanlar](paywall-layout-and-products)
:::
Katmanlar Layers düğmesi, Ekranlar ve Katmanlar panelini açar (flow builder'ı ilk açtığınızda varsayılan olarak gösterilir).
Her ekranı katman ağacı olarak gösterir. Ekrandaki her öğe bir katmandır; container'ların içinde ise alt öğeler iç içe yer alır. Katmanları sürükleyip bırakarak sıralamalarını değiştirebilirsiniz.
### Öğe seçimi \{#element-selection\}
:::link
Ana makale: [Öğeler](builder-elements)
:::
Artı Plus düğmesine tıklarsanız, sol panel mevcut UI öğelerini ve bunların varyasyonlarını listeler. Bir girişe tıklayarak onu mevcut ekrana yeni bir katman olarak ekleyebilirsiniz.
### Ürünler
:::link
Ana makale: [Ürünler](paywall-product-block)
:::
Ürünler Products düğmesi ürün listesini açar. Flow'unuzdaki her ekrana hangi ürünlerin atandığını gösterir.
Bu liste yalnızca okunabilir. Bir ekrana ürün atamak için Ürün öğesi ekleyin ve sağ panelden yapılandırın. Ürün oluşturmak veya düzenlemek için Adapty Kontrol Paneli'ndeki **Products** sayfasını kullanın.
### Kaydedilmiş stiller \{#saved-styles\}
:::info
Daha fazla bilgi:
- [Stiller ve görünüm](builder-styling)
- [Metin içeriği](onboarding-text)
- [Karanlık mod](paywall-dark-mode)
:::
Stiller Styles düğmesi Kaydedilmiş Stilleri açar.
Burada global stilleri düzenleyip yönetebilirsiniz. Flow'unuzdaki birden fazla öğe aynı tipografiyi veya rengi kullanıyorsa bu verileri global stil olarak kaydedebilirsiniz. Ardından tek bir tıklamayla yeniden kullanabilirsiniz.
Şu anda Flow Builder, iki tür global stil desteklemektedir: Yazı tipi stilleri ve Renk stilleri. Her Renk stilinin isteğe bağlı olarak Karanlık mod için ayrı bir değeri olabilir.
### Değişkenler
:::link
Ana makale: [Değişkenler](onboarding-variables)
:::
Köşeli parantez Variables düğmesi Değişkenler panelini açar.
Burada flow'unuz için değişken oluşturabilir ve yönetebilirsiniz. Çalışma zamanında SDK, değişken yer tutucularını gerçek değerlerle değiştirir — kullanıcı özellikleri, ürün fiyatları, yerelleştirilmiş metinler ve daha fazlası.
Değişkenler iki sekme altında gruplandırılmıştır:
* **Özel**: Eylemler aracılığıyla oluşturup yönettiğiniz değişkenler.
* **Elementler**: Kullanıcı etkileşimiyle belirlenen değerler — sınav yanıtları, toggle durumları veya sekme seçimi gibi.
Ürün değişkenleri — fiyat, ad ve diğer ürün verileri — bu panelde listelenmez. Bunlara bir metin elementini düzenlerken doğrudan başvurabilirsiniz.
Değişkenleri şunlar için kullanabilirsiniz:
* **Metin bağlama**: Statik dizeler yerine dinamik içerik gösterin.
* **Görünürlüğü kontrol etme**: Koşullara göre öğeleri gösterin veya gizleyin (örneğin, premium kullanıcılar için yükseltme düğmesini gizleyin).
* **Kullanıcıyla etkileşim**: Form veya sınav gibi kullanıcı giriş alanlarından verilere erişin.
### Yerelleştirme \{#localization\}
:::link
Ana makale: [Yerelleştirme](add-flow-remote-config-locale)
:::
Yerelleştirme görünümü, flow'unuzdaki tüm çevrilebilir içerikleri yönetmenizi sağlar. Her metin dizesini ve görseli ekrana göre düzenlenmiş bir tabloda, her yerel ayar için ayrı sütunlarla gösterir. Bu görünümden şunları yapabilirsiniz:
* Yeni yerel ayarlar ekleyebilir ve yerelleştirilmiş dizeleri satır içinde düzenleyebilirsiniz.
* Çeviri durumunu takip edebilirsiniz — her satır **Done** veya **Missing** olarak işaretlenir.
* Ekrana göre filtreleyebilir ya da yalnızca eksik çevirileri gösterebilirsiniz.
* İçerikleri otomatik çevirmek için **AI Translate**'i, toplu çeviri aktarmak için ise **Import/Export**'u kullanabilirsiniz.
---
# File: flow-builder-recipes
---
---
title: "Yaygın flow tarifleri"
description: "Flow Builder'da yaygın ekran şablonları oluşturmak için adım adım kılavuzlar."
---
Bu bölümde Flow Builder'daki en yaygın ekran şablonlarının nasıl oluşturulacağı anlatılıyor — düzen seçimlerinden etkileşimlere kadar her şey, öğe öğe. Her kılavuz bağımsız olup standart Flow Builder öğelerini kullanır.
3. Satın alma düğmeleri, bağlantılar ve kapatma düğmeleri önceden yapılandırılmış eylemlerle gelir. Bağlantılar için [kullanıcıları yönlendirmek üzere URL'leri yapılandırın](#links). Diğer düğme türleri için **Interactions** paneline gidin. Orada, **Button triggers** bölümünde, düğmenin gerçekleştirmesi gereken [eylemleri](onboarding-actions) ayarlayın.
4. **Design** panelinde [buton tasarımını](builder-styling) yapılandırın.
## Buton türleri \{#button-types\}
### Satın alma düğmeleri \{#purchase-buttons\}
:::link
Satın alma düğmelerinin çalışması için ürünleri ekranlara bağlayın ve **Products** öğesini ekleyin. [Rehbere](paywall-product-block) bakın.
:::
Satın alma düğmesi, kullanıcının ekranda seçtiği ürün için uygulama içi satın alma işlemini başlatır. SDK işlemi otomatik olarak yönetir, dolayısıyla uygulama kodunda satın almaları ayrıca ele almanız gerekmez.
Satın alma düğmesi eklemek için:
1. **+** düğmesine tıklayın ve **Button** seçeneğini seçin, ardından bir buton ön ayarı seçin.
2. Butonu seçili durumdayken sağ paneldeki **Interactions** sekmesini açın.
3. **Add trigger** > **On tap** seçeneğine tıklayın, ardından **Add action** düğmesine tıklayın.
4. **Action** değerini **Purchase**, **Product** değerini ise `products.selectedProduct` olarak ayarlayın. `products.selectedProduct` değişkeni her zaman ekrandaki o an seçili olan ürüne karşılık gelir.
:::tip
Satın alma butonlarına animasyon ekleyerek daha fazla dikkat çekebilirsiniz. Paywall Builder şu an için **Pulse** animasyon türünü desteklemektedir.
Animasyon stilini **Design** panelinde yapılandırın.
:::
### Bağlantılar \{#links\}
:::important
**Terms of Use** ve **Privacy Policy** butonlarında yerleşik bir **Open URL** eylemi bulunur. Hedef URL'yi buradan ayarlayın. Boş Open URL'ler ve [satır içi bağlantılar](onboarding-text#inline-link) önizleme ve yayınlamayı engeller.
:::
Bazı mağaza gereksinimlerini karşılamak için şunlara bağlantı ekleyebilirsiniz:
- Kullanım koşulları
- Gizlilik politikası
- Satın alma geri yükleme
Bağlantı eklemek için:
1. **+** butonuna tıklayın ve **Button > Links** seçeneğini seçin. Bu işlem, önceden tanımlanmış aksiyonlara sahip bir satır içi buton grubu ekler: satın almaları geri yükleme veya bir URL açma. Dahil edilen butonların tamamına ihtiyaç duymuyorsanız, gereksiz olanları katmanlar panelinden silin.
2. Şimdi buton eylemlerini ayarlayın:
- **Restore purchases** butonu satın alma geri yüklemelerini zaten yönetiyor.
- Kalan her bağlantı için:
1. Seçmek için butona tıklayın ve sağdaki **Interactions** sekmesine geçin.
2. URL'yi alana yapıştırın.
3. Varsayılan olarak URL, kesintisiz bir kullanıcı deneyimi için uygulama içi tarayıcıda açılır. Kullanıcıları harici bir tarayıcıya yönlendirmek istiyorsanız **Open in external browser** onay kutusunu işaretleyin.
### Flow'u kapat \{#close-flow\}
**Close** düğmesi flow'u otomatik olarak kapatır.
Kapat düğmesi eklemek için **+** simgesine tıklayın ve **Button > Close flow** seçeneğini seçin.
:::tip
Kapat düğmesini ekranın köşesine yerleştirmek için **Absolute** konumlandırmayı kullanın.
:::
Ayrıca [eylemler](onboarding-actions) aracılığıyla herhangi bir düğmeyi flow'u kapatacak şekilde yapılandırabilirsiniz.
### Özel düğmeler \{#custom-buttons\}
Eklediğiniz herhangi bir düğme, dokunulduğunda şu eylemlerden birini gerçekleştirecek şekilde yapılandırılabilir:
- Sonraki ekrana git
- Uyarı göster
- [Değişken](onboarding-variables) ayarla
- [Ekran öğelerini göster veya gizle](onboarding-element-visibility)
- URL aç
- Satın almaları geri yükle
- Koşullu eylemler gerçekleştir
---
# File: builder-tabs
---
---
title: "Sekmeler"
description: "Bir flow'da içerik panellerini değiştiren sekme navigasyonu ekleyin."
---
**Sekmeler**, bir ekran bölümünü birbirini değiştiren içerik panellerine böler — kullanıcı bir sekme başlığına dokunur ve aşağıdaki panel buna göre güncellenir.
{/* TODO: on-device GIF */}
## Sekme ekleme, silme ve seçme \{#add-remove-and-select-tabs\}
Her sekme iki bölümden oluşur:
- **Sekme başlığı** — tıklanabilir etiket (Tab 1, Tab 2 vb.).
- **Sekme içeriği** — her sekme için bir içerik alanı. İçerik alanına eklediğiniz her şey, ilgili sekme seçildiğinde görünür.
Yeni sekme eklemek için **Add tab** düğmesine tıklayın. Her yeni sekme için otomatik olarak bir içerik alanı oluşturulur.
Ekran ilk açıldığında belirli bir sekmenin aktif olmasını istiyorsanız **Selected by default** seçeneğini etkinleştirin.
## Sekmeleri Stillendirme \{#style-the-tabs\}
### Şablonlar \{#templates\}
Flow Builder, kullanıma hazır üç sekme şablonu sunar:
- **Segment control** — seçili sekmenin etrafında yuvarlak köşeli, hap şeklinde bir geçiş elemanı.
- **Button Tabs** — ayrı buton stilli sekmeler.
- **Underline** — seçili sekmeyi alt çizgiyle işaretleyen metin etiketleri.
### Sekme durumları \{#tab-states\}
Her sekmenin kendi durum değiştirici düğmesi vardır (**Default / Selected**); bu sayede aktif ve pasif durumları ayrı ayrı biçimlendirebilirsiniz — her durum için tipografi, renkler, dolgu ve kenarlık.
## Seçilebilir grup \{#selectable-group\}
Sekmeler, **tek seçimli bir seçilebilir grup** oluşturur — her seferinde yalnızca bir sekme aktif olabilir. Grubu, **Screen settings** panelindeki [Selectable groups](paywall-layout-and-products#selectable-groups) bölümünden yönetebilirsiniz.
Grup iki değişken sunar:
- `tabs.selectedOptionId` — seçili sekmenin ID'si. Koşullarda kullanabilirsiniz.
- `tabs.selectedOptionTitle` — seçili sekmenin etiketi. Dinamik metinlerde kullanabilirsiniz.
Grubu yeniden adlandırdıysanız `tabs` ifadesini kendi özel **Group ID** değerinizle değiştirin.
Tam bilgi için [Seçilebilir öğeler ve gruplar](flow-selectable-elements) bölümüne bakın.
---
# File: builder-toggles
---
---
title: "Toggle'lar"
description: "Ödeme akışlarınıza toggle anahtarları ekleyin."
---
:::warning
Apple, önceden seçili deneme toggle'ı kullanan uygulamaları reddedebilir. Varsayılan olarak "açık" konumda ayarlanmış bir toggle, App Store İnceleme Yönergeleri kapsamında yanıltıcı bir karanlık kalıp olarak işaretlenebilir; bu durum, kullanıcının açık bir seçim yapmaksızın ücretsiz denemeye onay verdiği izlenimini yaratır.
Reddedilmemek için toggle'ı varsayılan olarak **kapalı** konuma getirin ve kullanıcıların denemeyi kendilerinin etkinleştirmesine izin verin.
:::
Deneme geçişi, kullanıcıların bir paywall üzerinde standart ve deneme tabanlı ürünler arasında seçim yapmasını sağlayan iki durumlu bir anahtardır. Kullanıcı bu anahtarın durumunu değiştirdiğinde, ürün gruplarını değiştirme, değişkenleri güncelleme ya da öğeleri gösterip gizleme gibi işlemler anında tetiklenebilir.
Deneme geçişi eklemek için hedef ekranda **+** simgesine tıklayın ve **Trial toggle** seçeneğini seçin.
Her deneme geçişi, **Toggle** türünde seçilebilir bir öğedir. Her seçilebilir öğeye, durumunu yansıtmak için bir değişken atanır; örneğin `trial` adlı bir geçişe `True` veya `False` değeri alan bir `trial.is_selected` değişkeni atanır.
Diğer öğeleri toggle durumuna bağlı kılmak için bu değişkeni temel alarak koşullu bir [eylem](onboarding-actions) veya [koşullu görünürlük](onboarding-element-visibility) ayarlayın.
---
# File: builder-reviews-and-testimonials
---
---
title: "Yorumlar ve referanslar"
description: "Bir paywalla incelemeler, puanlamalar ve sosyal kanıt ekleyin."
---
**User Engagement** element kategorisi, bir paywallda yorumları, puanlamaları ve sosyal kanıtları sergilemek için dört şablon sunar. Her şablon tam olarak düzenlenebilir bir kompozisyondur — yer tutucu metni değiştirin ve flow'un geri kalanıyla uyumlu hale getirmek için [renk stillerinizi](builder-styling) ve [tipografinizi](onboarding-text) uygulayın.
## İnceleme \{#review\}
Tek bir derecelendirme, alıntı ve yazar bilgisi içeren bir kart. Unutulmaz bir kullanıcı alıntısını öne çıkarmak için kullanın.
## Derecelendirme \{#rating\}
Yıldız satırı ve sayıyı birlikte gösteren bir bileşen; örneğin "17000+ değerlendirme". Değerlendirme hacmini vurgulamak için kullanılır.
## Uygulama Puanı \{#app-rating\}
Örnek boyutuyla birlikte öne çıkan bir puan gösterimi; "4.9 / 1000'den fazla değerlendirmeye dayanarak" gibi. Güçlü bir genel puanı vurgulamak için kullanın.
## Sosyal Kanıt \{#social-proof\}
Üye sayısıyla birlikte bir avatar grubu, örneğin "50.000'den fazla kullanıcıya katıl". Topluluk büyüklüğünü vurgulamak için kullanın.
---
# File: flow-timer
---
---
title: "Geri sayım sayacı"
description: "Bir paywall'a geri sayım sayacı ekleyin."
---
**Geri sayım sayacı**, belirli bir süreden geriye doğru sıfıra kadar sayar — sıfıra ulaştığında ekran dondurulur.
## Şablonlar \{#templates\}
Bu kategori dört görsel varyant sunar:
- **Blocks** — Gün, saat, dakika ve saniye ayrı etiketli hücrelerde gösterilir.
- **Inline Units** — Birim son ekleriyle tek satırlık metin.
- **Inline** — Yalnızca rakamlar.
- **Badge** — Hap şeklinde rakam gösterimi.
## Ayarlar \{#settings\}
### Süreyi ayarlayın \{#set-the-duration\}
Sağ panelin **Countdown** bölümüne başlangıç süresini gün, saat, dakika ve saniye cinsinden girin.
### Davranışı yapılandırma \{#configure-the-behavior\}
**Behavior** açılır menüsü, zamanlayıcının ne zaman başlayacağını belirler:
- **Every appear** — Kullanıcı ekranı her açtığında yeniden başlar. Varsayılan.
- **First appear** — Geçerli uygulama oturumunda kullanıcının ekranı ilk görüntülemesiyle başlar. Aynı oturumda geri dönüldüğünde saymaya devam eder; uygulama yeniden başlatıldığında sıfırlanır.
- **First appear (persisted)** — Kullanıcının ekranı ilk açmasıyla başlar ve uygulama yeniden başlatılsa da saymaya devam eder.
### Zamanlayıcı sona erdiğinde bir eylem tetikleyin \{#trigger-an-action-when-the-timer-ends\}
:::link
Ana makale: [Eylemler](onboarding-actions)
:::
Geri sayım sıfıra ulaştığında bir eylem çalıştırmak için **On timer end** tetikleyicisi ekleyin — örneğin, başka bir ekrana geçin veya indirim rozetini gizleyin.
---
# File: onboarding-quizzes
---
---
title: "Flow'larda sınavlar"
description: "Kullanıcı tercihlerini toplamak ve kişiselleştirilmiş flow'lar oluşturmak için Adapty flow'larınıza interaktif sınavlar ekleyin — kod yazmanıza gerek yok."
---
Kullanıcılara önceden tanımlanmış seçenekler sunmak için sınavları kullanın. Input'ların aksine, sınavlarda yazı yazılan alanlar bulunmaz — kullanıcılar sizin belirlediğiniz seçenekler arasından tercih yapar. Tercihleri toplamak, kullanıcıları segmentlere ayırmak veya verdikleri cevaplara göre flow'u dallandırmak için bunları kullanabilirsiniz.
### Bir test ekleyin \{#add-a-quiz\}
1. Sol üstteki **+** simgesine tıklayın.
2. **Quiz** seçeneğini belirleyin.
3. Test türünü seçin:
- **Icon/image/emoji options:** Her seçeneğin yanında bir ikon, resim veya emoji ile metin etiketi bulunan dikey bir liste.
- **Icon/image/emoji grid:** Her seçeneğin ikon, resim veya emoji içerdiği bir ızgara düzeni.
- **Rating:** Kullanıcıların sayısal veya yıldız tabanlı olarak puan verebileceği bir ölçek.
### Koşullu yönlendirme kurulumu \{#set-up-conditional-navigation\}
Kullanıcıları seçimlerine göre farklı yönlendirmek için koşullu eylemi sınav seçeneğine değil, **gezinti düğmesine** ayarlayın:
1. Navigasyon düğmesini seçin.
2. **Interactions** panelinde, **Conditional** eylemli bir **On Tap** tetikleyicisi ekleyin.
3. **Edit Action** iletişim kutusunda **if** satırını oluşturun:
- Sol tarafta `{}` simgesine tıklayın ve kullanıcının seçimini referans almak için **Elements → Screen → `
2. Sağ üst köşedeki **Create product** düğmesine tıklayın. Adapty tüm ürün türlerini destekler: abonelikler, consumable olmayan ürünler \(süresiz erişim dahil\) ve consumable ürünler.
3. **Create a new product and push to stores** seçeneğini seçin.
4. Aşağıdaki bilgileri girin:
- **Product name**: Adapty kontrol panelinde kullanılacak ürün adını girin. Bu ad esas olarak sizin referansınız için kullanılır, bu yüzden Adapty Kontrol Paneli genelinde en rahat kullanabileceğiniz adı seçebilirsiniz.
- **Access Level**: Ürünün ait olduğu [access level](access-level)'ı seçin. Access level, ürün satın alındıktan sonra hangi özelliklerin açılacağını belirlemek için kullanılır. Bu listede yalnızca daha önce oluşturulmuş access level'ların göründüğünü unutmayın. `premium` access level Adapty'de varsayılan olarak oluşturulur, ancak [daha fazla access level ekleyebilirsiniz](access-level).
- **Subscription duration**: Listeden abonelik süresini seçin.
- **Weekly/Monthly/2 Months/3 Months/6 Months/Annual**: Abonelik süresi.
- **Lifetime**: Uygulamanın premium özelliklerini sonsuza kadar açan ürünler için lifetime süresini kullanın.
- **Non-Subscriptions**: Abonelik olmayan ve dolayısıyla süresi bulunmayan ürünler için non-subscriptions'ı kullanın. Bunlar ek özellikler, consumable ürünler vb. için kullanılabilir.
- **Consumables**: Consumable ürünler birden fazla kez satın alınabilir. Uygulama kullanım süresi boyunca tüketilebilirler. Oyun içi para birimi ve ekstralar buna örnek gösterilebilir. Consumable ürünlerin access level'ları etkilemediğini unutmayın. Tek seferlik satın alma ile access level tanımlamak için **Non-Subscriptions** kullanın.
- **Price (USD)**: Ürünün USD cinsinden fiyatı. Bu fiyat, tüm ülkelerdeki fiyatların otomatik olarak hesaplanıp ayarlanmasında temel olarak kullanılır. Daha sonra [farklı ülke ve bölgeler için fiyatı özelleştirebilirsiniz](edit-product#set-country-specific-prices).
5. **Save & Continue** düğmesine tıklayın.
6. App Store'da yayınlamayı planlıyorsanız ürün bilgilerini yapılandırın:
- **Product ID**: Ürün için kalıcı ve benzersiz bir kimlik oluşturun.
- **Product group**: App Store Connect'te oluşturduğunuz mevcut bir ürün grubunu seçin ya da **Create new Product Group** seçeneğine tıklayarak gruba bir ad verin. Adapty grubu oluşturduktan sonra açılır listeden seçebilirsiniz.
- **Screenshot**: Sunulan öğe veya hizmeti açıkça gösteren uygulama içi satın alma ekran görüntüsü yükleyin. Bu ekran görüntüsü yalnızca App Store incelemesi için kullanılır ve App Store'da görüntülenmez. Ekran görüntüsü boyutu ve format gereksinimleri için [buraya](https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications/) bakın.
7. **Push data to App Store** düğmesine tıklayın.
:::warning
Bu uygulama için ilk ürününüzse, App Store Connect'te manuel olarak incelemeye göndermeniz gerekir. Sonrasında bu adım gerekmeyecektir. İnceleme tamamlandığında Adapty'deki ürün durumu otomatik olarak güncellenecektir.
:::
8. Google Play'de yayınlamayı planlıyorsanız ürün bilgilerini yapılandırın:
- **Base Product ID**: Ürün için kalıcı ve benzersiz bir kimlik oluşturun.
- **Subscription**: Google Play Console'da oluşturduğunuz mevcut bir abonelik grubunu seçin ya da **Create new Product Group** seçeneğine tıklayarak gruba bir ad ve kimlik verin. Adapty grubu oluşturduktan sonra açılır listeden seçebilirsiniz.
:::note
Ek süre ve Hesap Bekletme Süresi, Play Store kurallarına göre otomatik olarak varsayılan değerlere ayarlanacaktır. Bunları daha sonra Google Play Console'da değiştirebilirsiniz.
:::
9. **Push data to Play Store** düğmesine tıklayın.
10. iOS için, başlangıç teklifini – ücretsiz deneme – yapılandırmak üzere açılır listeden **Free duration** seçeneğini belirleyin. Bu ilk kurulumda bir ücretsiz deneme başlangıç teklifi ekleyebilirsiniz. Ana ürün mağazalar tarafından onaylandıktan sonra, mağaza konsolunuzdaki mevcut ID'leri bağlayarak [daha fazla teklif](offers) ekleyebilirsiniz (ör. promosyon teklifi, geri kazanma teklifi).
:::important
Başlangıç teklifleri Google Play ile otomatik olarak senkronize edilmez. App Store'dan farklı olarak, Google Play'de ayrı bir "başlangıç teklifi" türü yoktur — ücretsiz denemeler ve indirimli tekliflerin tümü, temel planda **teklifler** olarak yapılandırılır. [Teklifi Google Play Console'da oluşturun ve Adapty ürününüze bağlayın](google-play-offers).
:::
11. Son olarak, ürün oluşturma işlemini onaylamak için **Save** seçeneğine tıklayın.
## Ürünü oluştur ve mevcut mağaza ürünleriyle bağlantı kur \{#create-product-and-connect-existing-store-products\}
:::warning
Başlamadan önce şunları yaptığınızdan emin olun:
- İhtiyacınız olan mağazalarla entegrasyonu yapılandırın:
- [App Store](initial_ios)
- [Google Play](initial-android)
- İhtiyacınız olan mağazalarda ürün oluşturun:
- [App Store](app-store-products)
- [Google Play](android-products)
**Oluşturulmuş hiç ürününüz yoksa**, [Mağazalara gönder](#create-product-and-push-to-store) kılavuzunu takip ederek hem Adapty'de hem de mağazalarda aynı anda oluşturmayı düşünebilirsiniz.
:::
2. Sağ üst köşedeki **Create product** düğmesine tıklayın. Adapty tüm ürün türlerini destekler: abonelikler, consumable olmayan ürünler \(süresiz erişim dahil\) ve consumable ürünler.
3. **Connect an existing store product** seçeneğini seçin.
4. Aşağıdaki bilgileri girin:
- **Product name**: Adapty kontrol panelinde kullanılacak ürün adını girin. Bu ad yalnızca kendi referansınız içindir; Adapty Kontrol Paneli genelinde kullanmak için en uygun bulduğunuz adı seçebilirsiniz.
- **Access Level ID**: Ürünün ait olduğu [access level](access-level)'ı seçin. Access level, ürün satın alındıktan sonra hangi özelliklerin açılacağını belirlemek için kullanılır. Bu listede yalnızca önceden oluşturulmuş access level'lar yer alır. `premium` access level Adapty'de varsayılan olarak oluşturulur, ancak [daha fazla access level ekleyebilirsiniz](access-level).
- **Abonelik süresi**: Listeden abonelik süresini seçin.
- **Haftalık/Aylık/2 Ay/3 Ay/6 Ay/Yıllık**: Abonelik süresi.
- **Lifetime**: Uygulamanın premium özelliklerini sonsuza kadar açan ürünler için lifetime süreyi kullanın.
- **Non-Subscriptions**: Abonelik olmayan ve dolayısıyla süresi bulunmayan ürünler için non-subscription kullanın. Bunlar ek özellikler, consumable ürünler vb. için kullanılabilir.
- **Consumables**: Consumable öğeler birden fazla kez satın alınabilir. Uygulama kullanım ömrü boyunca tüketilebilirler. Oyun içi para birimi ve ekstralar buna örnek gösterilebilir. Consumable ürünlerin access level'ları etkilemediğini unutmayın. Tek seferlik satın alımdan access level vermek için bunun yerine **Non-Subscriptions** kullanın.
- **Fiyat (USD)**: Ürünün USD cinsinden fiyatı. Ürününüz zaten mağazadaysa bu değer gerçek mağaza fiyatını etkilemez; listeden herhangi bir değer seçebilirsiniz. Daha sonra Adapty kontrol panelinden [farklı bölgeler için fiyatları özelleştirebilirsiniz](edit-product#set-country-specific-prices).
5. **Continue** düğmesine tıklayın.
6. Her mağaza için ürün bilgilerini yapılandırın:
- **App Store:**
- **App Store Product ID:** Ürününüze cihazlarda erişmek için kullanılan bu benzersiz kimliği listeden seçin. Listede göremiyorsanız App Store Connect'teki yapılandırmasını kontrol edin ve bu uygulamaya ait olduğundan emin olun.
- **Play Store:**
- **Google Play Product ID:** Play Store'daki ürün kimliğidir. Listeden seçin. Listede göremiyorsanız Google Play Console'daki yapılandırmasını kontrol edin ve bu uygulamaya ait olduğundan emin olun.
- **Base Plan ID:** Play Store'daki ürün için temel planı tanımlamak amacıyla kullanılan bu kimlik, Play Store'da aboneliğin Ürün Kimliğini eklerken zorunludur. Temel plan; faturalandırma dönemini, yenileme türünü (otomatik yenileme veya ön ödemeli) ve ilgili fiyatı kapsar. Adapty'de aynı aboneliğin farklı temel planlarla her bir kombinasyonu ayrı bir ürün olarak ele alınır.
- **Legacy fallback product**: Yedek ürün, yalnızca Adapty SDK'nın eski sürümlerini (2.5 ve altı) kullanan uygulamalar için kullanılır. Google Play Console'da bir ürünü geriye dönük uyumlu olarak işaretleyerek Adapty, bu ürünün eski SDK sürümleri tarafından satın alınıp alınamayacağını belirleyebilir. Bu alan için değeri `
## Ülkeye özgü fiyatlar belirleyin \{#set-country-specific-prices\}
Adapty kontrol panelinden farklı bölgeler için farklı fiyatlar belirleyebilirsiniz; bu ülkeye özgü fiyatlar App Store Connect ve/veya Google Play Console'daki ürünlerinize otomatik olarak uygulanır.
Ülkeye özgü fiyatlar belirlemek için:
1. [Ürünü düzenleme için açın](#edit-product).
2. Mağazalardan dışa aktarılan mevcut fiyatlarınızı doğru formatta almak için **Download**'a tıklayın ya da yeni bir CSV dosyası oluşturun.
3. CSV dosyasındaki fiyatları güncelleyin. [Formata](#csv-file-format) uyun. Herhangi bir ülkenin fiyatını değiştirmeden bırakırsanız veya dosyaya hiç eklemezseniz hiçbir şey olmaz. CSV'yi yüklediğinizde Adapty fiyatları karşılaştırır ve yalnızca farklı olanları günceller.
4. **Edit** penceresinde **Upload**'a tıklayın ve CSV dosyasını seçin.
5. Değişikliklerin mevcut aboneler için de geçerli olmasını istiyorsanız **Apply to existing subscribers**'ı seçin.
6. Uygulanacak değişiklikleri inceleyin ve **Save changes**'e tıklayın.
### CSV dosya formatı \{#csv-file-format\}
:::tip
Bir uygulamada benzer ürünleriniz varsa veya farklı uygulamalarda aynı fiyatları belirlemek istiyorsanız aynı CSV dosyasını yeniden kullanabilirsiniz.
:::
CSV'deki fiyatları düzenlemenin en kolay yolu [mevcut fiyatlarla bir dosya indirip doğrudan üzerinde düzenlemektir](#set-country-specific-prices).
Ancak kendiniz yapıyorsanız dosyanız şu sütunları içermelidir:
- `region_name`
- `region_code`
- `app_store_currency`
- `app_store_requested_price`
- `play_store_currency`
- `play_store_requested_price`
Örnek:
```
region_name,region_code,app_store_currency,app_store_requested_price,play_store_currency,play_store_requested_price
United States,US,,8.99,,8.99
United Arab Emirates,AE,USD,8.99,AED,39.99
Germany,DE,USD,8.99,USD,8.99
```
## Denetim günlüğünü görüntüleyin \{#view-audit-log\}
Adapty, her ürün için tüm fiyat değişikliklerini kaydeder; böylece kimin ne zaman değişiklik yaptığını takip edebilirsiniz. Denetim günlüğünü görüntülemek için:
1. Adapty ana menüsünden **[Products](https://app.adapty.io/products)** bölümüne gidin.
2. Ürünün yanındaki üç noktaya tıklayın ve **Audit log**'u seçin.
Denetim günlüğü tablosu, her fiyat değişikliğini tarih, ekip üyesinin adı ve rolü ile değişiklik sayısıyla birlikte gösterir.
Bir olayın ayrıntılı CSV dökümünü indirmek için o satırdaki indirme simgesine tıklayın.
---
# File: delete-product
---
---
title: "Ürünü sil"
description: "Adapty'de bir abonelik ürününü uygulamanızın gelir akışını kesintiye uğratmadan nasıl sileceğinizi öğrenin."
---
Yalnızca paywallarda kullanılmayan ürünleri silebilirsiniz.
Ürünü silmek için:
1. Adapty ana menüsünden **[Products](https://app.adapty.io/products)** bölümüne gidin.
2. Ürünün yanındaki **3 nokta** butonuna tıklayın ve **Delete** seçeneğini seçin.
2. Silmek istediğiniz ürünün adını girin.
3. **Delete forever** butonuna tıklayın.
---
# File: add-product-to-paywall
---
---
title: "Paywalla ürün ekleme"
description: "Adapty'de paywall'lara ürün eklemeyi ve yönetmeyi öğrenin."
---
Bir [paywall](paywalls) üzerinde ürünlerin görünür ve seçilebilir olması için şu adımları izleyin:
1. [Paywall oluştururken](create-paywall) **Products** başlığının altındaki **Add product** düğmesine tıklayın.
2. Açılan açılır listeden müşterilerinize gösterilecek ürünleri seçin. Listede yalnızca önceden oluşturulmuş ürünler yer alır. Ürünlerin sırası SDK tarafında korunur; bu nedenle paywall'ı yapılandırırken istediğiniz sırayı göz önünde bulundurmanız önemlidir. Ayrıca isterseniz bir ürün için teklif de belirtebilirsiniz.
3. Paywall'ın durumuna göre **Create as draft** veya **Save and publish** düğmesine tıklayın.
Oluşturulduktan sonra paywall'daki ürünleri düzenlemeniz, eklemeniz veya silmeniz önerilmez; bu işlemler paywall metriklerini olumsuz etkileyebilir.
---
# File: virtual-currencies
---
---
title: "Sanal para birimleri"
description: "Adapty'de uygulama içi para birimlerini tanımlayın, ürünlere bağlayarak kredileri otomatik olarak verin ve her kullanıcı için bakiye takibi yapın."
---
Google Play Console'da teklif oluşturmak için:
1. **Add offer** seçeneğine tıklayın ve listeden temel planı seçin.
2. Teklif ID'sini girin. Bu ID daha sonra analitik ve Adapty kontrol panelinde kullanılacağından anlamlı bir isim verin.
3. Uygunluk kriterini seçin:
1. **New customer acquisition**: Teklif, yalnızca bu teklifi daha önce kullanmamış yeni abonelere sunulur. En yaygın seçenektir ve varsayılan olarak kullanılmalıdır.
2. **Upgrade**: Bu teklif, başka bir abonelikten yükseltme yapan kullanıcılara sunulur. Mevcut abonelerinizi daha pahalı planlara yönlendirmek istediğinizde kullanın; örneğin bronze katmandan gold katmana geçiş yapan kullanıcılar için.
3. **Developer determined**: Bu teklifi kimin kullanabileceğini uygulama kodundan kontrol edebilirsiniz. Olası dolandırıcılığı önlemek için üretim ortamında dikkatli kullanın: Kullanıcılar ücretsiz veya indirimli aboneliği tekrar tekrar etkinleştirebilir. Bu teklif türü için iyi bir kullanım senaryosu, ayrılmış aboneleri geri kazanmaktır.
4. Teklifinize en fazla iki fiyatlandırma aşaması ekleyin. Üç aşama türü mevcuttur:
1. **Free trial**: Abonelik, yapılandırılan süre boyunca (en az 3 gün) ücretsiz kullanılabilir. En yaygın teklif türüdür.
2. **Single payment**: Kullanıcılar peşin ödeme yaparsa abonelik daha ucuz olur. Örneğin, normalde aylık plan 9,99 $ iken bu teklif türüyle ilk üç ay toplam 19,99 $'a, yani %30 indirimle satın alınabilir.
3. **Discounted recurring payment**: Abonelik, ilk `n` dönem boyunca daha ucuz olur. Örneğin, normalde aylık plan 9,99 $ iken bu teklif türüyle ilk üç ayın her biri 4,99 $'a, yani %50 indirimle sunulur.
Bir teklifin iki aşaması olabilir. Bu durumda birinci aşama Free trial, ikinci aşama ise Single payment veya Discounted recurring payment olmalıdır ve bu sırayla uygulanırlar.
:::important
Adapty Paywall Builder ile oluşturulan paywallların, çok aşamalı bir Google abonelik teklifinin yalnızca ilk aşamasını göstereceğini lütfen unutmayın. Ancak kullanıcı ürünü satın aldığında, tüm teklif aşamalarının Google Play'de yapılandırıldığı şekilde uygulanacağından emin olabilirsiniz.
:::
5. Teklifi uygulamada kullanmak için etkinleştirin.
6. [Teklifi Adapty'ye ekleme](create-offer) adımına geçin.
:::note
Farklı temel planlar için aynı teklif ID'leri kullanılabilir.
:::
## Sonraki adımlar \{#next-steps\}
Teklifleri ekledikten sonra kuruluma devam edin:
- **App Store'da da uygulamanız varsa** [App Store rehberine](app-store-offers) gidin.
- **Yalnızca Google Play'de uygulamanız varsa** teklifleri Adapty'ye eklemek için [bu rehberi](create-offer) takip edin.
---
# File: create-offer
---
---
title: "Adapty'ye teklif ekleme"
description: "Adapty'nin araçlarını kullanarak özel abonelik teklifleri oluşturun ve yönetin."
---
Adapty, yeni, mevcut veya kaybedilen abonelere deneme süresi veya indirim sunmanıza olanak tanır.
Bunları App Store Connect veya Google Play Console'da ayarladıktan sonra, iki adımda Adapty'ye eklemeniz gerekir:
1. [Adapty'de ürünlere mağazalardan aldığınız teklif ID'lerini kullanarak teklifler ekleyin.](#1-create-offer)
2. [Teklifi bir flow veya paywall'da gösterin.](#2-display-offer)
:::warning
Başlangıç teklifleri (App Store), kullanıcı uygunsa otomatik olarak uygulanır. Bunları Adapty'deki ürünlere eklemeyin.
Bu kılavuz, promosyon tekliflerini (App Store), geri kazanma tekliflerini (App Store) ve tüm Google Play tekliflerini nasıl yapılandıracağınızı açıklar.
:::
## 0. Başlamadan önce \{#0-before-you-start\}
Adapty'de teklifleri ayarlamaya başlamadan önce aşağıdakileri kontrol edin:
1. İhtiyacınız olan tüm teklifleri mağazada oluşturmuş olun:
- [App Store](app-store-offers)
- [Google Play](google-play-offers)
2. Adapty'de [ürünleri](create-product) oluşturmuş ve kimliklerini eklemiş olun.
3. App Store için: [Promosyon teklifleri için uygulama içi satın alma anahtarını](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers) yüklemiş olun.
## 1. Adapty'deki ürüne teklif ekleme \{#1-create-offer\}
Promosyon teklifinizi (Play Store ve App Store için) veya Geri Kazanma teklifinizi (App Store için) uygulama mağazalarında oluşturduktan sonra, bunu Adapty'ye eklemek oldukça basittir:
1. Adapty'nin ana menüsünden [**Products**](https://app.adapty.io/products) sayfasını açın. Teklif eklemek istediğiniz ürünü bulun.
2. Teklif eklemek istediğiniz ürünü bulun. **Actions** sütununda, ürünün yanındaki **3-dot** düğmesine tıklayın ve **Edit**'i seçin.
3. **Edit product** penceresinde **+** düğmesine tıklayın ve **Add offers**'ı seçin.
4. **Add offer** düğmesine tıklayın.
5. Ürün için teklif ayrıntılarını girin.
Teklif alanları şunlardır:
- **Offer name**: Adapty'de tanımlamanıza yardımcı olacak bir teklif adı girin. Size uygun herhangi bir ad kullanabilirsiniz.
- **App Store Offer type**: Eklediğiniz App Store teklif türünü seçin: Promotional veya Win-back. (Başlangıç tekliflerinin eklenmesine gerek yoktur; uygunsa otomatik olarak uygulanırlar.)
- **App Store Offer ID**: [App Store'da belirlediğiniz](app-store-products) teklife ait benzersiz kimlik.
- **Play Store Offer ID**: Benzer şekilde, [Play Store'da belirlediğiniz](android-products) teklife ait benzersiz kimlik.
:::tip
**App Store Offer ID** veya **Play Store Offer ID** alanı aktif değilse, **Products** sekmesine geçin ve bir ürün kimliği seçin.
:::
6. (isteğe bağlı) **Add offer** düğmesine tıklayarak gerekirse daha fazla teklif ekleyin.
7. Teklifleri ürüne eklemek için **Save**'e tıklayın.
## 2. Teklifi göster \{#display-offer\}
Bir teklif ürüne eklendikten sonra, kullanıcıların o ürünü gördüğü yerde — bir flow'da veya paywall'da — göster.
### Flow'a teklif ekleme \{#add-offer-to-flow\}
[Flow Builder](adapty-flow-builder)'da bir teklif, Products ögesindeki bir ürüne eklenir. Önce ürün ögesini ekleyin ve ürünleri atayın — bkz. [Satın almaları ayarlama](paywall-product-block).
Teklif eklemek için:
1. Canvas üzerinde, teklifi göstermesi gereken ürün kartını seçin.
2. Sağ panelde, **Product** altında ürünü seçin, ardından **Select offer (optional)** açılır menüsünden teklifi seçin.
### Paywall'a teklif ekleme \{#add-offer-to-paywall\}
:::info
**Live** (yayında) durumundaki paywall'lara teklif ekleyemezsiniz. Mevcut bir paywall'a teklif eklemek istiyorsanız, paywall'ı [kopyalayın](duplicate-paywalls) ve yeni paywall'da ürünleri yapılandırın.
:::
Bir teklifin uygulamanızın kullanıcıları tarafından bir [paywall](paywalls) içinde görünür ve seçilebilir olması için şu adımları izleyin:
1. Bir paywall oluştururken veya düzenlerken **General** sekmesinde, teklifi eklediğiniz ürünü ekleyin.
2. Bu ürün için daha önce oluşturduğunuz teklifi **Offer** listesinden seçin. Liste yalnızca teklifi olan ürünler için görüntülenir.
3. Gerekirse daha fazla ürün ve teklif ekleyin, ancak her ürün için yalnızca bir teklif ekleyebilirsiniz.
## Adapty'nin tekliflerle çalışma şekli \{#how-adapty-works-with-offers\}
Tekliflerin Adapty'de nasıl çalıştığına dair şunları not edin:
- Kullanıcı bir teklife uygunsa, Adapty satın alma sırasında yapılandırdığınız teklifi otomatik olarak uygular.
- App Store'da bir ürün hem başlangıç teklifi hem de promosyon teklifleri içeriyorsa, uygun kullanıcılar önce başlangıç teklifini alır. Bu süre sona erdikten sonra, kullanıcı promosyon teklifine hâlâ uygunsa ve siz bu teklifi Adapty'de yapılandırdıysanız, kullanıcı ürünü tekrar satın almaya çalıştığında teklif uygulanır.
- Tekliflerin nasıl uygulandığı üzerinde daha fazla kontrol istiyorsanız veya belirli durumlarda ürününüzü teklif olmadan satmanız gerekiyorsa birkaç seçeneğiniz bulunur:
- App Store veya Google Play Console'da uygunluk kriterlerini yapılandırın
- App Store veya Google Play Console'da teklif içermeyen ayrı bir ürün oluşturun
- Adapty'de teklif içermeyen ayrı bir ürün oluşturun, her iki ürün varyantını içeren paywalleri bir [placement](placements)'a ekleyin ve hangi paywallin farklı kullanıcılara gösterileceğini kontrol etmek için kitle [segmentlerini](segments) kullanın. Örneğin, **Subscription product** veya **Paid access level** bazında segmentler oluşturabilir ya da kendi mantığınızı uygulamak için [özel nitelikleri](profiles-crm) kullanabilirsiniz.
---
# File: create-access-level
---
---
title: "Access level oluşturma"
description: "Daha iyi kullanıcı segmentasyonu için Adapty'de access level oluşturun ve atayın."
---
Access level'lar, belirli ürün ID'lerini koda gömmeden uygulamanızdaki kullanıcıların neler yapabileceğini kontrol etmenizi sağlar. Her ürün, kullanıcının belirli bir access level'a ne kadar süreyle sahip olacağını belirler. Dolayısıyla bir kullanıcı satın alma yaptığında, Adapty uygulamaya belirli bir süre (abonelikler için) ya da sonsuza kadar (süresiz erişim satın almaları için) erişim sağlar.
Adapty Kontrol Paneli'nde bir uygulama oluşturduğunuzda, `premium` access level otomatik olarak oluşturulur. Bu, varsayılan access level olarak işlev görür ve silinemez.
:::tip
Access level'ları programatik olarak [Developer CLI](developer-cli-reference#adapty-access-levels-create) kullanarak da oluşturabilirsiniz.
:::
Yeni bir access level oluşturmak için:
1. Adapty ana menüsünden **[Products](https://app.adapty.io/access-levels)** bölümüne gidin, ardından **Access levels** sekmesini seçin.
2. **Create access level** düğmesine tıklayın.
3. **Create access level** penceresinde bir ID atayın. Bu ID, kullanıcı satın alma yaptığında ek özelliklere erişimi etkinleştirmek için mobil uygulamanızdaki tanımlayıcı görevi görecektir. Ayrıca bu tanımlayıcı, uygulama içinde bir access level'ı diğerlerinden ayırt etmenize yardımcı olur. Kolayca anlayabileceğiniz, açık ve net bir ID seçtiğinizden emin olun.
4. Access level oluşturmayı onaylamak için **Create access level** düğmesine tıklayın.
---
# File: assigning-access-level-to-a-product
---
---
title: "Ürüne access level atama"
description: "Abonelik yönetimini optimize etmek için ürünlere access level atayın."
---
Her [Ürün](product), kullanıcıların satın alma sonrasında ilgili kısıtlı içeriğe erişebilmesi için bir access level ile ilişkilendirilmelidir. Adapty, abonelik süresini otomatik olarak belirler ve bu süre access level'ın bitiş tarihi olarak kullanılır. Süresiz bir ürün söz konusu olduğunda, müşteri satın aldığında access level herhangi bir bitiş tarihi olmaksızın süresiz olarak aktif kalır.
Bir ürüne access level bağlamak için:
1. [Ürünü yapılandırırken](create-product) **Access Level ID** listesinden access level'ı seçin.
2. **Save**'e tıklayın.
---
# File: give-access-level-to-specific-customer
---
---
title: "Belirli bir müşteriye access level verme"
description: "Adapty'nin gelişmiş araçlarını kullanarak müşterilere belirli access level'lar atayın."
---
Adapty Kontrol Paneli'nden belirli bir müşterinin access level'ını manuel olarak ayarlayabilirsiniz. Bu özellik özellikle destek senaryolarında işe yarar. Örneğin, harika bir yorum bırakan bir kullanıcıya teşekkür olarak premium kullanımını bir hafta uzatmak isteyebilirsiniz.
## Adapty Kontrol Paneli'nde belirli bir müşteriye access level verme \{#give-access-level-to-a-specific-customer-in-the-adapty-dashboard\}
1. Adapty ana menüsünden **[Profiles and Segments](https://app.adapty.io/placements)** bölümüne gidin.
2. Erişim vermek istediğiniz müşteriye tıklayın.
3. **Add access level** düğmesine tıklayın.
4. Vermek istediğiniz access level'ı ve bu müşteri için ne zaman sona ereceğini seçin.
5. **Apply** düğmesine tıklayın.
## API aracılığıyla belirli bir müşteriye access level verme \{#give-access-level-to-a-specific-customer-via-api\}
Adapty API'sini kullanarak sunucunuzdan bir müşteriye access level verme seçeneğiniz de bulunmaktadır. Bu özellik, referans bonusları veya ürünlerinizle ilgili diğer etkinlikler için oldukça kullanışlıdır. Ayrıntılı bilgi için [Sunucu taraflı API ile access level verme](api-adapty/operations/grantAccessLevel) sayfasına bakın.
---
# File: local-access-levels
---
---
title: "Yerel access level'lar"
description: "Geçici kesintiler durumunda access level'ları yönetin."
---
:::important
Aşağıdakilere dikkat edin:
- Yerel access level'lar, Adapty SDK'nın 3.12 sürümünden itibaren desteklenmektedir.
- Varsayılan olarak, ek güvenlik için Android'de yerel access level'lar devre dışıdır. Bunlara ihtiyaç duyarsanız SDK etkinleştirme sırasında etkinleştirin: [Android](sdk-installation-android#enable-local-access-levels), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter#enable-local-access-levels-android).
:::
Yapılandırdığınız her ürüne bağlı bir [**access level**](access-level) bulunur. Kullanıcılarınız bir satın alma işlemi gerçekleştirdiğinde, Adapty SDK bu access level'ı kullanıcı [profiline](profiles-crm) atar; dolayısıyla kullanıcıların uygulamadaki ücretli içeriklere erişip erişemeyeceğini belirlemek için bu access level'ı kullanmanız gerekir.
Adapty SDK son derece güvenilirdir ve sunucularının kullanılamaz hale gelmesi çok nadiren yaşanır. Ancak böyle nadir bir durumda bile kullanıcılarınız bunu fark etmez.
Bir kullanıcı satın alma işlemi yaparken Adapty yanıt alamazsa SDK, satın almaları doğrudan mağazadan doğrulamaya geçer. Bu sayede access level uygulamada yerel olarak verilir ve bunu etkinleştirmek için ek bir kurulum gerekmez. SDK bunu arka planda otomatik olarak yönetir; kullanıcılar ödedikleri içeriklere her zamanki gibi erişmeye devam eder.
Yerel access level'ların nasıl çalıştığına dair şunlara dikkat edin:
- Kullanıcılar yeniden çevrimiçi olduğunda işlem bilgileri otomatik olarak Adapty sunucularına iletilir; sunucular bu işlemleri kullanıcı profiline uygular ve güncel profili SDK'ya döndürür.
- Veriler iletilene kadar güncel bilgiler Adapty analizlerinde görünmez.
- Yerel access level'lar yalnızca Adapty sunucuları çevrimdışı olduğunda çalışır. Aksi takdirde SDK önbelleğe alınmış verileri kullanır.
- Yerel access level'lar consumable ürünlerde çalışmaz; ancak bir consumable ürüne Adapty kontrol panelinde abonelik türü (aylık, yıllık, haftalık vb.) atanmışsa bu kural geçerli değildir.
---
# File: choose-meaningful-placements
---
---
title: "Anlamlı placement'lar seçin"
description: "Kullanıcı etkileşimini ve geliri artırmak için Adapty ile flow ve paywall placement'larını optimize edin."
---
[Placement'ler oluştururken](create-placement), uygulamanızın mantıksal akışını ve oluşturmak istediğiniz kullanıcı deneyimini göz önünde bulundurmanız önemlidir. Çoğu uygulama, deney yapabilme kapasitesinden ödün vermeden en fazla 5 [placement](placements) içermelidir. Placement'lerinizi nasıl yapılandırabileceğinize dair bir örnek:
1. **Onboarding flow:** Bu aşama, kullanıcılarınızın uygulamanızla ilk kez etkileşime geçtiği andır. Flow, onboarding ve paywall placement'larını bir arada kullanarak uygulamanızın değer önerisini tanıtmak için mükemmel bir fırsattır. Aboneliklerin %80'inden fazlası onboarding sürecinde başlatıldığından, burada en kârlı abonelikleri satmaya odaklanmak büyük önem taşır. Adapty ile farklı kitleler için kolayca farklı [flow'lar](adapty-flow-builder), [onboarding'ler](onboardings) ve [paywall'lar](paywalls) oluşturabilir; uygulamanız için en iyi seçeneği bulmak amacıyla A/B testleri çalıştırabilirsiniz. Örneğin, ABD'deki kullanıcılar için bir A/B testi başlatarak onlara %50 oranında daha pahalı abonelikler gösterebilirsiniz.
2. **App settings:** Kullanıcı onboarding sürecinde abone olmadıysa, uygulama içinde bir flow veya paywall placement'ı oluşturabilirsiniz. Bu, uygulama ayarlarında ya da kullanıcı belirli bir hedef eylemi tamamladıktan sonra gösterilebilir. Uygulama içindeki kullanıcılar abone olmayı genellikle daha uzun düşündüğünden, buradaki ürünler onboarding aşamasındakilere kıyasla biraz daha uygun fiyatlı olabilir.
3. **Promo:** Kullanıcı flow veya paywall'ı birden fazla kez gördükten sonra hâlâ abone olmadıysa, bu fiyatların onlar için çok yüksek olduğuna ya da aboneliklere karşı kararsız kaldıklarına işaret edebilir. Bu durumda, en uygun fiyatlı aboneliği ya da hatta süresiz erişim ürününü içeren özel bir teklif sunabilirsiniz. Bu yaklaşım, fiyata duyarlı veya abonelik konusunda şüpheci kullanıcıları satın almaya teşvik etmeye yardımcı olabilir.
Çoğu uygulama, kullanıcı yolculuğunu ve dönüşüm ile geliri artırmak için flow'ların, paywall'ların, onboarding'lerin veya A/B testlerinin gösterilebileceği kilit noktaları takip eden benzer bir mantık ve placement'lara sahip olacaktır. Monetizasyon stratejilerinizi denemek ve optimize etmek için her placement'ı yapılandırabilirsiniz.
---
# File: create-placement
---
---
title: "Placement oluşturma"
description: "Adapty'de flow ve paywall performansını artırmak için placement'lar oluşturun ve yönetin."
---
Bir [Placement](placements), mobil uygulamanızda flow, paywall, onboarding veya A/B testi gösterebileceğiniz belirli bir konumdur. Örneğin, bir abonelik seçimi başlangıç flow'unda görünebilirken, bir consumable ürün (altın koin gibi) kullanıcının oyunda koini bittiğinde gösterilebilir.
Farklı placement'larda veya farklı kullanıcı segmentlerine — Adapty'de "kitle" olarak adlandırılır — aynı ya da farklı flow'ları, paywall'ları, onboarding'leri veya A/B testlerini gösterebilirsiniz.
Doğru placement'ı seçmeye dair ipuçları için [Anlamlı placement'lar seçin](choose-meaningful-placements) bölümünü okuyun.
:::tip
Placement'ları [Developer CLI](developer-cli-reference#adapty-placements-create) kullanarak programatik olarak da oluşturabilirsiniz.
:::
:::info
Placement oluşturma süreci flow'lar, paywall'lar ve onboarding'ler için benzer olsa da, birden fazla türe hizmet eden tek bir placement oluşturamazsınız — her placement türü farklı metrikler işler.
:::
## Placement oluşturma ve yapılandırma \{#create-and-configure-a-placement\}
1. Adapty ana menüsünden **[Placements](https://app.adapty.io/placements)** bölümüne gidin. Oluşturmak istediğiniz placement türüne göre **Flows**, **Paywalls** veya **Onboardings** sekmesine geçin.
2. **Create placement** düğmesine tıklayın.
3. Bir **Placement name** girin. Bu, Adapty Kontrol Paneli'ndeki dahili tanımlayıcıdır. Gerekirse daha sonra düzenleyebilirsiniz.
4. Bir **Placement ID** girin. Bu kimliği, placement'ın [flow'larını](adapty-flow-builder), [paywall'larını](paywalls), [onboarding'lerini](onboardings) ve [A/B testlerini](ab-tests) çağırmak için Adapty SDK'da kullanacaksınız. Her placement için benzersiz olduğundan daha sonra düzenleyemezsiniz.
Ardından, placement'a bir flow, paywall, onboarding veya A/B testi atayın. Adapty, [kitleler](audience) — [segmentlere](segments) dayalı kullanıcı gruplarını — destekler; böylece farklı kullanıcı gruplarına farklı içerik gösterebilirsiniz. Hedeflemeye ihtiyacınız yoksa varsayılan *Tüm kullanıcılar* kitlesi herkesi kapsar.
:::note
Devam etmek için, çalıştırmak istediğiniz bir flow, paywall, onboarding veya A/B testi ile belirtmek istediğiniz bir kitle oluşturduğunuzdan emin olun.
:::
1. **Placements/ Your placement** penceresinde, varsayılan *All users* kitlesi için görüntülenecek bir flow, paywall, onboarding veya A/B testi ekleyin. Bunun için **Run flow**, **Run paywall** veya **Run A/B test** düğmelerinden birine tıklayın (etiket, placement türüne göre değişir), ardından açılır listeden istediğiniz flow, paywall, onboarding veya A/B testini seçin.
2. Farklı kullanıcı gruplarına özel içerik oluşturmak için placement'ta birden fazla kitle kullanmak istiyorsanız, **Add audience** düğmesine tıklayın ve listeden istediğiniz kullanıcı segmentini seçin.
Dışa aktarılan CSV dosyası, placement'larınız hakkında aşağıdaki bilgileri içerir:
- Placement ID
- Placement adı
- Kitle adı
- Segment adı
- Placement'lar arası A/B testi adı
- A/B testi adı
- Flow adı, Paywall adı veya Onboarding adı (dışa aktardığınız sekmeye bağlı olarak)
:::note
Placement'lar arası A/B testleri, flow placement'ları için desteklenmez; bu nedenle söz konusu sütun flow dışa aktarmalarında boş görünecektir.
:::
---
# File: delete-placement
---
---
title: "Placement'ı sil"
description: "Adapty'de flow veya paywall performansınızı etkilemeden bir placement'ı nasıl sileceğinizi öğrenin."
---
[Placement](placements), mobil uygulamanızda bir flow, paywall, onboarding veya A/B testinin gösterilebildiği belirli bir konumu ifade eder.
:::danger
Herhangi bir placement'ı silme seçeneğiniz olsa da, mobil uygulamanızda aktif olarak kullanılan bir placement'ı silmemeniz kritik önem taşır. Aktif bir flow veya paywall placement'ını silmek, [kurulumu yaptıysanız](fallback-paywalls) yedek paywallın kalıcı olarak gösterilmesine yol açar ve yayınlanmış uygulama sürümlerinde artık dinamik bir flow veya paywall ile değiştirmeniz mümkün olmaz.
:::
Mevcut bir placement'ı silmek için:
1. Adapty ana menüsünden **[Placements](https://app.adapty.io/placements)** bölümüne gidin. Silmek istediğiniz placement türüne göre **Flows**, **Paywalls** veya **Onboardings** sekmesine geçin.
2. Placement'ın yanındaki **3 nokta** düğmesine tıklayın ve **Delete** seçeneğini seçin.
3. Açılan **Delete placement** penceresinde, silmek üzere olduğunuz placement'ın adını girin.
4. Silme işlemini onaylamak için **Delete forever** düğmesine tıklayın.
---
# File: add-audience-paywall-ab-test
---
---
title: "Placement'a kitle ve flow, paywall veya A/B testi ekleme"
description: "Adapty'de farklı kitle segmentleri için flow'lar ve paywall'lar üzerinde A/B testleri çalıştırın."
---
:::note
Devam etmek için, çalıştırmak istediğiniz bir flow, paywall, onboarding veya A/B testi ile belirtmek istediğiniz bir kitle oluşturduğunuzdan emin olun.
:::
1. **Placements/ Your placement** penceresinde, varsayılan *All users* kitlesi için görüntülenecek bir flow, paywall, onboarding veya A/B testi ekleyin. Bunun için **Run flow**, **Run paywall** veya **Run A/B test** düğmelerinden birine tıklayın (etiket, placement türüne göre değişir), ardından açılır listeden istediğiniz flow, paywall, onboarding veya A/B testini seçin.
2. Farklı kullanıcı gruplarına özel içerik oluşturmak için placement'ta birden fazla kitle kullanmak istiyorsanız, **Add audience** düğmesine tıklayın ve listeden istediğiniz kullanıcı segmentini seçin.
Bu noktada kitle önceliği devreye girer. Kitle önceliği sayısal bir sıralamadır; #1 en yüksek önceliği temsil eder. Hangi kitlenin önce kontrol edileceğini bu sıralama belirler. Kısaca söylemek gerekirse, kitle önceliği Adapty'nin hangi paywall, onboarding veya A/B testinin gösterileceğine karar verirken hangi kitleyi önce uygulayacağını yönetir. Bir kitlenin önceliği düşükse, o kitleye girebilecek kullanıcılar atlanabilir ve daha yüksek öncelikli başka bir kitleye yönlendirilebilir.
Crossplacement kitleleri, yani [crossplacement A/B testleri](ab-tests#ab-test-types) için oluşturulanlar, her zaman normal kitlelerden önce gelir.
"All users" kitlesinin önceliği her zaman en düşüktür; çünkü bu kitle, diğer hiçbir kitleyle eşleşmeyen herkesi kapsayan bir geri dönüş kitlessidir.
Bir placement için kitle önceliklerini ayarlamak üzere:
1. Yeni bir placement oluştururken veya mevcut birini düzenlerken **Edit priority** düğmesine tıklayın. Bu düğme yalnızca placement'a en az üç kitle eklendiğinde ("All users" ve iki başka kitle) görünür. Daha az kitle varsa sıralama zaten bellidir; "All users" kitlesinin her zaman en sona geldiği aşikardır.
2. Açılan **Edit audience priorities** penceresinde, kitleleri doğru sıraya getirmek için sürükleyip bırakın.
3. **Save** düğmesine tıklayın.
---
# File: placement-metrics
---
---
title: "Placement metrikleri"
description: "Paywall performansını artırmak için Adapty'deki placement metriklerini analiz edin."
---
Adapty ile uygulamanızda birden fazla placement oluşturabilir ve yönetebilirsiniz; her placement farklı paywall'lar veya A/B testleriyle ilişkilendirilebilir. Bu esneklik sayesinde belirli kullanıcı segmentlerini hedefleyebilir, farklı teklifler veya fiyatlandırma modelleri üzerinde deneyler yapabilir ve uygulamanızın para kazanma stratejisini optimize edebilirsiniz.
Placement'larınızın performansı ve kullanıcıların tekliflerinizle etkileşimi hakkında değerli bilgiler edinmek için Adapty, görüntülenen paywall'larla ilgili çeşitli kullanıcı etkileşimlerini ve işlemleri izler. Güçlü analitik sistemi; görüntülemeler, tekil görüntülemeler, satın almalar, denemeler, iadeler, dönüşüm oranları ve gelir gibi metrikleri yakalar.
Toplanan metrikler gerçek zamanlı olarak sürekli güncellenir ve Adapty'nin kullanıcı dostu kontrol paneli aracılığıyla kolayca erişilip analiz edilebilir. Analiz için zaman aralığını özelleştirebilir, farklı parametrelere göre filtreler uygulayabilir ve çeşitli placement'lar, kullanıcı segmentleri veya ürünler arasında metrikleri karşılaştırabilirsiniz.
Placement metrikleri, tüm placement'larınızın performansına genel bir bakış sunan placement listesinde mevcuttur. Bu üst düzey görünüm, her placement için toplu metrikler sunarak performanslarını karşılaştırmanıza ve trendleri belirlemenize olanak tanır.
Her bir placement'ın daha ayrıntılı analizini yapmak için placement ayrıntı metriklerine gidebilirsiniz. Bu sayfada, seçilen placement'a özel kapsamlı metrikler bulacaksınız. Bu metrikler, belirli bir placement'ın nasıl performans gösterdiğine dair daha derin içgörüler sunarak etkinliğini değerlendirmenizi ve veriye dayalı kararlar almanızı sağlar.
### Kurulum tarihine göre metrikleri filtrele \{#filter-metrics-by-install-date\}
Paywall, deneme süresi ve satın alma metrikleri iki farklı tarihe göre gruplandırılabilir:
- **Etkinlik tarihi** — paywall'ın görüntülendiği, deneme süresinin başladığı veya satın almanın gerçekleştiği tarih.
- **Yükleme tarihi** — kullanıcının uygulamayı ilk kez açtığı tarih.
Aynı tarih aralığı için bu iki görünüm çok farklı sayılar gösterebilir. **Filter metrics by install date** onay kutusu, kontrol panelinin hangisini kullanacağını belirler:
- **İşaretsiz (varsayılan)**: Metrikler etkinlik tarihine göre gruplandırılır.
- **İşaretli**: Metrikler yükleme tarihine göre gruplandırılır.
**Örnek.** Tarih aralığını 1–30 Nisan olarak ayarlayıp deneme sürelerine bakıyorsunuz.
- **İşaretsiz**: O kullanıcıların uygulamayı ne zaman yüklediğinden bağımsız olarak Nisan'da *başlayan* deneme sürelerini gösterir.
- **İşaretli**: Deneme sürelerinin ne zaman başladığından bağımsız olarak Nisan'da *yükleme yapan* kullanıcıların deneme sürelerini gösterir.
Belirli bir kohort için kullanıcı edinme performansını ölçmek istiyorsanız yükleme tarihi görünümünü kullanın. Belirli bir dönemdeki paywall veya onboarding etkinliğini ölçmek içinse etkinlik tarihi görünümünü tercih edin.
### Metrik kontrolleri \{#metrics-controls\}
Sistem, metrikleri seçilen zaman dilimine göre görüntüler ve dört girintili düzeye sahip sol sütun parametresine göre düzenler.
#### Metrik verileri için görünüm seçenekleri \{#view-options-for-metrics-data\}
Placement metrikleri sayfası, metrik verileri için iki görünüm seçeneği sunar: paywall tabanlı ve kitle tabanlı.
Paywall tabanlı görünümde metrikler, paywall ile ilişkili placement'lara göre gruplandırılır. Bu sayede kullanıcılar farklı placement'lara göre metrikleri analiz edebilir.
Kitle tabanlı görünümde ise metrikler, paywall'ın hedef kitlesine göre gruplandırılır. Kullanıcılar, farklı kitle segmentlerine özgü metrikleri değerlendirebilir.
#### Zaman aralıkları \{#time-ranges\}
Metrik verilerini analiz etmek için çeşitli zaman aralıkları seçebilirsiniz; günler, haftalar, aylar veya özel tarih aralıkları gibi belirli sürelere odaklanmanızı sağlar.
#### Mevcut filtreler ve gruplama \{#available-filters-and-grouping\}
:::link
Ana makale: [Analitik kontrolleri](controls-filters-grouping-compare-proceeds)
:::
Adapty, metrik analizini ihtiyaçlarınıza göre özelleştirmek ve filtrelemek için güçlü araçlar sunar. Adapty'nin metrikler sayfasında çeşitli zaman aralıklarına, gruplama seçeneklerine ve filtreleme olanaklarına erişebilirsiniz.
- ✅ Şuna göre filtrele: Kitle, paywall, paywall grubu, placement, ülke, mağaza.
- ✅ Şuna göre grupla: Segment, mağaza ve ürün
#### Tek metrik grafiği \{#single-metrics-chart\}
Placement metrik sayfasının temel bileşenlerinden biri, seçilen metrikleri görsel olarak sunan ve analizi kolaylaştıran grafik bölümüdür.
Placement metrikleri sayfasındaki grafik bölümü, seçilen metrik değerlerini görsel olarak temsil eden yatay bir çubuk grafik içerir. Grafikteki her çubuk bir metrik değerine karşılık gelir ve boyutu orantılıdır; bu da veriye tek bakışta hızlıca anlaşılmasını sağlar. Yatay çizgi analiz edilen zaman dilimini, dikey sütun ise metriklerin sayısal değerlerini gösterir. Tüm metrik değerlerinin toplamı grafiğin yanında görüntülenir.
Ayrıca grafik bölümünün sağ üst köşesindeki ok simgesine tıklamak görünümü genişletir ve seçilen metrikleri grafiğin tam satırında gösterir.
#### Toplam metrik özeti \{#total-metrics-summary\}
Tekil metrik grafiğinin yanında toplam metrik özeti bölümü yer alır. Bu bölüm, belirli bir zaman noktasında seçilen metriklerin kümülatif değerlerini gösterir ve açılır menü aracılığıyla görüntülenen metriği değiştirmenize olanak tanır.
### Metrik tanımları \{#metrics-definitions\}
Kapsamlı tanımlarımızla placement metriklerinin gücünü keşfedin. Gelirden dönüşüm oranlarına kadar, para kazanma stratejilerinizi güçlendirecek ve uygulamanızın başarısını artıracak değerli içgörüler edinin.
:::note
Adapty, diğer para birimlerini [currencylayer.com](https://currencylayer.com/) döviz kuru üzerinden USD'ye çevirir (her 8 saatte bir güncellenir). Kur, **işlem anında sabitlenir** — sonraki değişiklikler dönüşüm sonucunu etkilemez.
:::
#### Gelir \{#revenue\}
Bu metrik, belirli placement'lar içindeki satın almalar ve yenilemelerden USD cinsinden elde edilen toplam para miktarını temsil eder. Gelir hesaplamasının Apple App Store veya Google Play Store komisyonunu içermediğini ve herhangi bir ücret düşülmeden önce hesaplandığını lütfen göz önünde bulundurun.
#### Hasılat \{#proceeds\}
Bu metrik, belirli placement'lar içindeki satın almalar ve yenilemelerden geçerli Apple App Store veya Google Play Store komisyonu düşüldükten sonra uygulama sahibinin USD cinsinden elde ettiği gerçek para miktarını temsil eder. Uygulamanın kazancına doğrudan katkıda bulunan net geliri yansıtır. Hasılatın nasıl hesaplandığına dair daha fazla bilgi için Adapty [dokümantasyonuna](analytics-cohorts#revenue-vs-proceeds) başvurabilirsiniz.
#### ARPPU \{#arppu\}
ARPPU, ödeme yapan kullanıcı başına ortalama gelir anlamına gelir ve belirli placement'lar içinde ödeme yapan kullanıcı başına üretilen ortalama geliri ölçer. Toplam gelirin benzersiz ödeme yapan kullanıcı sayısına bölünmesiyle hesaplanır. Örneğin toplam gelir 15.000 $ ve 1.000 ödeme yapan kullanıcı varsa ARPPU 15 $ olur.
#### ARPAS \{#arpas\}
ARPAS (aktif abone başına ortalama gelir), belirli placement'lar içinde aktif abone başına üretilen ortalama geliri ölçmenizi sağlar. Toplam gelirin deneme veya abonelik başlatan abone sayısına bölünmesiyle hesaplanır. Örneğin toplam gelir 5.000 $ ve 1.000 abone varsa ARPAS 5 $ olur. Bu metrik, abone başına ortalama para kazanma potansiyelini değerlendirmeye yardımcı olur.
#### ARPU \{#arpu\}
Yalnızca onboarding placement'ları için. ARPU, onboarding'i görüntüleyen kullanıcı başına ortalama gelirdir. Toplam gelirin benzersiz görüntüleyici sayısına bölünmesiyle hesaplanır.
#### Satın almalara tekil dönüşüm oranı \{#unique-cr-to-purchases\}
Satın almalara tekil dönüşüm oranı, belirli placement'lar içindeki satın alma sayısının benzersiz görüntüleme sayısına bölünmesiyle hesaplanır. Satın almaların benzersiz görüntüleme sayısına oranına odaklanarak, belirli placement'lar içindeki tekil ziyaretçileri ödeme yapan müşterilere dönüştürme etkinliğine dair içgörüler sunar.
#### Satın almalara dönüşüm oranı \{#cr-to-purchases\}
Satın almalara dönüşüm oranı, belirli placement'lar içindeki satın alma sayısının paywall'ların toplam görüntüleme sayısına bölünmesiyle hesaplanır. Belirli placement'lar içindeki görüntülemelerin yüzde kaçının satın almayla sonuçlandığını gösterir ve paywall'ınızın kullanıcıları ödeme yapan müşterilere dönüştürme etkinliğine dair içgörüler sunar.
#### Denemelere tekil dönüşüm oranı \{#unique-cr-to-trials\}
Denemelere tekil dönüşüm oranı, belirli placement'lar içinde başlatılan deneme sayısının benzersiz görüntüleme sayısına bölünmesiyle hesaplanır. Belirli placement'lar içindeki benzersiz görüntülemelerin yüzde kaçının deneme aktivasyonuyla sonuçlandığını ölçer ve paywall'ınızın tekil ziyaretçileri deneme kullanıcılarına dönüştürme etkinliğine dair içgörüler sunar.
#### Satın almalar \{#purchases\}
Satın almalar, belirli placement'lar içindeki paywall'da gerçekleştirilen çeşitli işlemlerin kümülatif toplamını temsil eder. Bu metriğe dahil olan işlemler şunlardır (yenilemeler dahil değildir):
- Belirli placement'lar içinde doğrudan yapılan yeni satın almalar.
- Başlangıçta belirli placement'lar içinde başlatılan deneme dönüşümleri.
- Belirli placement'lar içinde yapılan abonelik düşürme, yükseltme ve çapraz geçişler.
- Belirli placement'lar içindeki abonelik geri yüklemeleri; örneğin otomatik yenileme olmaksızın süresi dolan bir aboneliğin yeniden etkinleştirilmesi.
Bu farklı işlem türlerini dikkate alarak satın almalar metriği, belirli placement'lar içindeki genel edinim ve para kazanma faaliyetine kapsamlı bir bakış sunar.
#### Denemeler \{#trials\}
Denemeler metriği, belirli placement'lar içinde başlatılan toplam deneme sayısını temsil eder. Kullanıcıların bu placement'lardaki paywall'ınız aracılığıyla deneme süresi başlattıklarının sayısını gösterir. Bu metrik, deneme teklifinizin etkinliğini izlemenize ve denemeden ücretli aboneliklere kullanıcı etkileşimi ile dönüşüm hakkında içgörüler elde etmenize yardımcı olur.
#### İptal edilen denemeler \{#trials-canceled\}
İptal edilen denemeler metriği, belirli placement'lar içinde otomatik yenileme özelliğinin kapatıldığı deneme sayısını temsil eder. Bu durum, kullanıcıların denemeden manuel olarak aboneliğini iptal etmesiyle gerçekleşir ve deneme süresi sonrasında aboneliğe devam etmeyeceklerini gösterir. İptal edilen denemeleri izlemek, kullanıcı davranışı hakkında değerli bilgiler sağlar ve belirli placement'lar içinde kullanıcıların denemeden ayrılma oranını anlamanıza olanak tanır.
#### İadeler \{#refunds\}
İadeler metriği, belirli placement'lar içinde iade edilen satın alma ve abonelik sayısını temsil eder. Buna müşteri talepleri, ödeme sorunları veya geçerli iade politikaları gibi çeşitli nedenlerle iptal edilen ya da iade edilen işlemler dahildir.
#### İade oranı \{#refund-rate\}
İade oranı, belirli placement'lar içindeki iade sayısının ilk kez yapılan satın alma sayısına bölünmesiyle hesaplanır (yenilemeler dahil değildir). Örneğin 5 iade ve 1.000 ilk kez yapılan satın alma varsa iade oranı %0,5 olur.
#### Görüntülemeler \{#views\}
Görüntülemeler metriği, belirli placement'lar içindeki paywall'ın kullanıcılar tarafından kaç kez görüntülendiğinin toplam sayısını temsil eder. Bir kullanıcı belirli placement'lardaki paywall'ı her ziyaret ettiğinde bu ayrı bir görüntüleme olarak sayılır. Görüntülemeleri izlemek, paywall'ınızla kullanıcı etkileşiminin ve katılım düzeyinin anlaşılmasına yardımcı olur; kullanıcı davranışı ve uygulamanızın belirli alanlarındaki paywall yerleşimi ile tasarımının etkinliğine dair içgörüler sunar.
#### Tekil görüntülemeler \{#unique-views\}
Tekil görüntülemeler metriği, belirli placement'lar içindeki paywall'ın kullanıcılar tarafından görüntülendiği benzersiz örnek sayısını temsil eder. Her ziyareti ayrı bir görüntüleme olarak sayan toplam görüntülemelerin aksine, tekil görüntülemeler her kullanıcının belirli placement'lardaki paywall'ı ziyaretini kaç kez eriştiğinden bağımsız olarak yalnızca bir kez sayar. Tekil görüntülemeleri izlemek, belirli placement'lar içinde kullanıcı etkileşiminin ve paywall'ınızın erişiminin daha doğru ölçülmesine yardımcı olur; zira toplam ziyaret sayısı yerine bireysel kullanıcılara odaklanır.
#### Tamamlamalar ve tekil tamamlamalar \{#completions--unique-completions\}
Yalnızca onboarding placement'ları için. Tamamlamalar, kullanıcıların onboarding placement'ınızı ilk ekrandan son ekrana kadar tamamladıkları sayısını sayar. Birisi iki kez tamamlarsa bu iki **tamamlama** ama bir **tekil tamamlama** sayılır.
#### Tekil tamamlama oranı \{#unique-completions-rate\}
Yalnızca onboarding placement'ları için. Tekil tamamlama sayısının tekil görüntüleme sayısına bölümüdür. Bu metrik, insanların onboarding placement'ıyla nasıl etkileşim kurduğunu anlamanıza ve onu görmezden geldiklerini fark ettiğinizde değişiklikler yapmanıza yardımcı olur.
---
# File: create-paywall
---
---
title: "Paywall oluşturma"
description: "Adapty'nin Paywall Builder'ı ile yüksek dönüşüm sağlayan paywalllar nasıl oluşturulur, öğrenin."
---
[Paywall](paywalls), hangi ürünlerin sunulacağını tanımlayan bir Adapty yapılandırmasıdır. Adapty'de ürünleri uygulamanızda almanın tek yolu paywalllar üzerinden geçer.
Paywallı nasıl gösterdiğinizden bağımsız olarak bir paywall oluşturmanız gerekir:
- [**Paywall Builder**](adapty-paywall-builder): No-code editörde bir ekran tasarlayın. Adapty bunu render eder ve satın almaları yönetir.
- **Özel paywall**: Kendi arayüzünüzü uygulayın ve ürünleri almak için paywall yapılandırmasını kullanın.
Oluşturduğunuz paywall'ı bir [placement](placements)'a atayın; placement'lar hangi kullanıcının hangi paywall'ı göreceğini belirler. Yayındaki bir paywall'ın ürünleri sabit olduğundan, metrikleri her zaman aynı kombinasyonu yansıtır ve farklı ürün ile fiyatlandırma setlerinin performansını karşılaştırmanıza olanak tanır.
:::tip
Ayrıca [Developer CLI](developer-cli-reference#adapty-paywalls-create) kullanarak paywallları programatik olarak da oluşturabilirsiniz.
:::
## Sonraki adımlar \{#next-steps\}
İlk paywall'ınızı oluşturduktan sonra:
1. Bir [placement](placements)'a ekleyin. Placement ID'leri kod içine gömülü tek varlıklar olacaktır. Satılacak ürünleri almak için bunları kullanacaksınız.
2. Paywall ile bundan sonra nasıl çalışacağınız uygulamanıza bağlıdır:
- [Adapty Paywall Builder](adapty-paywall-builder)'ı kullanmak istiyorsanız paywall'ı no-code editörde tasarlayın. Adapty, paywall'ı render eder ve satın alma mantığını yönetir; sizin yapmanız gereken tek şey paywall'ı uygulama kodunuzda göstermektir.
- Kullanmak istediğiniz özel bir paywall varsa platformunuz için Adapty ile uygulama içi satın alma rehberlerimize bakın:
- [iOS](ios-implement-paywalls-manually)
- [Android](android-implement-paywalls-manually)
- [React Native](react-native-implement-paywalls-manually)
- [Flutter](flutter-implement-paywalls-manually)
- [Unity](unity-implement-paywalls-manually)
- [Kotlin Multiplatform](kmp-implement-paywalls-manually)
---
# File: customize-paywall-with-remote-config
---
---
title: "Paywall'ı remote config ile tasarla"
description: "Adapty'de daha iyi hedefleme için remote config ile paywall'ınızı özelleştirin."
---
:::important
Bu kılavuz, klasik paywall'lar için remote config'i kapsamaktadır. Flow Builder için [Flow'u remote config ile özelleştirme](customize-flow-with-remote-config) bölümüne bakın.
:::
Paywall Remote Config, esnek yapılandırma seçenekleri sunan güçlü bir araçtır. Paywall'larınızı tam anlamıyla özelleştirmek için özel JSON payload'larının kullanımına olanak tanır. Bununla başlıklar, görseller, yazı tipleri, renkler ve daha fazlası gibi çeşitli parametreler tanımlayabilirsiniz.
3. **Remote config** sekmesine geçin.
Remote config'in 2 görünümü vardır:
- [Tablo](customize-paywall-with-remote-config#table-view-of-the-remote-config)
- [JSON](customize-paywall-with-remote-config#json-view-of-the-remote-config)
Hem **Table** hem de **JSON** görünümleri aynı yapılandırma öğelerini içerir. Aradaki tek fark kişisel tercihtir; tek işlevsel ayrım, tablo görünümünün lokalizasyon hatalarını düzeltmede işe yarayabilecek bir bağlam menüsü sunmasıdır.
Görünümler arasında geçiş yapmak için istediğiniz zaman **Table** veya **JSON** sekmesine tıklayabilirsiniz.
Paywallınızı özelleştirmek için hangi görünümü seçmiş olursanız olun, bu verilere daha sonra `AdaptyPaywall`'ın `remoteConfig` veya `remoteConfigString` özelliklerini kullanarak SDK üzerinden erişebilir ve paywallınızda bazı ayarlamalar yapabilirsiniz. Ayrıca [sunucu tarafı API](api-adapty/operations/updatePaywall)'sini kullanarak remote config değerlerini programatik olarak güncelleyebilir ve manuel kontrol paneli güncellemelerine gerek kalmadan paywall yapılandırmalarını dinamik olarak değiştirebilirsiniz. Remote config'i nasıl kullanabileceğinize dair bazı örnekler aşağıda verilmiştir.
### Remote config'in tablo görünümü \{#table-view-of-the-remote-config\}
Kodla çalışmak alışkın olmadığınız bir şeyse ve JSON'daki bazı değerleri düzenlemeniz gerekiyorsa, Adapty'nin **Table** görünümü tam size göre.
JSON'unuzun okunması ve anlaşılması kolay bir tablo formatındaki kopyasıdır. Renk kodlaması, farklı veri türlerini tanımayı kolaylaştırır.
Bir anahtar eklemek için **Add row** düğmesine tıklayın. Değerleri ve tür eşleşmelerini otomatik olarak kontrol eder; düzeltmeleriniz geçersiz bir JSON'a yol açabilecekse sizi uyarırız.
Ek satır seçenekleri genellikle [paywall yerelleştirmeleri](add-remote-config-locale) için kullanışlıdır:
Şimdi [bir placement oluşturma](create-placement) ve paywall'ı ona ekleme zamanı. Bunun ardından, mobil uygulamanızda
4. **Locales** seçeneğine tıklayın ve desteklemek istediğiniz dilleri seçin. Bu lokalleri paywalla eklemek için değişikliklerinizi kaydedin.
Artık içeriği manuel olarak çevirebilir, yapay zeka kullanabilir ya da harici çevirmenler için yerelleştirme dosyasını dışa aktarabilirsiniz.
## Paywallları yapay zeka ile çevirme \{#translate-paywalls-with-ai\}
Yapay zeka destekli çeviri, paywallınızı yerelleştirmenin hızlı ve etkili bir yoludur.
Hem **String** hem de **List** değerlerini çevirebilirsiniz. Varsayılan olarak tüm satırlar seçilidir (mor renkte gösterilir). Zaten çevrilmiş satırlar yeşil renkte işaretlenir ve varsayılan olarak yeni çeviriye dahil edilmez. Seçilmemiş veya çevrilmemiş satırlar gri görünür.
1. Çevrilecek satırları seçin. Yapay zekanın bunları çevirmesini önlemek için ID'leri, URL'leri ve değişkenleri içeren satırların seçimini kaldırmanız önerilir.
2. Çeviri yapılacak dilleri seçin.
3. Çevirileri uygulamak için **AI Translate** seçeneğine tıklayın. Seçilen satırlar çevrilecek ve paywalla eklenecek; çevrilen satırlar yeşil olarak işaretlenecektir.
## Harici çeviri için yerelleştirme dosyalarını dışa aktarma \{#exporting-localization-files-for-external-translation\}
Yapay zeka destekli yerelleştirme giderek yaygınlaşsa da güçlü bir geçmiş performansa sahip profesyonel insan çevirmenler veya bir çeviri ajansı gibi daha güvenilir yöntemleri tercih edebilirsiniz. Böyle bir durumda yerelleştirme dosyalarını dışa aktarıp çevirmenlerinizle paylaşabilir, ardından çevrilmiş dosyaları Adapty'ye geri aktarabilirsiniz.
**Export** düğmesiyle dışa aktarma işlemi, her dil için ayrı `.json` dosyaları oluşturur ve bunları tek bir arşivde paketler. Yalnızca tek bir dosyaya ihtiyacınız varsa, bunu dil bazlı menüden doğrudan dışa aktarabilirsiniz.
Çevrilmiş dosyaları aldıktan sonra, hepsini aynı anda veya tek tek yüklemek için **Import** düğmesini kullanın. Adapty, dosyaların doğru formata uygun olduğundan emin olmak için otomatik olarak doğrulama yapacaktır.
### İçe aktarma dosyası formatı \{#import-file-format\}
Başarılı bir içe aktarma için dosyanın şu gereksinimleri karşılaması gerekir:
- **Dosya Adı ve Uzantısı:**
Dosya adı temsil ettiği lokalle eşleşmeli ve `.json` uzantısına sahip olmalıdır. Lokal adını Adapty Kontrol Panelinde doğrulayabilir ve kopyalayabilirsiniz. Ad tanınmazsa içe aktarma başarısız olur.
- **Geçerli JSON:**
Dosya geçerli bir JSON olmalıdır. Değilse içe aktarma başarısız olur.
## Manuel yerelleştirme \{#manual-localization\}
Bazen çevirileri ince ayar yapmak, belirli lokaller için farklı görseller eklemek veya remote config'i doğrudan düzenlemek isteyebilirsiniz.
1. Çevirmek istediğiniz öğeyi seçin ve yeni bir değer girin. Hem **String** hem de **List** değerlerini güncelleyebilir ya da görselleri lokale daha uygun olanlarla değiştirebilirsiniz.
2. Yerelleştirme sorunlarını verimli biçimde çözmek için İngilizce lokalindeki bağlam menüsünden yararlanın:
- **Copy this value to all locales**: Seçilen satır için İngilizce dışındaki lokallerde yapılmış tüm değişikliklerin üzerine yazar ve İngilizce lokalindeki değerle değiştirir.
- **Revert all row changes to original values**: Mevcut oturumda yapılan tüm değişiklikleri iptal eder ve değerleri son kaydedilen durumuna geri yükler.
Paywalla lokaller ekledikten sonra, uygulama kodunuzda lokal kodlarını doğru şekilde kullandığınızdan emin olun. Bkz.
3. ⚠️ Stripe seçerseniz, arayüzde **Sandbox** yazmasına rağmen **Test Mode** ortamına ait anahtarları kullandığınızdan emin olun. Aksi takdirde web paywallınız çalışmaz. Stripe'taki **Sandbox**'lar henüz desteklenmemektedir.
### Apple Pay alan adı doğrulamasını kurma \{#set-up-apple-pay-domain-verification\}
**Settings > Domains** bölümünde alan adı doğrulaması için kullanmak istediğiniz birincil ödeme sağlayıcısını seçin. Ardından paywall alan adlarınızı ilgili sağlayıcıda doğrulayın:
**Stripe**:
1. [Ödeme yöntemi alan adı ayarları](https://dashboard.stripe.com/settings/payment_method_domains) sayfasına gidin ve **Add a new domain** butonuna tıklayın.
2. `app.funnelfox.com` ile kişisel paywall alt alan adınızı (`paywalls-....fnlfx.com` gibi görünür) ekleyin. Alt alan adınızı bulmak için **Settings > Domains** bölümüne gidin ve **Hosted subdomain** değerini kopyalayın.
**Paddle**:
1. Paddle konsolunda **Checkout > Website approval** bölümüne gidin ve **Add a new domain** butonuna tıklayın.
2. `app.funnelfox.com` ile kişisel paywall alt alan adınızı (`paywalls-....fnlfx.com` gibi görünür) ekleyin. Alt alan adınızı bulmak için **Settings > Domains** bölümüne gidin ve **Hosted subdomain** değerini kopyalayın.
Paddle'da onay süreci manuel yürütüldüğünden, alan adlarının `Pending` durumundan `Approved` durumuna geçmesini beklemeniz gerekir.
**FunnelFox Billing**:
[FunnelFox Billing entegrasyon talimatlarını](https://funnelfox.com/docs/billing/integration-billing-funnelfox) izleyin.
**SolidGate**:
1. Solidgate Kontrol Paneli'nde **Developers > Apple Pay Domains** bölümüne gidin.
2. **+ Add new domain** butonuna tıklayın ve proje alan adınızı (FunnelFox'ta **Settings > Domains** bölümünden) yapıştırın. Varsa özel alan adınızı da ekleyin.
3. Apple Pay'i önizleme modunda kullanmak için `http://app.funnelfox.com/` adresini de ekleyin.
## Web paywall oluşturma ve yapılandırma \{#create-and-configure-a-web-paywall\}
1. Web paywall liste sayfasında **Create a paywall** butonuna tıklayın.
2. Bir paywall adı girin ve **Create** butonuna tıklayın.
3. İki abonelik seçeneği ve Apple Pay satın alma butonu içeren temel bir şablona yönlendirileceksiniz.
İlk ekranda abonelik planları listelenir. İkinci ve üçüncü ekranlar ödeme ekranlarıdır. Her ekran, sunduğunuz planlardan birine karşılık gelir. Yalnızca bir planınız varsa fazladan ekranı silin; daha fazlası varsa ödeme ekranlarını çoğaltmanız gerekir.
Başarılı bir satın almanın ardından kullanıcıların gördüğü son ekranda, uygulamalarına geri dönebileceklerini açıkça belirtmeniz gerekir.
4. Plan listesini ayarlayın: plan ve fiyat ekleyin ya da kaldırın. Ekranda gördüğünüz fiyatlar ve planlar dinamik olarak eklenmez, bu nedenle bunları manuel olarak yapılandırmanız gerekir.
5. Sahip olduğunuz her plan için bir ödeme ekranı ekleyin veya yapılandırın. Kullanıcıların satın alma butonuna tıklamadan önce ne kadar ödeyeceğini bilmesi için her ödeme ekranına toplam tutar eklemenizi öneririz.
6. Ödeme ekranlarında Apple Pay butonu zaten bulunmaktadır. Butonun çalışması için her ekranda şunları yapılandırın:
1. **Product type**: Deneme süresi mi yoksa indirim mi eklemek istediğinizi seçin.
2. **Trial period**: Deneme süresi uzunluğunu girin.
3. **Product**: Ödeme sağlayıcınızdan ürününüzü seçin.
:::important
Ürünün Adapty'ye eklendiğinden emin olun. Aksi takdirde satın alma sonucu varsayılan olarak ayarlanır.
:::
4. **Subscription discount**: İsteğe bağlı olarak ödeme sağlayıcınızdan bir kupon seçin.
7. Şimdi planları ödeme ekranlarıyla ilişkilendirmeniz gerekir. Plan seçim ekranında **Continue** butonuna tıklayın ve her plan için hedef ekranı seçin.
Paywall hazır olduğunda, Adapty'de etkinleştirmek için bağlantısını almanız gerekir. Bağlantıyı alma yöntemi, test mi yoksa canlı ortama mı geçeceğinize bağlıdır:
1. **Sandbox testi için**: Sağ üstteki **Preview** butonuna tıklayın ve bağlantıyı kopyalayın.
2. **Canlı ortam için**: Sağ üstteki **Publish** butonuna tıklayın. **Home** butonuna tıklayın ve **URL** sütunundan bağlantıyı kopyalayın.
Hepsi bu kadar! [Kuruluma devam etmek](web-paywall#step-2-trigger-the-paywall) için bu bağlantıyı kullanın.
---
# File: fallback-paywalls
---
---
title: "Yedek paywaller"
description: "Adapty'de kesintisiz kullanıcı deneyimi sağlamak için yedek paywalleri kullanın."
---
Akıcı bir kullanıcı deneyimi sağlamak için [paywallleriniz](paywalls) ve [onboardinglerinizdeki](onboardings) **yedek sürümleri** ayarlamanız önemlidir.
Uygulamanız bir paywall yüklediğinde, Adapty SDK sunucularımızdan paywall yapılandırma verilerini ister. Peki ya cihaz, ağ sorunları veya sunucu kesintileri nedeniyle Adapty'ye bağlanamıyorsa?
* Kullanıcı daha önce paywall'a eriştiyse ve cihaz verileri önbelleğe aldıysa, uygulama paywall verilerini **önbellekten** yükler.
* Cihaz paywall'ı önbelleğe almadıysa, uygulama yerel olarak depolanmış bir yapılandırma dosyası arar. Bu, uygulamanın paywall'ı hatasız görüntülemesine olanak tanır.
Adapty, indirip kullanabileceğiniz yedek yapılandırma dosyalarını otomatik olarak oluşturur. Her dosya, *tüm* placementlarınız için platforma özgü yapılandırmalar içerir.
## Başlarken \{#get-started\}
1. Adapty'den [yedek yapılandırma dosyasını indirin](/local-fallback-paywalls).
2. Yedek paywalllerinizi yapılandırmak için Adapty SDK'yı kullanın:
* [iOS](ios-use-fallback-paywalls)
* [Android](android-use-fallback-paywalls)
* [React Native](react-native-use-fallback-paywalls)
* [Flutter](flutter-use-fallback-paywalls)
* [Unity](unity-use-fallback-paywalls)
* [Kotlin Multiplatform](kmp-use-fallback-paywalls)
* [Capacitor](capacitor-use-fallback-paywalls)
## Sınırlamalar \{#limitations\}
Yedek paywaller sabit kodlanmış ve yerel olarak depolanmıştır; bu nedenle normal Adapty paywalllerinin dinamik özelliklerinden yoksundur.
* Yedek paywaller [uluslararasılaştırmayı](paywall-localization) desteklemez. Adapty yapılandırma dosyasını oluştururken varsayılan `en` yerel ayarını kullanır.
* Her placement için yalnızca bir yedek paywall olabilir. Kurulumunuz farklı [kitleler](audience) için farklı paywall yapılandırmaları içeriyorsa, Adapty "Tüm kullanıcılar" için tasarlanan yapılandırmayı kullanır.
* Yedek paywaller [A/B testini](ab-tests) desteklemez. Bir paywall A/B testine katılıyorsa, yedek yapılandırma dosyası en yüksek ağırlığa sahip varyantı içerecektir.
* Yedek paywaller [uzaktan yönetilemez](customize-paywall-with-remote-config). Yapılandırma dosyasını güncellemek istiyorsanız App Store / Google Play'de uygulamanın yeni bir sürümünü yayımlamanız gerekir.
---
# File: local-fallback-paywalls
---
---
title: "Yedek paywallları indirin"
description: "Sorunsuz abonelik akışları sağlamak için Adapty'de yerel yedek paywallları kullanın."
---
Adapty, [yedek paywalllarınız](/fallback-paywalls) için her platform başına birer tane olmak üzere otomatik olarak JSON yapılandırma dosyaları oluşturur. Bu dosyalar aynı zamanda onboardinglarınız için de yedek verileri içerir.
Tek bir placement'ta birden fazla paywall veya onboarding bulunuyorsa, yedek sürüm en yüksek ağırlığa ya da en geniş kitleye sahip varyantı içerecektir. Adapty, paywalllarınızı veya onboardinglarınızı her güncellediğinizde bu dosyaları da günceller.
Yedek yapılandırmalarınızı indirmek için aşağıdaki adımları izleyin:
1. **[Placements](https://app.adapty.io/placements)** sayfasını açın.
2. **Fallbacks** düğmesine tıklayın.
3. Açılır menüden hedef platformunuzu (*iOS* veya *Android*) seçin.
4. İndirmeyi başlatmak için SDK sürümünüzü seçin.
## İndirdikten sonra \{#after-the-download\}
Kullandığınız platforma ait kurulum kılavuzunu takip edin:
* [iOS](ios-use-fallback-paywalls)
* [Android](android-use-fallback-paywalls)
* [React Native](react-native-use-fallback-paywalls)
* [Flutter](flutter-use-fallback-paywalls)
* [Unity](unity-use-fallback-paywalls)
* [Kotlin Multiplatform](kmp-use-fallback-paywalls)
* [Capacitor](capacitor-use-fallback-paywalls)
---
# File: paywall-metrics
---
---
title: "Paywall metrikleri"
description: "Abonelik gelirini artırmak için paywall performans metriklerini takip edin ve analiz edin."
---
Adapty, paywall'larınızın performansını daha iyi ölçmenize yardımcı olmak için bir dizi metrik toplar. Görüntüleme sayısı birkaç dakikada bir güncellenirken, diğer tüm metrikler gerçek zamanlı olarak güncellenir. Görüntüleme sayısı dışındaki tüm metrikler, paywall içindeki ürüne atfedilir. Bu belge, mevcut metrikleri, tanımlarını ve nasıl hesaplandıklarını açıklamaktadır.
Paywall metrikleri, paywall listesinde görüntülenerek tüm paywalllarınızın performansına genel bir bakış sunar. Bu birleşik görünüm, her paywall için toplanmış metrikleri bir arada gösterir; böylece etkinliklerini değerlendirip iyileştirme alanlarını kolayca belirleyebilirsiniz.
Her paywall'ı daha ayrıntılı analiz etmek için paywall detay metriklerine gidebilirsiniz. Bu bölümde, seçilen paywalla özgü kapsamlı metrikler yer alır ve performansı hakkında daha derin içgörüler sunar.
### Metrikleri kurulum tarihine göre filtrele \{#filter-metrics-by-install-date\}
Paywall, deneme süresi ve satın alma metrikleri iki farklı tarihe göre gruplandırılabilir:
- **Etkinlik tarihi** — paywall'ın görüntülendiği, deneme süresinin başladığı veya satın almanın gerçekleştiği tarih.
- **Yükleme tarihi** — kullanıcının uygulamayı ilk kez açtığı tarih.
Aynı tarih aralığı için bu iki görünüm çok farklı sayılar gösterebilir. **Filter metrics by install date** onay kutusu, kontrol panelinin hangisini kullanacağını belirler:
- **İşaretsiz (varsayılan)**: Metrikler etkinlik tarihine göre gruplandırılır.
- **İşaretli**: Metrikler yükleme tarihine göre gruplandırılır.
**Örnek.** Tarih aralığını 1–30 Nisan olarak ayarlayıp deneme sürelerine bakıyorsunuz.
- **İşaretsiz**: O kullanıcıların uygulamayı ne zaman yüklediğinden bağımsız olarak Nisan'da *başlayan* deneme sürelerini gösterir.
- **İşaretli**: Deneme sürelerinin ne zaman başladığından bağımsız olarak Nisan'da *yükleme yapan* kullanıcıların deneme sürelerini gösterir.
Belirli bir kohort için kullanıcı edinme performansını ölçmek istiyorsanız yükleme tarihi görünümünü kullanın. Belirli bir dönemdeki paywall veya onboarding etkinliğini ölçmek içinse etkinlik tarihi görünümünü tercih edin.
### Metrik kontrolleri \{#metrics-controls\}
Sistem, metrikleri seçilen zaman dilimine göre gösterir ve üç düzeyli girinti kullanarak sol sütundaki parametreye göre düzenler.
Aktif paywall'lar için metrikler, paywall'ın başlangıç tarihinden günümüze kadar olan dönemi kapsar. Aktif olmayan paywall'lar için ise metrikler, başlangıç tarihinden seçilen zaman diliminin sonuna kadar olan tüm dönemi kapsar. Taslak ve arşivlenmiş paywall'lar metrik tablosuna dahil edilir; ancak bu paywall'lara ait veri yoksa yalnızca listelenir, herhangi bir metrik gösterilmez.
#### Metrik verileri için görüntüleme seçenekleri \{#view-options-for-metrics-data\}
Paywall sayfası, metrik verileri için iki görüntüleme seçeneği sunar: placement bazlı ve kitle bazlı.
Placement bazlı görünümde, metrikler paywall ile ilişkili placement'lara göre gruplandırılır. Bu sayede kullanıcılar, metrikleri farklı placement'lara göre analiz edebilir.
Kitle tabanlı görünümde metrikler, paywall'ın hedef kitlesine göre gruplandırılır. Kullanıcılar, farklı kitle segmentlerine özgü metrikleri inceleyebilir. Paywall detay sayfasının üst kısmındaki açılır menüden tercih ettiğiniz görünümü seçebilirsiniz.
#### Zaman aralıkları \{#time-ranges\}
Metrik verilerini analiz etmek için çeşitli zaman dilimleri arasından seçim yapabilirsiniz; böylece günler, haftalar, aylar veya özel tarih aralıkları gibi belirli sürelere odaklanabilirsiniz.
#### Mevcut filtreler ve gruplama \{#available-filters-and-grouping\}
:::link
Ana makale: [Analitik kontrolleri](controls-filters-grouping-compare-proceeds)
:::
Adapty, metrik analizini ihtiyaçlarınıza göre filtrelemenizi ve özelleştirmenizi sağlayan güçlü araçlar sunar. Adapty'nin metrik sayfasıyla çeşitli zaman aralıklarına, gruplama seçeneklerine ve filtreleme olanaklarına erişebilirsiniz.
- Filtrele: Kitle, ülke, paywall, paywall durumu, paywall grubu, placement, ülke, mağaza, ürün ve ürün mağazasına göre.
- Grupla: Ürün ve mağazaya göre.
#### Tekil metrik grafiği \{#single-metrics-chart\}
Paywall metrik sayfasının temel bileşenlerinden biri, seçilen metrikleri görsel olarak sunan ve analizi kolaylaştıran grafik bölümüdür.
Paywall metrik sayfasındaki grafik bölümü, seçilen metrik değerlerini görsel olarak temsil eden yatay bir çubuk grafik içerir. Grafikteki her çubuk bir metrik değerine karşılık gelir ve boyutu orantılı olduğundan verileri bir bakışta anlamak kolaylaşır. Yatay çizgi analiz edilen zaman dilimini, dikey sütun ise metriklerin sayısal değerlerini gösterir. Tüm metrik değerlerinin toplamı grafiğin yanında görüntülenir.
Ayrıca, grafik bölümünün sağ üst köşesindeki ok simgesine tıklandığında görünüm genişler ve seçilen metrikler grafiğin tamamında gösterilir.
#### Toplam metrik özeti \{#total-metrics-summary\}
Tekli metrik grafiğinin yanında, toplam metrik özeti bölümü yer alır. Bu bölüm, seçilen metriklerin belirli bir zaman noktasındaki kümülatif değerlerini gösterir; açılır menü aracılığıyla görüntülenen metriği değiştirebilirsiniz.
### Metrik Tanımları \{#metrics-definitions\}
:::note
Adapty, diğer para birimlerini [currencylayer.com](https://currencylayer.com/) döviz kuru üzerinden USD'ye çevirir (her 8 saatte bir güncellenir). Kur, **işlem anında sabitlenir** — sonraki değişiklikler dönüşüm sonucunu etkilemez.
:::
#### Gelir \{#revenue\}
Bu metrik, satın almalar ve yenilemelerden USD cinsinden elde edilen toplam para miktarını gösterir. Gelir hesaplamasının App Store / Play Store komisyonunu içermediğini ve herhangi bir ücret düşülmeden önce hesaplandığını lütfen unutmayın.
#### Kazanç \{#proceeds\}
Bu metrik, uygulanabilir App Store / Play Store komisyonu düşüldükten sonra uygulama sahibinin satın almalar ve yenilemelerden USD cinsinden aldığı gerçek para miktarını gösterir.
:::important
Uygulamanız indirimli komisyon programına kayıtlıysa Adapty'yi bilgilendirin. Doğru hesaplamalar için [Small Business Program](app-store-small-business-program) ve [Reduced Service Fee program](google-reduced-service-fee) durumunuzu [uygulama ayarlarınızda](general) belirtin.
:::
Uygulamanın kazancına doğrudan katkıda bulunan net geliri yansıtır. Gelirlerin nasıl hesaplandığı hakkında daha fazla bilgi için Adapty [belgelerine](analytics-cohorts#revenue-vs-proceeds) başvurabilirsiniz.
#### ARPPU \{#arppu\}
ARPPU, ödeme yapan kullanıcı başına ortalama gelir demektir. Toplam gelirin benzersiz ödeme yapan kullanıcı sayısına bölünmesiyle hesaplanır. 15.000 $ gelir / 1.000 ödeme yapan kullanıcı = 15 $ ARPPU.
#### ARPAS \{#arpas\}
Aktif abone başına ortalama gelir (ARPAS), her aktif abone için üretilen ortalama geliri ölçmenizi sağlar. Toplam gelirin, deneme sürümü veya abonelik başlatan abone sayısına bölünmesiyle hesaplanır. Örneğin toplam gelir 5.000 $ ve 1.000 abone varsa ARPAS 5 $ olur. Bu metrik, abone başına ortalama para kazanma potansiyelini değerlendirmeye yardımcı olur.
#### Satın almalara göre benzersiz dönüşüm oranı (CR) \{#unique-conversion-rate-cr-to-purchases\}
Satın almalara göre benzersiz dönüşüm oranı, satın alma sayısının benzersiz görüntülenme sayısına bölünmesiyle hesaplanır. Örneğin, 10 satın alma ve 100 benzersiz görüntülenme varsa, satın almalara göre benzersiz dönüşüm oranı %10 olur. Bu metrik, satın almaların benzersiz görüntülenme sayısına oranına odaklanarak benzersiz ziyaretçileri ödeme yapan müşterilere dönüştürmedeki etkinliğe dair bilgiler sunar.
#### Satın almalara göre CR \{#cr-to-purchases\}
Satın alımlara dönüşüm oranı, satın alım sayısının toplam görüntüleme sayısına bölünmesiyle hesaplanır. Örneğin, 10 satın alım ve 100 görüntüleme varsa satın alımlara dönüşüm oranı %10 olur. Bu metrik, görüntülemelerin yüzde kaçının satın alımla sonuçlandığını gösterir ve paywall'ınızın kullanıcıları ödeme yapan müşterilere dönüştürme etkinliği hakkında içgörü sunar.
#### Deneme sürümlerine benzersiz CR \{#unique-cr-to-trials\}
Deneme sürümlerine benzersiz dönüşüm oranı, başlatılan deneme sayısının benzersiz görüntüleme sayısına bölünmesiyle hesaplanır. Örneğin, 30 deneme başlatma ve 100 benzersiz görüntüleme varsa deneme sürümlerine benzersiz dönüşüm oranı %30 olur. Bu metrik, benzersiz görüntülemelerin yüzde kaçının deneme aktivasyonuyla sonuçlandığını ölçer ve paywall'ınızın benzersiz ziyaretçileri deneme kullanıcılarına dönüştürme etkinliği hakkında içgörü sunar.
#### Satın alımlar \{#purchases\}
Satın alımlar, paywall üzerinde gerçekleştirilen çeşitli işlemlerin kümülatif toplamını temsil eder. Bu metriğe aşağıdaki işlemler dahildir (yenilemeler dahil değildir):
- Doğrudan paywall üzerinde yapılan yeni satın alımlar.
- Başlangıçta paywall üzerinde başlatılan denemelerin aboneliğe dönüşümleri.
- Paywall üzerinde yapılan abonelik düşürme, yükseltme ve çapraz geçişler.
- Otomatik yenileme olmadan sona ermenin ardından aboneliğin yeniden başlatılması gibi paywall üzerindeki abonelik geri yüklemeleri.
Bu farklı işlem türlerini göz önünde bulundurarak satın alımlar metriği, paywall'ınızdaki genel edinim ve monetizasyon faaliyetlerine kapsamlı bir bakış sunar.
#### Denemeler \{#trials\}
Denemeler metriği, aktive edilen toplam deneme sayısını temsil eder. Paywall'ınız aracılığıyla deneme süresi başlatan kullanıcı sayısını yansıtır. Bu metrik, deneme teklifinizin etkinliğini takip etmeye yardımcı olur ve kullanıcı etkileşimi ile denemelerden ücretli aboneliklere dönüşüm hakkında içgörü sağlayabilir.
#### İptal edilen denemeler \{#trials-canceled\}
İptal edilen denemeler metriği, otomatik yenileme özelliğinin kapatıldığı deneme sayısını temsil eder. Bu durum, kullanıcıların denemeden manuel olarak çıkış yapmasıyla gerçekleşir ve deneme süresi sona erdikten sonra aboneliğe devam etmeme kararını gösterir. İptal edilen denemelerin takibi, kullanıcı davranışı hakkında değerli bilgiler sağlar ve kullanıcıların denemeden çıkış oranını anlamanıza olanak tanır.
#### İadeler \{#refunds\}
İadeler metriği, iade edilen satın alma ve aboneliklerin sayısını temsil eder. Bu; müşteri talepleri, ödeme sorunları veya geçerli iade politikaları gibi çeşitli nedenlerle geri alınan ya da iade edilen işlemleri kapsar.
#### İade oranı \{#refund-rate\}
İade oranı, iade sayısının ilk kez yapılan satın alma sayısına bölünmesiyle hesaplanır (yenilemeler dahil değildir). Örneğin, 5 iade ve 1000 ilk kez yapılan satın alma varsa, iade oranı %0,5 olur.
#### Görüntülemeler \{#views\}
Görüntülemeler metriği, paywall'ın kullanıcılar tarafından toplam kaç kez görüntülendiğini temsil eder. Bir kullanıcı paywall'ı her ziyaret ettiğinde ayrı bir görüntüleme olarak sayılır. Örneğin, bir kullanıcı paywall'ı iki kez ziyaret ederse bu iki görüntüleme olarak kaydedilir. Görüntülemelerin takibi, paywall'ınızdaki etkileşim ve kullanıcı etkileşimi düzeyini anlamanıza, kullanıcı davranışı ve paywall yerleşiminizin ile tasarımınızın etkinliği hakkında içgörü edinmenize yardımcı olur.
#### Benzersiz görüntülemeler \{#unique-views\}
Benzersiz görüntülemeler metriği, paywall'ın kullanıcılar tarafından kaç kez benzersiz olarak görüntülendiğini temsil eder. Her ziyareti ayrı bir görüntüleme olarak sayan toplam görüntülemelerin aksine, benzersiz görüntülemeler her kullanıcının paywall'a erişimini kaç kez gerçekleştirdiğinden bağımsız olarak yalnızca bir kez sayar. Örneğin, bir kullanıcı paywall'ı iki kez ziyaret ederse bu bir benzersiz görüntüleme olarak kaydedilir. Benzersiz görüntülemelerin takibi, toplam ziyaret sayısı yerine bireysel kullanıcılara odaklandığından kullanıcı etkileşiminin ve paywall'ınızın erişiminin daha doğru bir ölçüsünü sağlar.
:::warning
Paywall görüntülemelerini `.logShowFlow()` (iOS SDK v4+) / `.logShowPaywall()` metodunu kullanarak Adapty'ye gönderdiğinizden emin olun. Aksi takdirde, paywall görüntülemeleri metriklere yansımaz ve dönüşüm verileri anlamsız hale gelir.
:::
---
# File: migrate-paywalls
---
---
title: "Paywallları uygulamalar arasında taşıma"
description: "Adapty'de paywallları diğer uygulamalardan nasıl taşıyacağınızı öğrenin."
---
Adapty ile her uygulama için sıfırdan paywall oluşturmanıza gerek yok. Birden fazla uygulama yönetiyorsanız, builder ile oluşturulmuş herhangi bir paywall'ın Paywall Builder yapılandırmasını bir uygulamadan diğerine taşıyabilirsiniz.
Taşıma işlemi tüm görsel yapılandırmaları kopyalar:
- Paywall ve tüm paywall öğeleri için düzen ayarları
- Medya
- Yerelleştirme
Taşıma yalnızca builder yapılandırması için geçerlidir; ürünleri veya remote config'i kopyalamaz.
:::note
Özel fontlar içeren bir Paywall Builder yapılandırmasını taşırsanız, fontlar hatalı görüntülenebileceğinden bunları bir cihazda test edin.
:::
## Paywall taşıma \{#migrate-paywall\}
:::important
Yalnızca **yeni** Adapty Paywall Builder'da oluşturulan paywallları taşıyabilirsiniz. **Eski** Paywall Builder ile oluşturulan paywallları taşımak için önce bunları yeni Paywall Builder'a geçirmeniz gerekir.
:::
Bir Paywall Builder yapılandırmasını taşımak için:
1. **Yeni paywall için**: [Paywall oluşturma](create-paywall) adımlarını başlatın ve ürünleri ekleyin. Ardından şablon kitaplığını açmak için **Build no-code paywall** seçeneğine tıklayın.
**Mevcut paywall için**: **Builder & Generator** sekmesindeki **Layout settings** bölümüne gidin ve **Change template** seçeneğine tıklayın.
2. Paywall şablonunu düzenlerken **Copy a design from your apps** kutusunun içindeki **Choose paywall** seçeneğine tıklayın.
3. Yapılandırmayı kopyalamak istediğiniz uygulamayı ve paywall'ı seçin.
4. **Copy Selected Paywall** seçeneğine tıklayın.
Taşıma işleminin ardından istediğiniz düzenlemeleri yapabilirsiniz; bu değişiklikler orijinal paywall'ı etkilemez.
---
# File: duplicate-paywalls
---
---
title: "Paywall'ı kopyalama"
description: "Adapty'de kopyalanmış paywall'ları nasıl yöneteceğinizi ve paywall performansını nasıl optimize edeceğinizi öğrenin."
---
Adapty'deki mevcut bir paywall'da küçük değişiklikler yapmanız gerekiyorsa, özellikle bu paywall zaten mobil uygulamanızda kullanılıyorsa ve analizlerinizi bozmak istemiyorsanız, paywall'ı kolayca kopyalayabilirsiniz. Bu kopyaları, gerektiğinde bazı veya tüm placement'larda orijinal paywall'ların yerine kullanabilirsiniz.
Bu işlem, paywall'ın adı, ürünleri ve promosyonları gibi tüm ayrıntılarıyla birlikte bir kopyasını oluşturur. Yeni paywall'ın adına "Copy" eklenerek orijinalden kolayca ayırt edilmesi sağlanır.
Adapty kontrol panelinde bir paywall'ı kopyalamak için:
1. Adapty ana menüsünde [**Paywalls**](https://app.adapty.io/paywalls) bölümünü açın. Adapty kontrol panelindeki paywall listesi sayfası, hesabınızdaki tüm paywall'lara genel bir bakış sunar.
2. Paywall'ın yanındaki **3 nokta** düğmesine tıklayın ve **Duplicate** seçeneğini seçin.
3. Yeni paywall'ı düzenleyin ve **Save** düğmesine tıklayın.
4. Orijinal paywall herhangi bir placement'ta kullanılıyorsa Adapty, orijinal paywall'ların placement'larda kopyalarıyla değiştirilmesi için sizi yönlendirecektir. **Create and replace original** seçeneğini seçerseniz yeni paywall'lar hemen **Live** durumuna geçer. Alternatif olarak, bunları **Draft** durumunda yeni paywall'lar olarak oluşturup daha sonra placement'lara ekleyebilirsiniz.
---
# File: archive-paywalls
---
---
title: "Paywallı arşivle"
description: "Adapty'de eski paywallları veri kaybetmeden nasıl arşivleyeceğinizi öğrenin."
---
Adapty'yi kullanmaya başladıkça ve paywall ayarlarınızı ince ayarladıkça, artık mevcut stratejinize veya kampanyalarınıza uymayan paywalllar birikebilir. `Inactive` (Pasif) olarak bırakılan bu kullanılmayan paywalllar çalışma alanınızı karmaşık hale getirerek en önemli olanları bulmayı zorlaştırabilir. Bunu çözmek için Adapty, gereksiz paywallları arşivleme seçeneği sunuyor.
Arşivleme, bu paywallların kalıcı olarak silinmeden güvenli bir şekilde saklanmasını sağlar; gerektiğinde gelecekte erişilebilir olacak şekilde hazır tutulur. Ayrıca arşivlenen paywalllar varsayılan görünümden filtrelenebilir, böylece çalışma alanınız sadeleşir ve kullanıcı arayüzünüz daha anlaşılır hale gelir. Bu kılavuzda, Adapty'de paywallları verimli şekilde arşivleme adımlarını ele alacağız; böylece paywall yönetim süreciniz üzerinde daha fazla kontrol sahibi olacaksınız.
Küçük bir hatırlatma: En az bir placement'ta aktif olarak kullanılan canlı paywalllar arşivlenemez. Böyle bir paywallı arşivlemek istiyorsanız önce tüm placement'lardan kaldırmanız yeterlidir.
:::note
Arşivlenmemiş bir A/B testinde kullanılan bir paywallı arşivleyemezsiniz. Bu sayede kullanıcı, tamamlanan bir A/B testinin ayrıntılı metriklerini görüntüleyebilir ve bağlantılı paywall bu verilerin bir parçasıdır.
:::
**Bir paywallı arşivlemek için:**
1. Adapty ana menüsünde [**Paywalls**](https://app.adapty.io/paywalls) bölümünü açın.
2. Paywallın yanındaki **3-nokta** düğmesine tıklayın ve **Archive** seçeneğini seçin.
3. **Archive paywall** penceresindeyken arşivlemek istediğiniz paywallın adını yazın ve ardından **Archive** düğmesine tıklayın.
---
# File: restore-paywall
---
---
title: "Paywall'ı arşivden geri getirme"
description: "Kullanıcılara kesintisiz abonelik hizmeti sunmak için Adapty'deki paywall'ları geri yükleyin."
---
Paywall'ları arşivleyebilmek, paywall yönetim sürecinizi kolaylaştıran çok işlevli bir özelliktir. Artık ihtiyaç duyulmayan paywall'ları gizleyerek çalışma alanınızı daha düzenli tutmanızı sağlar. Üstelik arşivlenmiş paywall'ları geri yükleyebilme seçeneği, gerektiğinde bunları stratejinize yeniden dahil etme esnekliği sunar.
Arşivlenmiş paywall'lar varsayılan görünümde filtrelenmiş olabilir. Bunları görmek için **State** filtresinde **Archived** seçeneğini seçin.
**Bir paywall'ı arşivden geri getirmek için**
1. Adapty ana menüsünde [**Paywalls**](https://app.adapty.io/paywalls) bölümünü açın.
2. Arşivlenmiş paywall'ların listede görüntülendiğinden emin olun. Görüntülenmiyorsa sağ taraftaki filtreyi güncelleyin.
3. Arşivlenmiş paywall'ın yanındaki **3 nokta** düğmesine tıklayın ve **Back to active** seçeneğini seçin.
---
# File: profiles-crm
---
---
title: "Profiller/CRM"
description: "Kitle segmentasyonunu geliştirmek için Adapty'de kullanıcı profillerini ve CRM verilerini yönetin."
---
Profiller, kullanıcılarınız için bir CRM'dir. Profiller ile şunları yapabilirsiniz:
1. Profil ID, müşteri kullanıcı ID'si, e-posta veya işlem ID'si ile belirli kullanıcıları bulun.
2. Faturalama sorunları, ek süre ve diğer [olaylar](events) dahil olmak üzere kullanıcının olay zaman çizelgesini görüntüleyin.
3. Abonelik durumu, toplam gelir/kazanç ve daha fazlası gibi kullanıcı özelliklerini analiz edin.
4. Kullanıcıya abonelik verin.
:::note
Etkinlik akışındaki olaylar kontrol paneline gecikmeli olarak ulaşır. Yeni profiller ve özellik değişiklikleri hemen görünmeyebilir.
:::
:::link
Adapty'nin kullanıcı profillerini nasıl oluşturduğunu ve bağladığını anlamak için bkz. [Profiller nasıl çalışır](how-profiles-work).
:::
## Kullanıcıları bulma \{#finding-users\}
Profiller listesinde belirli bir kullanıcıyı şu yöntemlerle arayabilirsiniz:
- **Profile ID**: Adapty'nin kullanıcı için dahili tanımlayıcısı (Adapty ID olarak da bilinir).
- **Customer user ID**: Uygulamanızın kullanıcı için tanımlayıcısı (eğer ayarladıysanız).
- **Email**: Özel attribute olarak gönderildiyse kullanıcının e-posta adresi.
- **Transaction ID**: Bir satın alma işleminden elde edilen mağaza işlem kimliği.
Kullanıcının tam profilini açmak için herhangi bir satıra tıklayın.
## Abonelik durumu \{#subscription-state\}
Profiller listesinde, kullanıcıları abonelik durumuna göre filtreleyebilir ve sıralayabilirsiniz. Durum değerleri şunlardır:
| Kullanıcı **durumu** | Açıklama |
| :--------------------- | :----------------------------------------------------------- |
| Subscribed | Kullanıcının otomatik yenileme etkin şekilde aktif bir aboneliği var. |
| Auto-renew off | Kullanıcı otomatik yenilemeyi kapattı ancak abonelik süresi dolana kadar premium özelliklere erişimi devam ediyor. |
| Subscription cancelled | Kullanıcı aboneliğini iptal etti ve abonelik tamamen sona erdi. |
| Billing issue | Abonelik veya deneme süresi dolduktan sonra ödeme alınamadı. |
| Grace period | Abonelik veya deneme süresi dolduğunda ödeme alınamadığı için kullanıcı şu anda ek süre içinde. |
| Active trial | Kullanıcının şu anda deneme sürecinde olan aktif bir aboneliği var. |
| Trial cancelled | Kullanıcı deneme süresini iptal etti ve aktif bir aboneliği yok. |
| Never subscribed | Kullanıcı hiç abonelik başlatmadı veya deneme süresine girmedi; ücretsiz kullanıcı olarak kalmaya devam ediyor. |
## Kullanıcı nitelikleri \{#user-attributes\}
SDK aracılığıyla Adapty'ye ek kullanıcı özellikleri gönderebilirsiniz.
Adapty varsayılan olarak şunları ayarlar:
| Özellik | Açıklama |
| ---------------- | ------------------------------------------------------------ |
| Customer user ID | Son kullanıcınızın sisteminizdeki tanımlayıcısı. |
| Adapty ID | Son kullanıcınızın Adapty içindeki dahili tanımlayıcısı; Profile ID olarak da adlandırılır. |
| IDFA | Apple'ın bir kullanıcının cihazına atadığı Reklamverenler için Tanımlayıcı. iOS 14 ve sonrasında App Tracking Transparency (ATT) izni gerektirir. Android'de kullanılamaz. |
| Country | Son kullanıcınızın ülkesi. |
| OS | Son kullanıcının kullandığı işletim sistemi. |
| Device | Son kullanıcıya görünen cihaz model adı. |
| Install date | Kullanıcının Adapty'de ilk kez kaydedildiği tarih:
## Abonelik verme \{#granting-a-subscription\}
Bir profilde, kullanıcının satın alma yapmasına gerek kalmadan aktif bir aboneliği uzatabilir ya da kullanıcıya bir access level için süresiz erişim verebilirsiniz.
Bu özellik en çok şu durumlarda işe yarar:
- Fatura veya destek sorunu yaşayan bir kullanıcıyı tazmin etmek.
- Manuel promosyon veya beta programları yürütmek.
- Gerçek bir satın alma yapmadan abonelik flow'larını test etmek.
Erişim vermek için kullanıcının profilini açın, **Access levels** bölümüne gidin ve **Edit**'e tıklayın. Son kullanma tarihini ayarlayıp kaydedin. Son kullanma tarihi gelecekte olmalı ve bir kez ayarlandıktan sonra azaltılamaz. Aktif abonelikler için yapılan değişiklikler devam eden ödemeleri etkilemez.
:::note
Erişim vermek App Store veya Google Play satın alma olayı oluşturmaz. Kullanıcının etkinlik akışı ve analizleri gerçek bir satın alma flow'undan farklı olacaktır.
:::
Erişimi programatik olarak da verebilirsiniz; bunun için [Grant access level](api-adapty/operations/grantAccessLevel) API metodunu kullanın.
## Kullanıcı hesapları arasında ücretli erişimi paylaşma \{#sharing-paid-access-between-user-accounts\}
:::link
Ana makale: [Kullanıcı hesapları arasında ücretli erişimi paylaşma](sharing-paid-access-between-user-accounts)
:::
### Access paylaşım geçmişi \{#access-sharing-history\}
Access level'lar paylaşıldığında veya aktarıldığında, kullanıcının profili bağlı profile — erişimi paylaşan veya erişimi alan profile — bir bağlantı gösterir. Bağlı profili görüntülemek için kullanıcının **Profile** sayfasında access level'ın yanındaki bağlantıya tıklayın.
:::note
Sanal para birimi bakiyeleri, access level'lar gibi profiller arasında paylaşılmaz veya aktarılmaz. Her bakiye tek bir profilde kalır — bkz. [Bakiyeler, profiller ve cihazlar](virtual-currency-balance#balances-profiles-and-devices).
:::
## Sonraki adımlar \{#next-steps\}
- Adapty'nin profilleri nasıl oluşturup bağladığını anlamak için bkz. [Profiller nasıl çalışır](how-profiles-work).
- Erişim paylaşım politikasını yapılandırmak için bkz. [Kullanıcı hesapları arasında ücretli erişim paylaşımı](sharing-paid-access-between-user-accounts).
- Erişimi programatik olarak vermek için bkz. [Access level ver](api-adapty/operations/grantAccessLevel) API yöntemi.
---
# File: how-profiles-work
---
---
title: "Profiller nasıl çalışır"
description: "Adapty'nin kullanıcı profillerini nasıl oluşturduğunu, takip ettiğini ve bağladığını anlayın — anonim profiller, kimliği belirlenmiş kullanıcılar ve ebeveyn/kalıtımcı ilişkileri dahil."
---
Uygulamanızdaki her kullanıcı, satın alımlarını, olaylarını ve abonelik durumunu takip eden bir Adapty profiline sahip olur. Profillerin nasıl oluşturulduğunu ve birbirine bağlandığını anlamak; entegrasyon hatalarını önlemenize, veri parçalanmasını engellemenize ve [Profiller](profiles-crm) bölümündeki verileri doğru yorumlamanıza yardımcı olur.
## Profil oluşturma \{#profile-creation\}
Adapty, bir kullanıcı uygulamanızı ilk kez açtığında otomatik olarak bir profil oluşturur.
**Customer User ID olmadan** profil anonimdir. Her şu durumda yeni bir anonim profil oluşturulur:
- Kullanıcı uygulamayı yeniden yüklediğinde
- Kullanıcı uygulamanızdan çıkış yaptığında (uygulamanız `Adapty.logout()` çağırdığında)
Satın alımlar, kalıcı bir kullanıcı kimliğine değil, uygulama kurulumuna bağlıdır.
**Customer User ID ile** profil, yeniden yüklemeler ve cihazlar arasında kalıcı olur. Customer user ID kullanmak şunları sağlar:
1. Kullanıcıyı uygulama yeniden yüklemeleri ve birden fazla cihaz üzerinden takip edebilirsiniz.
2. Kullanıcıları [**Profiles**](profiles-crm) bölümünde customer user ID'lerine göre bulabilirsiniz.
3. Customer user ID'yi [sunucu tarafı API](getting-started-with-server-side-api)'sinde kullanabilirsiniz.
4. Adapty, customer user ID'yi tüm entegrasyonlara gönderir.
Customer user ID ile profil davranışı, bunu ne zaman ayarladığınıza bağlıdır:
- **SDK etkinleştirmesinde**: Adapty, o customer user ID'ye sahip mevcut profili kullanır (geri dönen kullanıcılar için) veya yeni bir profil oluşturur (ilk kez gelen kullanıcılar için).
- **SDK etkinleştirmesinden sonra**: Adapty, etkinleştirmede anonim bir profil oluşturur. Kullanıcıyı daha sonra tanımladığınızda Adapty, customer user ID'yi anonim profile bağlar (ilk kez gelen kullanıcılar için) veya o ID'ye sahip mevcut profile geçer (geri dönen kullanıcılar için).
**Hangi yaklaşımı kullanmalısınız:**
- **Uygulama başlangıcında customer user ID mevcutsa** (örneğin, önceki bir oturumdan kaydedilmişse) — SDK'yı başlatırken `activate()` fonksiyonuna iletin.
- **Kullanıcılar uygulama başladıktan sonra giriş yapıyorsa** — kimlik doğrulamanın ardından `identify()` fonksiyonunu çağırın. Adapty, ID'yi mevcut profile bağlar (ID yeniyse) veya mevcut profile geçer (ID zaten varsa).
- **Kullanıcılar giriş yapmadan önce satın alım yapabiliyorsa** — girişin ardından `identify()` fonksiyonunu çağırın. Customer user ID Adapty'de zaten mevcutsa, mevcut access level'ı senkronize etmek için ardından profili alın.
Uygulama ayrıntıları için [kullanıcıları tanımlama](identifying-users) SDK kılavuzuna bakın.
:::note
Geri dönen bir kullanıcı daha önce uygulamanızı customer user ID olmadan kullandıysa, SDK etkinleştirmesinde tanımlamaya başladığınızda bu anonim profiller otomatik olarak birleştirilmez. Bu tür kullanıcılar için eksiksiz geçmişi korumak amacıyla bunun yerine girişten sonra `identify()` kullanın.
:::
## Ebeveyn ve miras alan profiller \{#parent-and-inheritor-profiles\}
Aynı mağaza tarafındaki abonelik birden fazla Adapty profiliyle ilişkilendirildiğinde, Adapty bu profilleri bir zincir olarak ele alır: bir **ebeveyn** profil ve aynı satın almadan erişimi paylaşan bir ya da birden fazla **miras alan** profil.
Bu durum şu koşullarda ortaya çıkar:
- [Kullanıcı hesapları arasında ücretli erişim paylaşımı](sharing-paid-access-between-user-accounts) etkinleştirildiğinde ve bir kullanıcı, daha önce farklı bir profilin satın alma yaptığı bir cihazda oturum açtığında.
- Bir kullanıcı uygulamayı `customer_user_id` olmadan yeniden yüklediğinde ve yeni profil önceki kurulumun satın almasını devraldığında.
- Farklı tanımlı kullanıcılar aynı cihazda satın almaları geri yüklediğinde.
- Bir uygulama Apple Team ID'leri arasında aktarıldığında ve yeni uygulama eski Team ID altında yapılan satın almaları devraldığında.
**Üst öğenin nasıl seçildiği.**
**Üst profil**, **satın alma işlemini ilk kaydeden profildir** — bu, profil oluşturma sırasına göre değil, Adapty'deki satın alma makbuzu sırasına göre belirlenir. Örneğin: uygulamayı yükleyip hiçbir satın alma yapmıyorsunuz, ardından yeniden yükleyip bir abonelik satın alıyorsunuz. İkinci profil, satın alma işlemini gerçekleştirdiği için üst profil olur. Birinci profil ise kalıtımcı olur ve paylaşım yoluyla erişim kazanır.
**Olaylar nasıl dağıtılır:**
- **İşlemsel olaylar** (satın almalar, yenilemeler, iptaller, faturalama sorunları, ek süreler, iade): Yalnızca satın almayı gerçekleştiren **üst profilde** görünür. Tüm abonelik yenilemeleri ve güncellemeleri bu profilde görünmeye devam eder.
- **`access_level_updated` olayları**: Access level durumu her değiştiğinde **hem üst hem de devralan profillerde** görünür. Bu sayede bağlı tüm profiller güncel erişim durumlarından haberdar olur.
Ana profil, işlem geçmişinin tamamını gösterir. Miras alan profiller ise yalnızca kendi access level güncellemelerini ve **Access level** bölümünde ana profile bir bağlantıyı gösterir.
**Aynı aboneliği farklı profiller üzerinden takip etme.**
Her miras alan profilin kendine ait bir `profile_id`'si vardır; bu nedenle `profile_id`, bir zincir boyunca tutarlı değildir. Aynı aboneliği birden fazla profil arasında tanımlamak için — örneğin webhook olaylarını eşleştirirken veya kontrol paneli profillerini tek bir kullanıcıyla ilişkilendirirken — bunun yerine mağaza tarafındaki tanımlayıcıyı kullanın.
| Alan | Kullanım amacı |
| --- | --- |
| `store_original_transaction_id` | Profiller arasında bir abonelik zincirini tanımlamak için. Her Apple aboneliğine özel benzersiz bir değerdir. |
| `profiles_sharing_access_level` (webhook alanı) | Paylaşım etkinleştirildiğinde, abonelik tarafından yetkilendirilen tüm profiller. |
| `profile_id` | Profiller arası takip için **uygun değildir** — her devralan profilin kendine ait bir `profile_id`'si vardır. |
## Profil olmadan işlemler \{#transactions-without-profiles\}
Adapty'deki bazı işlemler herhangi bir profile bağlı değildir — bunlar analitiklerde ve dışa aktarmalarda görünür, ancak Profiller listesinde yer almaz. Bu durum, Adapty SDK'sı aracılığıyla uygulamanıza hiç bağlanmamış kullanıcılara ait **sunucudan sunucuya (S2S) mağaza bildirimleri** için geçerlidir. Bilinen kaynaklar şunlardır:
- App Store S2S bildirimleri (iade etkinlikleri dahil)
- Google Play S2S bildirimleri
- Stripe ve Paddle webhook etkinlikleri
Bu işlemler:
- **Analitik grafiklerde görünürler** (genel metriklere dahil edilirler)
- **Dışa aktarımlarda görünürler** (S3, GCS, BigQuery) ve `profile_id` değerleri `null` olarak ayarlanır
- **Profiller listesinde görünmezler** — bağlanacak bir profil yoktur
Analitik veya dışa aktarımlarda, Profiller arayüzünde bulamadığınızdan daha fazla etkinlik görüyorsanız, bu fark büyük olasılıkla profile bağlı olmayan bu işlemlerden kaynaklanmaktadır. Bunları bir dışa aktarımda bulmak için `profile_id IS NULL` olan satırları filtreleyin.
## Kullanıcı hesapları arasında ücretli erişimi paylaşma \{#sharing-paid-access-between-user-accounts\}
:::link
Ana makale: [Kullanıcı hesapları arasında ücretli erişimi paylaşma](sharing-paid-access-between-user-accounts)
:::
Access level paylaşım politikanızı ayarlamak için [**General**](general) ayarlar sayfasında bir paylaşım seçeneği belirleyin. [Sandbox ortamı](test-purchases-in-sandbox) için ayrı bir politika ayarlayabilirsiniz.
**Etkin (varsayılan)**
Kimliği belirlenmiş kullanıcılar ([Müşteri Kullanıcı Kimliği](identifying-users#set-customer-user-id-on-configuration) atanmış olanlar), cihazları aynı Apple/Google ID ile oturum açmışsa Adapty tarafından sağlanan aynı [access level](access-level)'ı paylaşabilir. Bu, kullanıcının uygulamayı yeniden yükleyip farklı bir e-posta ile giriş yapması durumunda bile önceki satın alımına erişimini korumasını sağlar. Bu seçenekte birden fazla kimliği belirlenmiş kullanıcı aynı access level'ı paylaşabilir.
Access level paylaşılıyor olsa da tüm geçmiş ve gelecekteki işlemler; deneme süreleri, abonelik satın alımları, yenilemeler ve daha fazlası dahil olmak üzere tutarlı bir analitik ve eksiksiz bir işlem geçmişi sağlamak amacıyla orijinal Müşteri Kullanıcı Kimliği'nde olay olarak kaydedilir ve aynı profile bağlı kalır.
**Erişimi yeni kullanıcıya aktar**
Kimliği belirlenmiş kullanıcılar, farklı bir [Müşteri Kullanıcı Kimliği](identifying-users#set-customer-user-id-on-configuration) ile giriş yapsalar veya uygulamayı yeniden yükleseler bile, cihazları aynı Apple/Google ID ile oturum açık olduğu sürece Adapty tarafından sağlanan [access level](access-level)'a erişmeye devam edebilir.
Önceki seçenekten farklı olarak Adapty, satın alımı kimliği belirlenmiş kullanıcılar arasında aktarır. Bu sayede satın alınan içeriğe erişim sağlanır; ancak aynı anda yalnızca bir kullanıcı erişime sahip olabilir. Örneğin, KullanıcıA bir abonelik satın alır ve KullanıcıB aynı cihazda oturum açarak işlemleri geri yüklerse KullanıcıB aboneliğe erişim kazanırken KullanıcıA'nın erişimi iptal edilir.
Kullanıcılardan biri (yeni veya eski) kimliği belirlenmemişse, access level yine de Adapty'deki bu profiller arasında paylaşılmaya devam eder.
Access level aktarılıyor olsa da tüm geçmiş ve gelecekteki işlemler; deneme süreleri, abonelik satın alımları, yenilemeler ve daha fazlası dahil olmak üzere tutarlı bir analitik ve eksiksiz bir işlem geçmişi sağlamak amacıyla orijinal Müşteri Kullanıcı Kimliği'nde olay olarak kaydedilir ve aynı profile bağlı kalır.
**Erişimi yeni kullanıcıya aktar** seçeneğine geçtikten sonra, access level'lar profiller arasında hemen aktarılmaz. Belirli bir access level için aktarım süreci; abonelik yenilemesi, geri yükleme veya işlem doğrulama gibi mağazadan bir olay alındığında tetiklenir.
**Devre Dışı**
Bir access level alan ilk kimliği belirlenmiş kullanıcı profili, bu erişimi kalıcı olarak elinde tutar. İş mantığınızın satın alımların tek bir Müşteri Kullanıcı Kimliği'ne bağlı olmasını gerektirdiği durumlarda en uygun seçenektir.
Anonim kullanıcılar arasında access level paylaşımının devam ettiğini unutmayın.
Bir satın alımı "ayırmak" için [kullanıcının profilini silebilirsiniz](https://adapty.io/docs/tr/api-adapty/operations/deleteProfile). Silme işleminin ardından access level, ister anonim ister kimliği belirlenmiş olsun, ilk talep eden kullanıcı profiline açık hale gelir.
Paylaşımı devre dışı bırakmak yalnızca yeni kullanıcıları etkiler. Kullanıcılar arasında zaten paylaşılmakta olan abonelikler, bu seçenek devre dışı bırakıldıktan sonra da paylaşılmaya devam eder.
:::warning
Apple ve Google, uygulama içi satın alımların kullanıcılar arasında paylaşılmasını veya aktarılmasını zorunlu kılar; çünkü satın alımı belirli bir kullanıcıyla ilişkilendirmek için Apple/Google ID'ye güvenirler. Paylaşım olmadan, sonraki yeniden yüklemelerde satın alımların geri yüklenmesi çalışmayabilir.
Paylaşımı devre dışı bırakmak, kullanıcıların giriş yaptıktan sonra erişimi yeniden kazanamamasına neden olabilir.
Paylaşımı yalnızca kullanıcılarınızın satın alma yapmadan önce **giriş yapmasının zorunlu olduğu** durumlarda devre dışı bırakmanızı öneririz. Aksi takdirde, kimliği belirlenmiş bir kullanıcı abonelik satın alıp başka bir hesaba giriş yaparak erişimini kalıcı olarak kaybedebilir.
:::
### Hangi ayarı seçmeliyim? \{#which-setting-should-i-choose\}
| Uygulamam... | Seçilecek seçenek |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| Giriş sistemi yok ve yalnızca Adapty'nin anonim profil ID'lerini kullanıyor. | Access level'lar her üç seçenekte de anonim profil ID'leri arasında her zaman paylaşıldığından varsayılan seçeneği kullanın. |
| İsteğe bağlı giriş sistemine sahip ve müşterilerin hesap oluşturmadan önce satın alım yapmasına izin veriyor. | Hesapsız satın alım yapan müşterilerin işlemlerini daha sonra geri yükleyebilmesini sağlamak için **Erişimi yeni kullanıcıya aktar** seçeneğini belirleyin. |
| Satın alım öncesinde hesap oluşturmayı zorunlu kılıyor ancak satın alımların birden fazla Müşteri Kullanıcı Kimliği'ne bağlanmasına izin veriyor. | Aynı anda yalnızca bir Müşteri Kullanıcı Kimliği'nin erişime sahip olmasını sağlarken kullanıcıların ücretli erişimlerini kaybetmeden farklı bir Müşteri Kullanıcı Kimliği ile giriş yapabilmesine olanak tanımak için **Erişimi yeni kullanıcıya aktar** seçeneğini belirleyin. |
| Satın alım öncesinde hesap oluşturmayı zorunlu kılıyor ve satın alımları tek bir Müşteri Kullanıcı Kimliği'ne bağlayan katı kurallara sahip. | İşlemlerin hesaplar arasında hiçbir zaman aktarılmamasını sağlamak için **Devre Dışı** seçeneğini belirleyin. |
## Gelecek tarihli olay zaman damgaları (Apple/iOS) \{#event-timestamps-with-future-dates-appleios\}
Bu davranış Apple App Store'a özgüdür. Google Play'in bildirim sistemi olayları önceden göndermez.
Apple, yenileme olaylarını önceden gönderdiği için profillerdeki ve entegrasyonlardaki olay zaman damgaları gelecek tarihleri gösterebilir.
- **Neden olur**: Apple bunu, aboneliklerin sona ermeden önce otomatik olarak yenilenmesini sağlamak ve kullanıcı hizmet kesintilerini önlemek için yapar. Daha fazla ayrıntı için Apple'ın Geliştirici Forumuna bakın: [Server Notifications for Subscriptions](https://developer.apple.com/forums/tags/app-store-server-notifications).
- **Etkilenen olay türleri**: Genellikle bu durum abonelik yenilemeleri ve deneme sürümünden ücretli dönüşümleri için geçerlidir. Bu olaylar, Apple sistemleri önceden bilgilendirdiği için gelecek zaman damgalarına sahip olabilir.
- **Diğer olay türleri**: Ek uygulama içi satın alımlar ve abonelik planı değişiklikleri, bu olaylar önceden tahmin edilemeyeceği için gerçek zaman damgalarıyla kaydedilir.
- **Analitik ve Olay Akışı üzerindeki etkisi**: Bu olaylar yalnızca zaman damgaları geçtikten sonra **Analytics** ve **Event Feed**'de görünür. Gelecek zaman damgalı olaylar her iki bölümde de gösterilmez.
- **Entegrasyonlar üzerindeki etkisi**: Adapty, olayları alır almaz entegrasyonlara gönderir. Bir olayın gelecek zaman damgası varsa Adapty, bunu entegrasyonunuza gelecek zaman damgası değiştirilmeden gönderir.
## Sonraki adımlar \{#next-steps\}
- Kullanıcıları bulmak ve yönetmek için Profiller kontrol panelini kullanmak istiyorsanız [Profiller](profiles-crm) sayfasına bakın.
- Uygulamanızda kullanıcı tanımlamayı ayarlamak için [kullanıcıları tanımlama](identifying-users) SDK kılavuzuna bakın.
- Erişim paylaşım politikasını yapılandırmak için [Kullanıcı hesapları arasında ücretli erişimi paylaşma](sharing-paid-access-between-user-accounts) sayfasına bakın.
---
# File: sharing-paid-access-between-user-accounts
---
---
title: "Kullanıcı hesapları arasında ücretli erişimi paylaşma"
description: "Birden fazla cihaza veya uygulama profiline sahip kullanıcılara hitap etmek için farklı kullanıcı hesapları arasında ücretli erişimi paylaşma"
---
Bir kullanıcı satın alma yaptığında, Adapty aktif [profiline](identifying-users) yeni bir [access level](access-level) atar. Bu access level, alıcının ücretli içeriklere erişmesini sağlar.
Kullanıcı uygulamayı yeniden yüklerse veya uygulama içinde yeni bir hesaba giriş yaparsa, alıcının profili istemeden değişebilir. Kesintisiz erişimi sağlamak için Adapty, kullanıcının access level'ını orijinal profil ile sonraki profiller arasında otomatik olarak paylaşır.
Bu yaklaşım çoğu uygulama için idealdir. Ancak iş mantığınız gerektiriyorsa, daha kısıtlı bir ücretli erişim paylaşım politikası seçebilirsiniz.
[Genel Ayarlar](https://app.adapty.io/settings/general) sayfasını açarak bir access level paylaşım politikası belirleyin. Test sürecini kolaylaştırmak için bu ayarı yalnızca [sandbox ortamı için](#sharing-paid-access-on-sandbox) değiştirebilirsiniz.
## Enabled (default) \{#enabled-default\}
Bu ayar, **yerleşik kimlik doğrulaması olmayan** uygulamalar için en iyi seçenektir. Satın alma işleminin ardından, aynı mağaza hesabıyla ilişkili tüm profiller access level'ı otomatik olarak *devralır*.
* Kullanıcı uygulamanıza yeni bir kimlik bilgisi setiyle giriş yaparsa, ücretli içeriklere erişimini korur.
* Kullanıcı fabrika ayarlarına sıfırladıktan sonra uygulamanızı yeniden yüklerse, ücretli içeriklere erişimini korur.
* Kullanıcı, aynı mağaza hesabıyla farklı cihazlara uygulama yüklerse, satın alma tüm cihazlarda kullanılabilir hale gelir. Her uygulama örneğinin kendi müşteri profiline sahip olması durumunda bile.
## Transfer access to new user \{#transfer-access-to-new-user\}
Bu ayar, **kimlik doğrulamalı ya da doğrulamasız** satın alıma izin veren veya **kullanıcı başına tek cihaz** politikası uygulamak isteyen uygulamalar için en iyi seçenektir.
Adapty, satın alma erişimini aynı anda 1 müşteri kimliğiyle sınırlar. Cihaz sahibi uygulamayı yeniden yükleyebilir, oturum açıp kapatabilir; ancak aynı ürüne birden fazla müşteri kimliğinden aynı anda erişemez.
Bu ayar etkinleştirildiğinde, anonim profiller (örneğin, kullanıcı oturum kapattıktan sonra aktif hale gelen bir profil) her zaman son aktif müşteri kimliğinin access level'ını devralır. Bu, ilerleyen süreçte erişim kaybını önlemek için gereklidir.
:::warning
Varsayılan ayarı devre dışı bırakıp **Transfer access to new user** seçeneğini etkinleştirdiğinizde, Adapty mevcut müşteri profillerinin access level'larını hemen güncellemez.
Geçiş, bir kullanıcı yeni bir mağaza olayı tetiklediğinde gerçekleşir: örneğin, aboneliği yenilendiğinde veya satın alımlarını geri yüklediğinde.
:::
:::important
Adapty, eski profili yalnızca yeni profilde SDK işlemi ilettiği anda bir [Müşteri Kullanıcı Kimliği](identifying-users#set-customer-user-id-on-configuration) bulunduğunda iptal eder. `restorePurchases` anonim bir profil üzerinde çalışırsa, hem eski Müşteri Kullanıcı Kimliği hem de yeni anonim profil access level'a sahip olur. Eski profil daha sonra, anonim profili tanımladığınızda iptal edilir.
Bunu önlemek için SDK metodlarını sırasıyla çağırın: `activate` → `identify` → `restorePurchases`.
:::
## Ücretli erişim paylaşımını devre dışı bırakma \{#disable-paid-access-sharing\}
Bu ayar **yalnızca**, **zorunlu kimlik doğrulaması** olan veya bağımsız bir erişim yönetimi uygulaması kullanan uygulamalar için uygundur. Diğer durumlarda kullanıcılar satın alımlarına erişemeyebilir ve uygulamanız **zorunlu mağaza incelemesinde başarısız olma riskiyle** karşılaşabilir.
Ücretli erişim paylaşımını devre dışı bıraktığınızda, Adapty ürünü satın alma anındaki aktif [müşteri kimliğine](identifying-users#set-customer-user-id-on-configuration) bağlar ve access level'ı başka hiçbir müşteri profiliyle paylaşmaz. Bu politika, katı 1'e 1 ürün dağıtımına olanak tanır.
:::warning
Ücretli erişim paylaşımını devre dışı bıraktığınızda, müşteri kimliklerinin ücretli erişimi devralmasını engellersiniz. Bir müşteri kimliği geçmişte ücretli erişimi devralmışsa, bu erişim otomatik olarak iptal edilemez.
:::
:::important
Acil durumlarda, bir sonraki kullanılabilir profilin (tanımlı ya da anonim) kendi access level'ını talep edebilmesi için [kullanıcı profilini silmeniz](api-adapty/operations/deleteProfile) gerekebilir.
:::
## Pratik referans \{#practical-reference\}
Bir mod seçtikten sonra, aşağıdaki açıklamalar ne bekleyeceğinizi anlatır: hangi profiller erişimi görür, eski profil erişimi ne zaman kaybeder ve hangi webhook olayları tetiklenir.
| Mod | Birden fazla profil aynı satın alımı paylaşabilir mi? | Transfer sırasında eski profilin erişimi iptal edilir mi? | Eski profilin erişimi ne zaman iptal edilir | İkinci bir profil aboneliği talep ettiğinde tetiklenen webhook olayları |
| --- | --- | --- | --- | --- |
| **Etkin (varsayılan)** | Evet — geri yükleme yapan veya oturum açan her profil erişimi devralır | Hiçbir zaman | Geçerli değil | Her yeni profil için `access_level_updated` (`is_active=true`) |
| **Erişimi yeni kullanıcıya aktar** | Hayır — erişim özeldir ancak profiller arasında taşınabilir | Evet | Yeni tanımlanmış cihaz işlemi yayıldığında hemen (`restorePurchases`, identify veya sonraki mağaza tarafı olayı) | Yeni profil: `access_level_updated` (`is_active=true`). Eski profil: `access_level_updated` (`is_active=false`) |
| **Devre dışı** | Hayır — satın alma başına kalıcı olarak bir Customer User ID | Geçerli değil — erişim hiçbir zaman aktarılmaz | Geçerli değil | İkinci profil için hiçbir olay tetiklenmez. SDK bu profil için erişim göstermez |
## Sandbox ortamında ücretli erişim paylaşımı \{#sharing-paid-access-on-sandbox\}
Sandbox ortamı için özel bir ücretli erişim paylaşım politikası belirleyebilirsiniz. Sandbox ortamında satın alımları test ederken aşağıdaki davranışları bekleyin:
* Apple, hesabınızın satın alma geçmişindeki önceki satın alımlarınızı saklar. Adapty SDK da bu bilgilere erişebilir.
* Uygulamayı yeniden yüklerseniz ve Adapty ürünün daha önce satın alındığını tespit ederse, aktif profil access level'ı devralır.
* Apple, ürün için mevcut bir satın alma tespit ederse, aktif profilin gerekli access level'a sahip olmadığı durumlarda bile aynı satın almayı iki kez yapmanıza izin vermez.
Bu davranış, **ücretli erişim paylaşım ayarınızdan bağımsız olarak** gerçekleşir. Uygulamanız paywall'ı göstermez ve ürünü satın alamazsınız. Tek çözüm, **hesabınızın satın alma geçmişini temizlemektir**. Ayrıntılı talimatlar için [sandbox test kılavuzunu](test-purchases-in-sandbox) inceleyin.
:::warning
Apple sandbox ortamında abonelikler her birkaç dakikada bir otomatik yenilenir. Bu hızlı yenilemeler, Adapty'nin [üst profil](how-profiles-work#parent-and-inheritor-profiles) olarak kabul ettiği profili değiştirebilir — üretim ortamının nadiren yeniden oluşturduğu bir zincir deseni. Üretimde kullandığınız modu test edin ve sandbox'tan sonuç çıkarmadan önce davranışı gerçek bir Apple ID ile doğrulayın.
:::
## Analizlerde ücretli erişim paylaşımı \{#paid-access-sharing-in-analytics\}
* Adapty, işlemleri gerçekleştikçe kaydeder. Tek bir işlem birden fazla profille ilişkilendirilebilir, ancak birden fazla kez sayılmaz.
* İki veya daha fazla profil aynı access level'ı paylaşıyorsa, satın alma [üst profile](how-profiles-work#parent-and-inheritor-profiles) atfedilir.
* Access level kalıtımı kurulum istatistiklerini etkilemez. Adapty'nin kurulumları nasıl saydığını belirlemek için ayarlar sayfasında mevcut iki [kurulum tanımından](installs#counting-modes) birini seçebilirsiniz.
---
# File: segments
---
---
title: "Segmentler"
description: "Adapty'de daha iyi hedefleme için kullanıcı segmentleri oluşturun ve yönetin."
---
**Segment**, ortak özelliklere sahip kullanıcıları gruplandıran bir filtreler kümesidir. Paywallları ve A/B testlerini daha etkili şekilde hedeflemek için segmentleri kullanın.
:::note
Etkinlik akışındaki olaylar kontrol paneline gecikmeli olarak ulaşır. Yeni profiller ve özellik değişiklikleri hemen görünmeyebilir.
:::
Bir segment oluşturduktan sonra, hangi kullanıcıların hangi paywall'ı göreceğini kontrol etmek (tek veya birden fazla) için [bunu Placement'lar ve A/B testlerinde **kitle** olarak kullanabilirsiniz](audience). Örnekler:
- Abonelik sahibi olmayanlara standart bir paywall gösterin; daha önce aboneliğini veya deneme süresini iptal etmiş kullanıcılara indirim teklif edin.
- Farklı ülkelerden gelen kullanıcılara farklı paywall'lar gösterin.
- Apple Search Ads attribution verilerine göre kullanıcıları hedefleyin.
- Eski uygulama sürümlerindeki kullanıcılar mevcut paywall'ı görmeye devam ederken yeni sürümlerdeki kullanıcılar güncellenmiş olanı görsün.
- [Analytics'te](controls-filters-grouping-compare-proceeds#filter-and-group-data), belirli kullanıcı gruplarının performansını görüntülemek için segmentlere göre filtreleyin. **All users** içindeki performansı veya katkıyı karşılaştırmak için segmente göre gruplandırın.
## Oluşturma \{#creation\}
Bir segment oluşturmak için bir ad girin ve filtrelerini belirleyen nitelikleri seçin. Birden fazla nitelik seçtiğinizde, kullanıcıların tüm koşulları karşılaması gerekir. Adapty, nitelikler arasında AND mantığı uygular.
## Mevcut özellikler \{#available-attributes\}
:::note
Birçok kullanıcı özelliği otomatik olarak belirlense de (**Country** veya **Calculated total revenue USD** gibi), **Age**, **App user ID**, **Attribution** verisi, **Gender** ve **Custom attributes** otomatik olarak tanımlanmaz. Bunları segmentasyon amacıyla kullanmak istiyorsanız [kullanıcı özelliklerini ayarlamanız](setting-user-attributes) veya [attribution verisi iletmeniz](attribution-integration) gerekir.
:::
:::tip
Tarih tabanlı özellikler için şu filtreleri kullanabilirsiniz:
- **Sabit tarih**: Takvimden belirli tarihler seçin (ör. Kara Cuma ile Siber Pazartesi arasında yükleme yapan kullanıcılara özel teklif gösterin)
- **Göreli aralık**: "Son 7 gün" veya "Son 3 ay" gibi dinamik zaman aralıkları belirleyin (ör. 30+ gün önce görülen kullanıcıları yeniden kazanın ya da yeni yüklemeleri hedefleyin)
Göreli aralıklar otomatik olarak güncellenir; bu da onları süregelen kampanyalar için ideal kılar. Sabit tarihler ise belirli bir süreyle sınırlı promosyonlar için daha uygundur.
:::
| Özellik | Filtreleme kriteri |
|---------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Age** | Kullanıcının yaşı. Yaşın, Adapty tarafından ilk alındığı anda hesaplandığını ve sonradan güncellenmediğini unutmayın. |
| **App User ID** | Kullanıcının uygulamanızdaki tanımlayıcısı ([customer_user_id](profiles-crm#user-attributes)). Örneğin, yalnızca giriş yapmamış kullanıcılara paywall göstermek istediğinizde bu alanın var olup olmadığına göre filtreleyebilirsiniz. |
| **App version (current)** | Adapty'nin en son etkinlik verisi aldığı anda kullanıcının cihazında yüklü olan uygulamanın mevcut sürümü — kullanıcı güncelleme yaptıkça **güncellenir**, dolayısıyla her zaman o an çalışan sürümü gösterir. Belirli bir sürümü çalıştıran herkesi (bu sürüme daha önceki bir sürümden geçenler dahil) hedeflemek istediğinizde kullanın. Segment oluştururken **App version** yanındaki kalem ikonuna tıklayıp yeni bir sürüm ekleyerek hemen kullanabilirsiniz.
| Alan | Açıklama |
| ------ |--------------------------------------------------------------------------------------------------------------------------------------|
| **Name** | Adapty Kontrol Paneli'nde görünen özel nitelik etiketi. |
| **Key** | Niteliğin benzersiz tanımlayıcısı. SDK'da kullanılan anahtarla eşleşmesi gerekir. |
| **Type** | Aşağıdakilerden birini seçin:
## Segmentleri kopyalama \{#duplicate-segments\}
Mevcut bir segmente benzer bir segment oluşturmanız gerekiyorsa, sıfırdan oluşturmak yerine kopyalayın. Bu, örtüşen kullanıcı gruplarıyla birden fazla kampanya veya A/B testi yürüten ekipler için zaman kazandırır.
Bir segmenti kopyaladığınızda, tüm filtreleri ve açıklamasıyla birlikte bir kopyası oluşturulur. Yeni segmentin adına "(copy)" eklenerek orijinalden ayırt edilmesi sağlanır. Yeni segment, orijinalden bağımsızdır. Birinde yapılan değişiklikler diğerini etkilemez.
Adapty Kontrol Paneli'nde bir segmenti kopyalamak için:
1. Adapty ana menüsünde **Profiles & Segments** bölümünü açın ve [**Segments**](https://app.adapty.io/segments) sekmesine geçin.
2. Segmentin yanındaki **3-dot** düğmesine tıklayın ve **Duplicate** seçeneğini seçin.
3. Yeni segmenti açın ve filtrelerini ihtiyacınıza göre düzenleyin.
## Segmentleri silme \{#delete-segments\}
Bir segmente artık ihtiyaç duymadığınızda, onu kalıcı olarak silebilirsiniz.
Segment şu durumlardan herhangi birinde kitle olarak kullanılıyorsa Adapty silme işlemini engeller:
- **Bir placement**: En az bir silinmemiş placement, segmenti kitle olarak kullanıyordur.
- **Bir A/B testi (Canlı veya Tamamlanmış)**: En az bir silinmemiş A/B testi, segmenti kitle olarak kullanıyordur.
Segment silindiğinde, Adapty hem **Live** hem de **Completed** A/B testlerini aktif olarak değerlendirir. Tamamlanmış bir test, eşleşen kullanıcılara test sonrası paywall veya onboarding'i göstermek için kitleyi kullanmaya devam eder ve teste ait geçmiş metrikler söz konusu segmente göre kapsamlandırılır. Segment ancak A/B testinin kendisi silindiğinde serbest bırakılır.
:::warning
Segment silme işlemi kalıcıdır. Segment geri yüklenemez.
:::
Adapty Kontrol Paneli'nde bir segment silmek için:
1. Adapty ana menüsünde **Profiles & Segments** bölümüne gidin ve [**Segments**](https://app.adapty.io/segments) sekmesine geçin.
2. Segmentin yanındaki **3 nokta** düğmesine tıklayın ve **Delete** seçeneğini seçin.
3. Onay alanına segment adını yazın, ardından **Delete forever** düğmesine tıklayın.
:::info
Segment kullanımdaysa, diyalog onu kullanan placement'ları ve A/B testlerini listeler.
Silme işlemini açmak için listedeki her placement veya A/B testini açın ve ya segmenti kitlesinden kaldırın ya da placement'ı ya da A/B testini tamamen silin. Hiçbir şey segmente başvurmadığında, segmenti silebilirsiniz.
:::
---
# File: event-feed
---
---
title: "Etkinlik akışı"
description: "Adapty'nin etkinlik akışı ile kullanıcı aktivitesini izleyin ve analiz edin."
---
Etkinlik akışı, Adapty tarafından oluşturulan [Etkinlikleri](events) görsel olarak takip etmenizi ve webhook dahil üçüncü taraf entegrasyonlara aktarım durumlarını kontrol etmenizi sağlar.
:::warning
Event Feed şunları göstermez:
- **Sunucu tarafı API v1 işlemleri**: [Sunucu tarafı API (sürüm 1)](server-side-api-specs-legacy#requests) kullanılarak oluşturulanlardır. Bunların görünmesi için bunun yerine [sunucu tarafı API (sürüm 2)](api-adapty/operations/setTransaction) kullanın.
- **Profili olmayan olaylar**: SDK bir kullanıcıyı tanımlamadan önce gelen işlemler — örneğin, mağaza sunucu bildirimleri. Bunları dışa aktarmalara dahil etmek için [S3](s3-exports) veya [Google Cloud Storage](google-cloud-storage) entegrasyonunda **Include events without profile** seçeneğini etkinleştirin.
:::
:::note AppsFlyer, Facebook Ads ve Branch gönderim durumu yanlış olabilir; çünkü bu platformlar her zaman hata oluştuğunda bunu bildirmez. ::: İşlemi başlatan kullanıcının profilini görüntülemek için etkinlik ayrıntılarındaki **View Profile** düğmesine tıklayın. --- # File: ab-tests --- --- title: "A/B testi" description: "Adapty'de A/B testleri ile abonelik fiyatlandırmasını optimize ederek dönüşüm oranlarını artırın." --- :::tip Araştırma yapmadan eyleme dönüştürülebilir bir A/B testi planı elde edebilirsiniz. [AI Growth Advisor](autopilot), paywallınızı denetler, rakiplerinizle kıyaslar ve Adapty'nin takip ettiği 20.000 abonelik uygulamasından elde edilen anonimleştirilmiş verilerden öneriler üretir. ::: Adapty'de A/B testleri çalıştırarak uygulama gelirinizi artırın. Hangi seçeneğin en iyi dönüşüm sağladığını bulmak için farklı flow'ları, paywall'ları ve onboarding'leri karşılaştırın — kod değişikliği gerekmez. Örneğin şunları test edebilirsiniz: - Abonelik fiyatları - Paywall tasarımı, metinleri ve düzeni - Deneme süreleri ve abonelik süreleri - Onboarding tasarımları ## Ön Koşullar \{#prerequisites\} A/B testi oluşturmadan önce şunlara sahip olmanız gerekir: - **Placement'lar**: Bir flow, paywall veya onboarding'in gösterildiği bir veya daha fazla [placement](placements). - **Flow'lar için**: En az iki [flow](adapty-flow-builder). - **Paywall'lar için**: En az iki [paywall](paywalls). - **Onboarding'ler için**: En az iki [onboarding](onboardings). :::warning [Adapty Flow builder](adapty-flow-builder) veya [Adapty Paywall builder](adapty-paywall-builder) kullanmıyorsanız, paywall görüntülemelerini `.logShowFlow()` (iOS SDK v4+) / `.logShowPaywall()` ile [Adapty'e gönderin](present-remote-config-paywalls#track-paywall-view-events). Bu metod olmadan Adapty, testteki paywall görüntülemelerini hesaplayamaz ve dönüşüm istatistikleri hatalı olur. ::: ## A/B testi türleri \{#ab-test-types\} Adapty iki ana A/B testi türünü destekler: - **Regular**: Tek bir flow/paywall/onboarding placement üzerinde çalışır. - **Crossplacement**: Birden fazla paywall placement'ı üzerinde çalışır ve kullanıcıya her yerde aynı varyantı gösterir. Şu anda yalnızca paywall'lar için kullanılabilir. Türlerin, kullanım senaryolarının ve öncelik kurallarının tam karşılaştırması için bkz. [A/B testi türleri](ab-test-types). ## Sonraki adımlar \{#next-steps\} - [AI Growth Advisor](autopilot) — Paywallınızı analiz edin, pazar içgörüleri edinin ve bir A/B testi planı oluşturun - [A/B testi türleri](ab-test-types) — Test türleri ve her birinin ne zaman kullanılacağı hakkında bilgi edinin - [A/B testi oluşturma, çalıştırma ve durdurma](run_stop_ab_tests) — İlk testinizi kurun ve çalıştırın - [A/B testi sonuçları ve metrikler](results-and-metrics) — A/B testi verilerinizi anlayın ve kazananı belirleyin --- # File: ab-test-types --- --- title: "A/B testi türleri" description: "Adapty'deki A/B testi türleri hakkında bilgi edinin." --- Adapty, farklı test senaryolarına uygun iki A/B testi türü sunar: - **Normal A/B testi:** Tek bir [flow](adapty-flow-builder)/[paywall](paywalls)/[onboarding](onboardings) placement'ı için oluşturulan A/B testi. - **Çapraz placement A/B testi:** Uygulamanızdaki birden fazla paywall placement'ı için oluşturulan A/B testi. A/B testi bir
## Temel farklar \{#key-differences\}
| Özellik | Normal A/B Testi | Crossplacement A/B Testi |
| ------------------------------- |--------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------|
| **Test edilen şey** | Tek bir flow/paywall/onboarding | Bir varyanta ait paywall seti |
| **Varyant tutarlılığı** | Varyant her placement için ayrı ayrı belirlenir | Tüm paywall placement'larında aynı varyant kullanılır |
| **Kitle hedefleme** | Her flow/paywall/onboarding placement'ı için ayrı tanımlanır | Tüm paywall placement'larında ortaktır |
| **Analitik** | Tek bir flow/paywall/onboarding placement'ını analiz edersiniz | Testin parçası olan placement'larda uygulamanın tamamını analiz edersiniz |
| **Varyant ağırlık dağılımı** | Her flow/paywall/onboarding için ayrı | Paywall seti başına |
| **Kullanıcılar** | Tüm kullanıcılar için | Yalnızca yeni kullanıcılar (daha önce Adapty paywallı görmemiş olanlar) |
| **Adapty SDK sürümü** | Flow'lar için: v4.0.0+. Paywall'lar için: herhangi bir sürüm. Onboarding'ler için: v3.8.0+ (iOS, Android, React Native, Flutter), v3.14.0+ (Unity), v3.15.0+ (KMP, Capacitor) | 3.5.0+ |
| **En iyi kullanım durumu** | Genel uygulama ekonomisini gözetmeksizin tek bir flow/paywall/onboarding placement'ındaki bağımsız değişiklikleri test etmek | Uygulama genelinde genel para kazanma stratejilerini değerlendirmek |
## A/B testi seçim mantığı \{#ab-test-selection-logic\}
**Crossplacement A/B testleri, regular A/B testlerinden önceliklidir.** Ancak Crossplacement testleri yalnızca **yeni kullanıcılara** gösterilir; yani daha önce hiç Adapty paywall'ı görmemiş olanlara (`getPaywall` SDK metodu hiç çağrılmamış olanlara). Bu, placement'lar arasında sonuçların tutarlı olmasını sağlar.
Aşağıdaki diyagram, Adapty'nin bir placement için A/B testi seçmekte kullandığı mantığı göstermektedir:
**A/B Tests** sayfasında paywall, onboarding, flow ve Crossplacement testleri ayrı sekmelerde görüntülenir.
## Çapraz-placement A/B testi kısıtlamaları \{#crossplacement-ab-test-limitations\}
:::warning
Çapraz-placement A/B testleri, flow veya onboarding placement'larını içeremez.
:::
Çapraz-placement A/B testleri, her kullanıcının testteki tüm placement'larda aynı varyantı görmesini garanti eder. Bu durum aşağıdaki kısıtlamaları beraberinde getirir:
* Yalnızca yeni kullanıcılar katılabilir. Yeni kullanıcı; daha önce hiç Adapty paywalli görmemiş ve uygulaması hiç `getPaywall` çağrısı yapmamış kişidir. Adapty, diğer kullanıcılar için tutarlı bir paywall zinciri garanti edemez.
* Kullanıcının karşılaştığı ilk placement, Adapty'nin hangi paywall'ı göstereceğini belirler. Kullanıcının atamasını değiştiremez ya da aynı kullanıcıyı birden fazla Crossplacement A/B testine dahil edemezsiniz.
:::warning
Bir kullanıcı Crossplacement paywall'ı aldıktan sonra, testi durdursanız bile 90 gün boyunca o paywall'ı görmeye devam eder. Bu süreyi değiştirmek için **General** ayarlarında **[Cross-placement variation stickiness](general#9-cross-placement-variation-stickiness)** seçeneğini düzenleyin.
:::
## Crossplacement A/B testi önceliği \{#crossplacement-ab-test-priority\}
* Crossplacement A/B testleri her zaman regular ve onboarding A/B testlerinden önceliklidir. Yeni bir kullanıcı aynı placement'ta hem bir Crossplacement testiyle hem de bir regular testle eşleşiyorsa Crossplacement testi gösterilir.
* Aynı kitleyi hedefleyen birden fazla Crossplacement A/B testi aynı placement'ı paylaşıyorsa Adapty, test önceliğini eklenme sırasına göre otomatik olarak belirler. İlk eklenen test en yüksek önceliği alır. Bunu manuel olarak değiştiremezsiniz.
* Kitlenizin daha küçük segmentlerini hedefleyen testler, Tüm Kullanıcılar segmentini hedefleyenlere göre otomatik olarak öncelik kazanır.
:::note
Analytics'te bir Crossplacement A/B testi, her placement için birer alt test olmak üzere birkaç alt test olarak görünür. Alt testler `
2. Sağ üst köşede **Create A/B test** düğmesine tıklayın.
3. **A/B testi oluştur** penceresinde bir **Test adı** girin. Bu alan zorunludur. Sonuçları incelerken tespit edebilmek için testin ne hakkında olduğunu açıkça belirten bir ad seçin.
4. Neye ulaşmak istediğinizi açıklamak için **Test hedefi** alanını doldurun (örneğin, abonelikleri artırmak veya kayıpları azaltmak).
5. **Placement seç**'e tıklayın ve bir flow, paywall veya onboarding placement'ı seçin.
6. **Varyantlar** tablosunda test içeriğini ayarlayın. Her satır bir varyantı, her sütun bir placement'ı temsil eder. Her kesişim noktasına bir paywall ekleyin.
Varsayılan olarak, tablo 2 varyant ve 1 placement içerir. En fazla 20 varyant ekleyebilirsiniz. İkinci bir placement eklediğinizde test, Crossplacement A/B testine dönüşür. Crossplacement A/B testlerinin yalnızca paywall'lar için kullanılabildiğini unutmayın.
7. Testinizi kaydedin. İki seçeneğiniz var:
1. **Save as draft**: Test hemen yayına girmez. Placement veya A/B testi listesinden daha sonra başlatabilirsiniz. Yayına almadan önce kurulumu gözden geçirmek için kullanın.
2. **Run A/B test**: Testi hemen başlatır. Bu düğmeye tıkladığınız anda test yayına girer.
Taslak olarak kaydettikten sonra [A/B testi çalıştırma](#run-an-ab-test) adımına geçin.
## A/B testini düzenleme \{#edit-an-ab-test\}
Yalnızca taslak olarak kaydedilmiş A/B testlerini düzenleyebilirsiniz. Test yayına girdikten sonra değişiklik yapılamaz. Yayındaki bir testi güncellemek için **Modify** seçeneğini kullanın — bu, aynı adla bir kopya oluşturur ve üzerinde değişiklik yapabilirsiniz. Adapty orijinal testi durdurur; hem orijinal hem de değiştirilmiş sürümler analitikte ayrı ayrı görünür.
## A/B testi çalıştırma \{#run-an-ab-test\}
Adapty'de bir A/B testi çalıştırmak, kullanıcılara paywall ve onboarding göstermeye başlayabilmesi için testin bir placement'a atanması anlamına gelir.
1. Adapty ana menüsünden [A/B tests](ab-tests) bölümüne gidin.
2. Doğru listeyi görüntülediğinizden emin olun — **Paywall**, **Flow**, **Onboardings** ve **Crossplacement** A/B testleri, aralarında geçiş yapabileceğiniz ayrı sekmelerde gösterilir.
3. **Drafts** sekmesine geçin. Yalnızca taslak testler başlatılabilir.
4. Başlatmak istediğiniz testin yanında **Run A/B test** düğmesine tıklayın.
5. **Edit A/B test** penceresi açılır. Kurulumu gözden geçirin ve son değişiklikleri yapın. Placement veya kitle eksikse şimdi ekleyin.
6. Kurulumu inceledikten sonra başlatmak için **Run A/B test** düğmesine tıklayın.
Testi başlattıktan sonra, [A/B testi sonuçları ve metrikleri](results-and-metrics) sayfasında ilerlemeyi takip edebilir ve performans verilerini görüntüleyebilirsiniz.
## A/B testini durdurma \{#stop-an-ab-test\}
Bir A/B testini durdurduğunuzda test sona erer ve sonuçları inceleyebilirsiniz. Ayrıca test bittikten sonra etkilenen placement'larda kullanıcılara neyin gösterileceğine karar verirsiniz.
1. [A/B tests](https://app.adapty.io/ab-tests) bölümünü açın ve **Live** sekmesine gidin.
2. Durdurmak istediğiniz testin yanındaki üç nokta menüsüne tıklayın, ardından **Stop A/B test** seçeneğini seçin.
3. **Stop the A/B test** penceresinde test sona erdikten sonra ne olması gerektiğine karar verin. Üç seçeneğiniz var:
| Seçenek | Açıklama |
|---------|----------|
| Test edilen paywall/onboarding'lerden birini göster | Test sonuçlarına (gelir, en iyi olma olasılığı (**P2BB**) ve 1K kullanıcı başına gelir gibi) göre kazanan paywall veya onboarding'i seçin. Bu paywall veya onboarding, seçili placement ve kitle için gösterilecektir. |
| A/B testine katılmayan paywall/onboarding seç | Mevcut A/B testinin parçası olmayan herhangi bir paywall veya onboarding seçin. Test edilen varyantların hiçbiri hedeflerinizi karşılamadığında bunu kullanın. |
| Belirli bir paywall/onboarding gösterme | Seçili placement ve kitle için A/B testi sona erdikten sonra belirli bir paywall veya onboarding seçilmez. Bunun yerine, kitle önceliğine göre bir sonraki uygun paywall veya onboarding gösterilir. Manuel seçim yapmak yerine mevcut kurulumunuzun hangi paywall veya onboarding'i göstereceğine karar vermesini tercih ediyorsanız bu iyi bir seçenektir. |
:::note
A/B testini durdurmak geri alınamaz — test yeniden başlatılamaz. Durdurmaya karar vermeden önce yeterli veri topladığınızdan emin olun.
:::
4. **Stop and complete this A/B test** düğmesine tıklayın.
A/B testi tamamlandığında artık aktif olmayacak ve içindeki paywall veya onboarding'ler yeni kullanıcılara gösterilmeyecektir.
Test çalışırken katılan kullanıcıların performansını incelemek için [A/B testi metrikleri sayfasındaki](results-and-metrics#metrics-controls) sonuç ve metriklere erişmeye devam edebilirsiniz. Yeni satın alma veya gelir olayları bu kullanıcılara atfedildikçe metrikler güncellenmeye devam edebilir.
---
# File: ab-test-no-paywall-variants
---
---
title: "Flow veya paywall olmadan A/B testi varyantları ekleme"
description: "Bir varyantın flow veya paywall'ı atladığı bir A/B testi çalıştırın; gösterilip gösterilmeyeceğini kontrol etmek için remote config bayrağı kullanın."
---
Flow veya paywall'ınızın etkisini boş bir varyanta karşı A/B testi yaparak ölçebilirsiniz. Bir varyant flow/paywall'ı gösterir; diğeri hiçbir şey göstermez. Uygulamanız, render edip etmeyeceğine karar vermek için remote config'den bir bayrak okur.
## Nasıl çalışır \{#how-it-works\}
Kurulum, aynı placement içinde iki flow/paywall kullanır:
- **Flow/Paywall A**: Test etmek istediğiniz flow veya paywall; remote config'inde `show_paywall` değeri `true` olarak ayarlanmıştır.
- **Flow/Paywall B**: Remote config'inde `show_paywall` değeri `false` olarak ayarlanmış, boş bir flow veya paywall.
SDK bir flow veya paywall döndürdüğünde uygulamanız `show_paywall` bayrağını okur. Bayrak `true` ise uygulama onu render eder. Bayrak `false` ise uygulama render işlemini atlar ve kullanıcı hiçbir şey görmeden devam eder.
## 1. Placement'teki show_paywall bayrağını remote config'e ekleyin \{#1-add-the-show_paywall-flag-in-remote-config\}
Aynı placement içinde iki flow veya paywall'a ihtiyacınız var: Flow/Paywall A (test etmek istediğiniz) ve Flow/Paywall B (boş olan). Her ikisine de `show_paywall` alanı ekleyerek uygulamanızın her iki varyant için de aynı anahtarı kullanmasını sağlayın.
Bayrağı Flow/Paywall A'ya eklemek için:
1. Adapty ana menüsünde [**Flows**](https://app.adapty.io/flows)/[**Paywalls**](https://app.adapty.io/paywalls) bölümünü açın ve Flow/Paywall A'yı seçin.
2. **Remote config** bölümünü açın.
3. `show_paywall` adında ve `true` değerinde bir alan oluşturun. **JSON** görünümünde bu giriş şöyle görünür:
```json showLineNumbers
{
"show_paywall": true
}
```
4. Değişiklikleri kaydedin.
Aynı adımları Flow/Paywall B için tekrarlayın; ancak `show_paywall` değerini `false` olarak ayarlayın.
Remote config hakkında daha fazla bilgi için [Remote config ile flow'u özelleştirme](customize-flow-with-remote-config) veya [Remote config ile paywall tasarlama](customize-paywall-with-remote-config) sayfalarına bakın.
:::tip
Her iki varyantta da `show_paywall` ayarlamak, her iki grup için kod akışını özdeş tutar ve testi daha sonra daha fazla varyantla genişletmeyi kolaylaştırır.
:::
## 2. A/B testini kurma \{#set-up-the-ab-test\}
1. Placement üzerinde [bir A/B testi oluşturun](run_stop_ab_tests) ve her iki flow/paywall'ı varyant olarak ekleyin.
2. Flow/paywall'ı görüntüleyen kullanıcılar ile görmeyenler arasındaki trafiği bölmek için varyant ağırlıklarını ayarlayın.
## 3. Uygulamanızda bayrağı kontrol edin \{#check-the-flag-in-your-app\}
SDK tarafından döndürülen remote config'den `show_paywall` değerini okuyun. Bayrak `false` ise render işlemini atlayın ve kullanıcının devam etmesine izin verin.
:::note
Adapty, diğer para birimlerini [currencylayer.com](https://currencylayer.com/) döviz kuru üzerinden USD'ye çevirir (her 8 saatte bir güncellenir). Kur, **işlem anında sabitlenir** — sonraki değişiklikler dönüşüm sonucunu etkilemez.
:::
**Gelir**: Bu metrik, satın almalar ve yenilemelerden USD cinsinden elde edilen toplam tutarı gösterir; kullanıcılara yapılan iade tutarları bu rakamdan düşülür. Hem ilk satın almayı hem de sonraki abonelik yenilemelerini kapsar. Gelir metriği, her A/B testi varyantının finansal performansını değerlendirmenize ve hangisinin en fazla kazanç getirdiğini belirlemenize yardımcı olur.
[Paywall](paywall-metrics) metrikleri hakkında daha fazla bilgi edinin.
**En iyi olma olasılığı**: Adapty, A/B testi sonuçlarını analiz etmek için sağlam bir matematiksel analiz çerçevesi kullanır ve En iyi olma olasılığı adında bir metrik sunar. Bu metrik, belirli bir varyantın test edilen tüm varyantlar arasında en iyi performansı gösteren seçenek olma olasılığını (uzun vadeli gelir açısından) değerlendirir. Metrik, %1 ile %100 arasında değişen bir yüzde değeri olarak ifade edilir. Adapty'nin bu metriği nasıl hesapladığına dair ayrıntılı bilgi için [dokümantasyona](maths-behind-it) bakabilirsiniz. 1.000 kullanıcı başına gelir açısından en iyi performansı gösteren seçenek yeşil renkte vurgulanır ve otomatik olarak varsayılan seçim olarak belirlenir.
**1.000 kullanıcı başına gelir**: 1.000 kullanıcı başına gelir metriği, her A/B testi varyantı için 1.000 kullanıcı başına elde edilen ortalama geliri hesaplar. Bu metrik, toplam kullanıcı sayısından bağımsız olarak varyantlarınızın gelir verimliliğini anlamanıza yardımcı olur. Farklı varyantların performansını standart bir ölçekte karşılaştırmanıza ve gelir üretimi verimliliğine dayalı bilinçli kararlar almanıza olanak tanır.
**1.000 kullanıcı başına gelir için tahmin aralıkları**: 1.000 kullanıcı başına gelir metriği aynı zamanda tahmin aralıklarını da içerir. Bu tahmin aralıkları, mevcut veriler ve istatistiksel analize dayanarak belirli bir varyant için 1.000 kullanıcı başına gerçek gelirin düşeceği öngörülen aralığı temsil eder.
A/B testi bağlamında, farklı varyantların ürettiği geliri analiz ederken her varyant için 1.000 kullanıcı başına ortalama geliri hesaplıyoruz. Kullanıcılar arasında gelir farklılıkları olabileceğinden, tahmin aralıkları; tahmin süreciyle ilişkili değişkenliği ve belirsizliği göz önünde bulundurarak 1.000 kullanıcı başına düşen gelir için makul değerlere dair net bir gösterge sunar.
1.000 kullanıcı başına gelir metriğine tahmin aralıklarını dahil ederek Adapty, olası gelir sonuçlarının aralığını göz önünde bulundurarak A/B testi varyantlarınızın gelir verimliliğini değerlendirmenizi sağlar. Bu bilgi, tahmin sürecindeki belirsizliği ve 1.000 kullanıcı başına gelir için makul değerleri hesaba katarak veri odaklı kararlar almanıza ve abonelik stratejinizi etkili biçimde optimize etmenize yardımcı olur.
Bu metrikler, A/B testi varyantlarınızın finansal performansı, istatistiksel önemi ve gelir verimliliği hakkında bilgi edinmenizi sağlar; böylece veriye dayalı kararlar alabilir ve abonelik stratejinizi daha etkin biçimde optimize edebilirsiniz.
## A/B testi metrikleri \{#ab-test-metrics\}
Adapty, paywall veya onboarding varyantlarınız üzerinde yürüttüğünüz A/B testinin performansını etkili biçimde ölçmenize yardımcı olan kapsamlı bir metrik seti sunar. Bu metrikler, görüntülemeler hariç gerçek zamanlı olarak sürekli güncellenir; görüntülemeler ise periyodik olarak güncellenir. Bu metrikleri anlamak, farklı varyantların etkinliğini değerlendirmenize ve paywall veya onboarding stratejinizi optimize etmek için veriye dayalı kararlar almanıza yardımcı olur.
A/B testi metrikleri, tüm A/B testlerinizin performansına genel bir bakış sunan A/B testi listesinde mevcuttur. Bu kapsamlı görünüm, her test varyantı için toplu metrikler sunarak performanslarını karşılaştırmanıza ve önemli farklılıkları tespit etmenize olanak tanır. Her A/B testinin daha ayrıntılı analizi için A/B Testi detay metriklerine erişebilirsiniz. Bu bölüm, seçilen A/B testine özgü derinlemesine metrikler sunarak bireysel varyantların performansını incelemenizi sağlar.
Görüntülemeler dışındaki tüm metrikler, paywall veya onboarding içindeki ürüne atfedilir.
## Metrik kontrolleri \{#metrics-controls\}
Sistem, metrikleri seçilen zaman dilimine göre görüntüler ve üç girinti düzeyi olan sol sütun parametresine göre düzenler.
### Profil kurulum tarihi filtreleme \{#profile-install-date-filtration\}
**Metrikleri yükleme tarihine göre filtrele** onay kutusu, metrikleri varsayılan filtreler yerine profil yükleme tarihine göre filtrelemenizi sağlar. Varsayılan filtreler, işlemler için deneme/satın alma tarihini; paywall veya onboarding görüntülemeleri için ise görüntülenme tarihini kullanır. Bu onay kutusunu seçerek, metrikleri profil yükleme tarihiyle hizalayabilir ve belirli bir dönemdeki kullanıcı edinme performansını daha net ölçebilirsiniz. Bu seçenek, metrik analizini kendi ihtiyaçlarınıza göre özelleştirmek için kullanışlıdır.
### Zaman aralıkları \{#time-ranges\}
Metrik verilerini analiz etmek için çeşitli zaman dilimlerinden birini seçebilirsiniz; bu sayede günler, haftalar, aylar veya özel tarih aralıkları gibi belirli sürelere odaklanabilirsiniz.
### Mevcut filtreler ve gruplama \{#available-filters-and-grouping\}
:::link
Ana makale: [Analytics kontrolleri](controls-filters-grouping-compare-proceeds)
:::
Adapty, metrik analizini ihtiyaçlarınıza göre özelleştirmek ve filtrelemek için güçlü araçlar sunar. Adapty'nin metrik sayfasında çeşitli zaman aralıklarına, gruplama seçeneklerine ve filtreleme olanaklarına erişebilirsiniz.
- ✅ Şuna göre filtrele: Kitle, attribution, ülke, paywall, paywall durumu, paywall grubu, onboarding, placement, ülke, mağaza, ürün ve ürün mağazası.
- ✅ Şuna göre grupla: Ürün ve mağaza.
:::note
A/B testine göre filtrelediğinizde, çapraz placement A/B testleri her placement için ayrı alt testler olarak görünür (örn. `My test child-0`, `My test child-1`). Ayrıntılar için [Çapraz placement A/B testi sınırlamaları](ab-test-types#crossplacement-ab-test-limitations) bölümüne bakın.
:::
## Tekil metrik grafiği \{#single-metrics-chart\}
Paywall veya onboarding metrik sayfasının temel bileşenlerinden biri, seçilen metrikleri görsel olarak sunan ve analizleri kolaylaştıran grafik bölümüdür.
A/B testi metrik sayfasındaki grafik bölümü, seçilen metrik değerlerini görsel olarak temsil eden yatay bir çubuk grafik içerir. Grafikteki her çubuk bir metrik değere karşılık gelir ve boyutu orantılı olduğundan verileri bir bakışta anlamak kolaylaşır. Yatay çizgi analiz edilen zaman dilimini, dikey sütun ise metriklerin sayısal değerlerini gösterir. Tüm metrik değerlerinin toplam değeri grafiğin yanında görüntülenir.
Ayrıca, grafik bölümünün sağ üst köşesindeki ok simgesine tıklamak görünümü genişleterek seçilen metrikleri grafiğin tam satırında gösterir.
## A/B testi özeti \{#ab-test-summary\}
Tekli metrik grafiğinin yanında, A/B testinin durumu, süresi, placement'ları ve diğer ilgili ayrıntıları hakkında bilgi içeren A/B testi detay özeti bölümü görüntülenir.
## Metrik tanımları \{#metrics-definitions\}
A/B testleri için kullanılabilen temel metrikler şunlardır:
### Gelir \{#revenue\}
Gelir, A/B testinden kaynaklanan satın alma ve yenileme işlemlerinden USD cinsinden elde edilen toplam para miktarını temsil eder. İlk satın alma ve ardından gelen abonelik yenilemelerini kapsar. Gelir metriği, App Store veya Play Store komisyonu düşülmeden önce hesaplanır.
[Paywall](paywall-metrics#revenue) gelir metrikleri hakkında daha fazla bilgi edinin.
### Satın almalara dönüşüm oranı (CR to purchases) \{#cr-to-purchases\}
Satın almalara dönüşüm oranı, A/B testinizin görüntülemeleri gerçek satın almalara dönüştürmedeki etkinliğini ölçer. Satın alma sayısının görüntüleme sayısına bölünmesiyle hesaplanır. Örneğin 10 satın alma ve 100 görüntüleme varsa satın almalara dönüşüm oranı %10 olur.
### Deneme dönüşüm oranı (CR trials) \{#cr-trials\}
Denemelere dönüşüm oranı (CR), A/B testinden başlatılan deneme sayısının görüntüleme sayısına bölünmesiyle elde edilir. Denemelere dönüşüm oranı, A/B testinizin görüntülemeleri deneme aktivasyonlarına dönüştürmedeki etkinliğini ölçer.
### Satın almalar (Purchases) \{#purchases\}
Satın almalar metriği, A/B testi sonucunda paywall veya onboarding içinde gerçekleştirilen toplam işlem sayısını temsil eder. Aşağıdaki satın alma türlerini kapsar:
- Yeni satın almalar.
- Aktive edilen denemelerin satın almaya dönüşmesi.
- Aboneliklerin indirgenmesi, yükseltilmesi ve çapraz geçişleri.
- Abonelik yenilemeleri (ör. otomatik yenileme olmaksızın süresi dolan bir aboneliğin sonradan yenilenmesi).
Yenilemelerin satın almalar metriğine dahil edilmediğini lütfen unutmayın.
### Denemeler (Trials) \{#trials\}
Denemeler metriği, A/B testi sonucunda aktive edilen toplam deneme sayısını gösterir.
### İptal edilen denemeler (Trials cancelled) \{#trials-cancelled\}
İptal edilen denemeler metriği, otomatik yenilemenin kapatıldığı deneme sayısını temsil eder. Bu durum, kullanıcıların denemeden manuel olarak abonelik iptali yapması sonucunda gerçekleşir.
### İadeler (Refunds) \{#refunds\}
A/B testi için iadeler, test edilen varyasyonlarla doğrudan ilişkili iade edilen satın alma ve abonelik sayısını temsil eder.
### Görüntülemeler (Views) \{#views\}
Görüntülemeler, A/B testinin kapsadığı paywall veya onboarding'lerin görüntülenme sayısıdır. Kullanıcı iki kez ziyaret ederse bu iki ziyaret olarak sayılır.
### Tekil görüntülemeler (Unique views) \{#unique-views\}
Tekil görüntülemeler, paywall veya onboarding'in kaç benzersiz kullanıcı tarafından görüntülendiğini gösterir. Kullanıcı iki kez ziyaret etse bile bu bir tekil görüntüleme olarak sayılır.
### En iyi olma olasılığı (Probability to be the best) \{#probability-to-be-the-best\}
En iyi olma olasılığı metriği, bir A/B testindeki belirli bir varyantın test edilen tüm paywall'lar veya onboarding'ler arasında en iyi performans gösteren seçenek olma ihtimalini sayısal olarak ifade eder. Her paywall veya onboarding'in göreli performansını gösteren sayısal bir olasılık sunar. Metrik, %1 ile %100 arasında yüzde değeri olarak ifade edilir.
### ARPU (Kullanıcı başına ortalama gelir) \{#arpu-average-revenue-per-user\}
Yalnızca onboarding A/B testleri için. Belirli bir dönemde her kullanıcıdan elde edilen ortalama geliri ölçer. Toplam gelirin benzersiz kullanıcı sayısına bölünmesiyle hesaplanır.
### ARPPU (Ödeme yapan kullanıcı başına ortalama gelir) \{#arppu-average-revenue-per-paying-user\}
ARPPU, A/B testi sonucunda ödeme yapan kullanıcı başına ortalama geliri ifade eder. Toplam gelirin benzersiz ödeme yapan kullanıcı sayısına bölünmesiyle hesaplanır. Örneğin 1.000 ödeme yapan kullanıcıdan 15.000 USD gelir elde ettiyseniz ARPPU 15 USD olur.
### ARPAS (Aktif abone başına ortalama gelir) \{#arpas-average-revenue-per-active-subscriber\}
ARPAS, A/B testini yürütmekten elde edilen aktif abone başına ortalama geliri ölçmenizi sağlayan bir metriktir. Toplam gelirin deneme veya abonelik aktive eden abone sayısına bölünmesiyle hesaplanır. Örneğin toplam gelir 5.000 USD ve 1.000 aboneniz varsa ARPAS 5 USD olur. Bu metrik, abone başına ortalama para kazanma potansiyelini değerlendirmeye yardımcı olur.
### Hasılat (Proceeds) \{#proceeds\}
A/B testi için hasılat metriği, geçerli App Store / Play Store komisyonu düşüldükten sonra satın almalar ve yenilemelerden uygulama sahibinin USD cinsinden elde ettiği gerçek tutarı temsil eder. Doğrudan uygulamanın kazançlarına katkıda bulunan, A/B testinde denenen varyasyonlarla ilişkili net geliri yansıtır. Hasılatın nasıl hesaplandığına ilişkin daha fazla bilgi için Adapty [dokümantasyonuna](analytics-cohorts#revenue-vs-proceeds) başvurabilirsiniz.
### Tekil aboneler (Unique subscribers) \{#unique-subscribers\}
Tekil aboneler metriği, A/B testindeki varyasyonlar aracılığıyla abone olan veya deneme aktive eden farklı bireylerin sayısını temsil eder. Başlattıkları abonelik veya deneme sayısından bağımsız olarak her aboneyi yalnızca bir kez sayar.
### Tekil ödeme yapan aboneler (Unique paid subscribers) \{#unique-paid-subscribers\}
Tekil ödeme yapan aboneler metriği, A/B testindeki varyasyonlar aracılığıyla bir satın alma işlemini başarıyla tamamlayarak ödeme yapan abone haline gelen benzersiz kişi sayısını temsil eder.
### İade oranı (Refund rate) \{#refund-rate\}
A/B testi için iade oranı, testteki varyasyonlarla doğrudan ilişkili iade sayısının ilk kez yapılan satın alma sayısına (yenilemeler hariç) bölünmesiyle hesaplanır. Örneğin 5 iade ve 1.000 ilk kez satın alma varsa iade oranı %0,5 olur.
### Tekil satın alma dönüşüm oranı (Unique CR purchases) \{#unique-cr-purchases\}
A/B testi için tekil satın alma dönüşüm oranı, testteki varyasyonlarla ilişkili satın alma sayısının tekil görüntüleme sayısına bölünmesiyle hesaplanır. Örneğin 10 satın alma ve 100 tekil görüntüleme varsa tekil satın alma dönüşüm oranı %10 olur.
### Tekil deneme dönüşüm oranı (Unique CR trials) \{#unique-cr-trials\}
A/B testi için tekil deneme dönüşüm oranı, testteki varyasyonlarla ilişkili başlatılan deneme sayısının tekil görüntüleme sayısına bölünmesiyle hesaplanır. Örneğin 30 başlatılan deneme ve 100 tekil görüntüleme varsa tekil deneme dönüşüm oranı %30 olur.
### Tamamlamalar ve tekil tamamlamalar (Completions & unique completions) \{#completions--unique-completions\}
Yalnızca onboarding A/B testleri için. Tamamlamalar, kullanıcıların A/B testindeki varyasyonlar aracılığıyla onboarding'i tamamlama (yani ilk ekrandan son ekrana geçme) sayısını sayar. Biri iki kez tamamlarsa bu iki **tamamlama** ancak bir **tekil tamamlama** sayılır.
### Tekil tamamlama oranı (Unique completions rate) \{#unique-completions-rate\}
Yalnızca onboarding A/B testleri için. Tekil tamamlama sayısının tekil görüntüleme sayısına bölünmesiyle elde edilir. Bu metrik, insanların A/B testindeki varyasyonlar aracılığıyla onboarding ile nasıl etkileşime girdiğini anlamanıza ve onboarding'in görmezden gelindiğini fark ettiğinizde değişiklik yapmanıza yardımcı olur.
---
# File: maths-behind-it
---
---
title: "A/B testlerinin arkasındaki matematik"
description: "Daha iyi gelir analizleri için abonelik analitiğinin arkasındaki matematiği anlayın."
---
A/B testi, bir flow, paywall veya onboarding'in iki farklı versiyonunun performansını karşılaştırmak için kullanılan güçlü bir tekniktir. Temel amaç, 12 aylık dönemde kullanıcı başına ortalama gelire dayanarak hangi versiyonun daha etkili olduğunu belirlemektir. Ancak veri toplamak ve karar vermek için tam bir yıl beklemek pratik değildir. Bu nedenle, hedef metriği yaklaşık olarak temsil etmek amacıyla geçmiş veri analizine dayanan bir vekil metrik olarak kullanıcı başına 2 haftalık gelir kullanılmaktadır. Doğru ve güvenilir sonuçlar elde etmek için farklı veri türlerini işleyebilen sağlam bir istatistiksel yöntem kullanmak kritik önem taşır. Modern veri analizinde popüler bir yaklaşım olan Bayesci istatistik, A/B testi için esnek ve sezgisel bir çerçeve sunar. Bayesci yöntemler, önceki bilgiyi dahil ederek yeni verilerle güncellemek suretiyle belirsizlik altında daha iyi kararlar alınmasına olanak tanır. Bu belge, Adapty'nin A/B testi sonuçlarını değerlendirmede ve veri odaklı karar alma süreçlerine değerli içgörüler sunmada kullandığı matematiksel analize kapsamlı bir rehber niteliği taşımaktadır.
## Adapty'nin istatistiksel analiz yaklaşımı \{#adaptys-approach-to-statistical-analysis\}
Adapty, A/B testlerinin performansını değerlendirmek ve doğru, güvenilir içgörüler sunmak için kapsamlı bir istatistiksel analiz yaklaşımı benimser. Metodolojimiz şu temel adımlardan oluşur:
1. **Metrik tanımı:** Bir A/B testini başarıyla yürütmek için analizin belirli hedef ve amaçlarıyla örtüşen temel metriği tanımlamanız gerekir. Adapty, 1 yıl sonraki ortalama gelir şeklindeki uzun vadeli hedef için hangi metriğin proxy görevi üstlendiğini belirlemek amacıyla büyük miktarda abonelik uygulaması tarihsel verisinden yararlandı; bu metrik 14 günlük ARPU olarak belirlendi.
2. **Hipotez oluşturma:** A/B testi için iki hipotez oluşturuyoruz. Sıfır hipotezi (H0), kontrol grubu (A) ile test grubu (B) arasında anlamlı bir fark olmadığını varsayar. Alternatif hipotez (H1), iki veya daha fazla grup arasında anlamlı bir fark bulunduğunu öne sürer.
3. **Dağılım seçimi:** Verinin özelliklerine ve gözlemlediğimiz metriğe göre en uygun dağılım ailesini seçiyoruz. Buradaki en yaygın tercih, sıfır değerleri de göz önünde bulundurularak log-normal dağılımıdır.
4. **En iyi olma olasılığı hesabı:** Bayesci A/B testi yaklaşımını kullanarak, teste katılan her paywall veya onboarding varyantı için en iyi seçenek olma olasılığını hesaplıyoruz. Bu değer daha önce kullandığımız p-değerleriyle ilişkilidir; ancak özünde farklı, daha sağlam ve anlaşılması daha kolay bir yaklaşımdır.
5. **Sonuçların yorumlanması:** En iyi olma olasılığı tam olarak adından anlaşıldığı gibidir. Olasılık ne kadar yüksekse, belirli bir seçeneğin iş için en iyi tercih olma ihtimali o kadar artar. Karar alma eşiğini kendiniz belirlemeniz gerekir; bu eşik, durumunuza özgü pek çok faktöre bağlı olmalıdır. Yaygın bir olasılık eşiği ise %95'tir.
6. **Tahmin aralıkları:** Adapty, her grup için performans metriklerine ilişkin tahmin aralıkları hesaplar ve gerçek popülasyon parametresinin büyük olasılıkla düşeceği bir değer aralığı sunar. Bu, tahmini performans metrikleriyle ilişkili belirsizliği ölçümlendirmeye yardımcı olur.
## Örneklem büyüklüğünün belirlenmesi \{#sample-size-determination\}
Güvenilir ve kesin A/B testi sonuçları için uygun bir örneklem büyüklüğü belirlemek kritik öneme sahiptir. Adapty, yeterli bir örneklem büyüklüğünü sağlamak amacıyla Bayesci yaklaşım altında da önemini koruyan istatistiksel güç ve beklenen etki büyüklüğü gibi faktörleri göz önünde bulundurur. Şu anda kullandığımız Bayesci yaklaşıma özgü gerekli örneklem büyüklüğünü tahmin etme yöntemleri, analizin güvenilirliğini güvence altına alır.
A/B testlerinin işlevselliği hakkında daha fazla bilgi edinmek için [A/B testi oluşturma](ab-tests) ve [A/B testi çalıştırma](run_stop_ab_tests) belgelerimize, ayrıca çeşitli [A/B testi metrikleri ve sonuçlarına](results-and-metrics) ilişkin kaynaklarımıza başvurmanızı öneririz.
Adapty'nin A/B testlerine yönelik analitik çerçevesi artık Bayesci bir yaklaşım benimsemektedir; ancak odak noktası yine metriklerin tanımlanması, hipotezlerin oluşturulması ve dağılımların seçilmesi üzerindedir. Artık p-değerleri hesaplamak yerine, posterior dağılımları hesaplıyor ve her varyantın en iyi olma olasılığını belirliyoruz. Ayrıca tahmin aralıklarını da hesaplıyoruz. Bu güncellenmiş yaklaşım, kapsamlı ve daha da sağlam olmayı sürdürürken, daha sezgisel ve yorumlaması daha kolay içgörüler sunmak üzere tasarlanmıştır. Amaç, işletmelere A/B testlerinin sağlam istatistiksel analizine dayalı olarak stratejilerini optimize etme, performansı iyileştirme ve büyümeyi destekleme konularında güç kazandırmak olmaya devam etmektedir.
---
# File: autopilot-how-it-works
---
---
title: "AI Büyüme Danışmanı: Nasıl çalışır?"
description: "AI Büyüme Danışmanı'nın arkasındaki mantığı anlayın ve gelirinizi artırmak için bize güvenin."
---
[AI Growth Advisor](autopilot), gerçek performans verilerinize ve pazarınızdaki benzer uygulamaların nasıl performans gösterdiğine dayanarak hangi deneyleri çalıştırmanız gerektiğini belirlemenize yardımcı olur. Neyin işe yarayabileceğini tahmin etmek yerine, sonuçlarınızı iyileştirme olasılığı daha yüksek olan testler için spesifik öneriler alırsınız.
Bu makale, AI Growth Advisor'ın nasıl düşündüğüne şeffaf bir bakış sunuyor — hangi verileri kullandığını, fırsatları nasıl değerlendirdiğini ve neden belirli önerilerin ortaya çıktığını açıklıyor. Amaç, onu büyüme iş akışınızın bir parçası olarak kullanırken güvenle yararlanmanızı sağlamaktır.
## AI Growth Advisor aslında ne yapar \{#what-ai-growth-advisor-actually-does\}
AI Growth Advisor, gelirinizi artırma ihtimali en yüksek deneyleri bulmak için uygulamanızın ve paywall metriklerinizin analizini yapar. Şunlara bakar:
- **Mevcut kurulumunuz**: fiyatlandırma, denemeler, ürünler ve bunların ne kadar iyi dönüştüğü
- **Pazar örüntüleri**: benzer uygulamaların tekliflerini nasıl yapılandırdığı ve ne kadar ücret talep ettiği
- **Test geçmişiniz**: hangi deneyleri zaten çalıştırdığınız ve bunların neler ortaya koyduğu
- **Büyüme potansiyeli**: hangi değişikliklerin fark yaratma ihtimalinin en yüksek olduğu
Growth Advisor, tüm bu faktörleri birlikte değerlendirmek ve hemen başlatabileceğiniz A/B testlerine dönüştürmek için yapay zekâdan yararlanır. Rakip araştırması yapmadan veya sırada ne test edeceğinizi tahmin etmeden hazır bir plan elde edersiniz.
## AI Büyüme Danışmanı'nın arkasındaki veriler \{#the-data-behind-ai-growth-advisor\}
Her öneri, birlikte çalışan üç ana veri kaynağından oluşturulur.
#### Uygulamanızın kendi verileri \{#your-apps-own-data\}
AI Büyüme Danışmanı, uygulamanızın bugünkü performansına bakar:
- Paywalllarınızdaki dönüşüm metrikleri
- Fiyatlandırma ve ürün yapısı
Bu, AI Büyüme Danışmanı'na herhangi bir değişiklik önermeden önce üzerinden çalışabileceği bir temel sağlar.
:::note
Uygulamanızın performans verilerini diğer uygulamalar için öneri eğitiminde kullanmıyoruz. Verileriniz gizli kalır.
:::
#### Paywall analizi \{#paywall-analysis\}
AI Growth Advisor, ödeme ekranınızın ekran görüntüsünü analiz eder ve tasarımını, kategorinizdeki en iyi performans gösteren uygulamaların kullandığı yerleşik kalıplarla karşılaştırır. Yerleşim seçeneklerini, metni, abonelik dökümanlarını ve tasarruf rozetleri veya inceleme bölümleri gibi dönüşüm odaklı unsurları değerlendirir.
Bu analiz iki tür öneri üretir:
- **Kıyaslama tabanlı öneriler** — en iyi performans gösteren uygulamaların neler yaptığına dayanır ve her biri somut bir istatistikle desteklenir (örneğin, "En iyi performans gösteren Eğitim uygulamalarının %72'si tarafından kullanılıyor").
- **Görsel analiz önerileri** — yapay zeka tarafından ekran görüntünüzden üretilir; metin iyileştirmeleri, düzen değişiklikleri ve diğer tasarım ayarlamalarını kapsar.
Bu öneriler, [büyüme planınıza](autopilot-growth-plan#view-the-growth-plan) doğrudan hipotez olarak aktarılır ve [A/B testi olarak başlatabilirsiniz](autopilot-execute-plan).
#### Rakip verileri \{#competitor-data\}
AI Growth Advisor, fiyatlandırma, abonelik yapıları ve kategorinizdeki yaygın kalıplar gibi genel bilgileri kullanarak kurulumunuzu pazarınızdaki benzer uygulamalarla karşılaştırır. Rakip fiyatlandırması ve yapıları pazardan pazara farklılık gösterdiğinden, bu karşılaştırmalar ülkeye özeldir. Rakip fiyatlandırması, metrik analizinde kullanılan anonimleştirilmiş Adapty ağı verilerinden farklı olarak App Store gibi üçüncü taraf ve kamuya açık kaynaklardan alınır.
Bu şekilde, rastgele fikirler yerine sizinle aynı kategorideki uygulamalarda zaten işe yarayan stratejileri test ediyorsunuz. Analizi gördüğünüzde, kendi metriklerinizi ve rakip fiyatlarını yan yana karşılaştırabilirsiniz. Benzer uygulamalar farklı bir fiyatlandırma veya yapıyla daha iyi sonuç alıyorsa, aynı yaklaşımın sizin için de işe yarayabileceğinin güçlü bir işareti.
:::tip
AI Growth Advisor, gerçekçi biçimde rekabet edebileceğiniz uygulamalara göre ilgili rakipleri otomatik olarak seçer. Genel olarak bu önerilere bağlı kalmanızı tavsiye ederiz; çok ileride ya da çok geride olan uygulamaları listeye eklemeyin. Uygulamanız birden fazla kategoriye giriyorsa, en ilgili pazar segmentine odaklanmak için listeyi düzenlemek isteyebilirsiniz.
:::
#### Sektör kıyaslamaları \{#industry-benchmarks\}
AI Growth Advisor, belirli bir ülkedeki kategori ortalamasıyla nasıl karşılaştırıldığınızı göstermek için Adapty tarafından takip edilen 20.000 abonelik uygulamasından elde edilen anonimleştirilmiş verileri kullanır. Veriler ağ genelinde toplanır ve hiçbir zaman belirli bir uygulamaya bağlanmaz.
Örneğin, dönüşüm huniniz ve yükleme başına geliriniz, kategorinizdeki ve ülkenizdeki uygulamaların ortalamasıyla karşılaştırılır. Bu sayede ortalamanın altında mı, ortalama düzeyde mi yoksa önde mi olduğunuzu görebilirsiniz.
#### Coğrafi pazar verileri \{#geographic-market-data\}
AI Growth Advisor, bireysel coğrafi pazarları analiz eder — 20.000 uygulamalık Adapty ağındaki örüntülerden yararlanarak — bölgesel fiyat ayarlamalarının daha fazla gelir sağlayabileceği yerleri tespit eder. Her ülke için şunları değerlendirir:
- **Dönüşüm oranı**: Yüklemeden ödemeye geçiş oranının küresel ortalama ile karşılaştırması. Daha yüksek bir oran fiyatları artırmaya alan olduğuna işaret edebilir; daha düşük bir oran ise fiyat hassasiyetine işaret edebilir.
- **Fiyat endeksi**: Ülkenin, halkın satın alma gücünü gösteren [Adapty Fiyat Endeksi](https://uploads.adapty.io/adapty_pricing_index.pdf)'ndeki konumu.
[coğrafi fiyatlandırma önerilerinden](autopilot-growth-plan#geo-pricing-hypotheses) büyüme planınızdaki A/B testleri oluşturarak bu tavsiyelere göre harekete geçebilirsiniz.
## AI Growth Advisor'ın önerileri nasıl belirlediği \{#how-ai-growth-advisor-decides-what-to-recommend\}
AI Growth Advisor, paywall dönüşümünüzü artırmak için bir öneri havuzu oluşturur. Bu öneriler, her değişikliğin etkisini güvenilir biçimde ölçebilmek amacıyla birer birer test edilecek şekilde tasarlanmıştır.
AI Growth Advisor'ın önerileri nasıl oluşturduğu aşağıda açıklanmıştır:
1. **En büyük fırsatları bul**
AI Growth Advisor, fiyatlandırmanızı, ürünlerinizi ve dönüşüm hunisi performansınızı inceleyerek bunları sektör kalıpları ve benzer uygulamalarla karşılaştırır. Analiz, yalnızca USD değil, birincil pazarınızın para biriminde çalışır; böylece fiyat önerileri, abonelerinizin gerçekten ödediği tutarlara uygun olur. Fiyatı ayarlamak, deneme süresi eklemek veya teklif yapısını değiştirmek gibi en fazla iyileştirme yapabileceğiniz noktaları belirler.
2. **Sonraki deneyi seçin**
Her hipotez, mevcut test geçmişinize dayanılarak oluşturulur. AI Growth Advisor, hangi deneyleri zaten yürüttüğünüzü, hangilerinin kazandığını ve hangi yönlerin hâlâ keşfedilmeye değer olduğunu bilir. Bir sonraki öneri, belirli bir sırayı takip etmek yerine bir öncekinin ortaya çıkardıkları üzerine inşa edilir.
3. **Kazanan ile rakip arasında testler yürütün**
Her deneyden sonra kazanan yeni temeliniz olur. Bu sonuç, büyüme planınızdaki bir sonraki öneriyi şekillendirir — AI Growth Advisor işe yarayanları korur, işe yaramayanları eler ve oradan bir sonraki testi seçer.
4. **Pratik tutun**
AI Growth Advisor yalnızca mevcut ürün ve kurulumunuzla ya da yeni bir ürün oluşturmak veya fiyatı değiştirmek gibi küçük değişikliklerle hayata geçirebileceğiniz testler önerir. Amaç, testleri hızlı ve yönetilebilir tutmaktır.
5. **Size gerekçeyi gösterir**
Her öneri için AI Growth Advisor, bu testin neden çalıştırmaya değer olduğunu tam olarak açıklayan net bir hipotez sunar. Mevcut metriklerinizin rakipler ve sektör ortalamaları ile nasıl karşılaştırıldığını, fırsatın ne olduğunu ve hangi temel metriklerin iyileşmesini beklediğimizi göreceksiniz.
Bu, her testin size bir şeyler öğrettiği ve sizi daha etkili bir paywall'a doğru götürdüğü tekrarlanabilir bir deneyim sürecine dönüştürür.
## Her deneyin ardından ne olur \{#what-happens-after-each-experiment\}
Öneriler tükenmez. Tamamlanan her test, yeni deneylerin temeli haline gelir. Test etmeye devam ettiğiniz sürece AI Growth Advisor, sırada ne denemeniz gerektiğini önermeyi sürdürür.
Temel piyasa verilerini yenilemek için aynı placement üzerinde analizi yeniden çalıştırın. Her yeni çalıştırma; güncel rakip fiyatlandırmasını, dönüşüm kıyaslamalarını ve kategori trendlerini çeker; yeni tespit edilen hipotezleri mevcut büyüme planınıza ekler, var olanları değiştirmez. Yapay zeka tarafından oluşturulan mevcut hipotezleriniz, özel hipotezleriniz ve devam eden A/B testleriniz yeniden çalıştırmalar boyunca korunur.
Temel çizginizi optimize ettikten sonra, daha gelişmiş rakipler karşısında da rekabet etmeyi tercih edebilirsiniz. Bu yinelemeli yaklaşım, uygulamanız büyüdükçe ve pazar değiştikçe gelirinizi en üst düzeye çıkarmanıza yardımcı olur.
:::tip
Denemek ister misiniz? Paywalllarınızı analiz etmek ve A/B testleri içeren bir büyüme planı oluşturmak için [AI Growth Advisor](autopilot-analysis)'ı başlatın. Karmaşık testleri sorunsuzca başlatmak için [yerleşik sihirbazı](autopilot-execute-plan) kullanın: ürün oluşturma, paywall kopyalama ve segment kurulumu süreçlerinde size rehberlik edecektir.
:::
---
# File: autopilot-analysis
---
---
title: "Paywall ve Pazar Analizi"
description: "Uygulamanıza özel, veriye dayalı bir büyüme planı oluşturun."
---
AI Growth Advisor analizini çalıştırmak ve bir büyüme planı oluşturmak için bu makaledeki adımları izleyin.
Hedef placement için daha önce bir büyüme planı oluştturduysanız, bu analiz aralarından seçim yapabileceğiniz yeni hipotezler üretecektir.
:::tip
Başlamadan önce [analize ilişkin gereksinimleri](autopilot#prerequisites) karşıladığınızdan emin olun.
:::
## Paywall Analizi \{#paywall-analysis\}
### Analiz için bir paywall seçin \{#select-a-paywall-for-analysis\}
1. **AI Growth Advisor** sayfasını açın ve [Get Growth plan](https://app.adapty.io/ab-tests/analysis/start) düğmesine tıklayın.
2. **Paywall Diagnostic** sayfasında, açılır menülerden bir **Placement** ve **Paywall** seçin. Adapty, en yüksek gelirli placement'ı ve ona ait en iyi paywall'u otomatik olarak önceden seçer. Farklı bir paywall analiz etmek için önce placement'ı değiştirin.
3. Bir ekran görüntüsü yükleyin. AI Growth Advisor, paywall tasarımınızı ve içeriğinizi analiz etmek için bir ekran görüntüsüne ihtiyaç duyar.
4. Paywall'ın aktif ürünlerini inceleyin. Sağdaki ürün kartları, her ürünün abonelik süresini, fiyatını ve deneme süresini gösterir.
5. Devam etmek için **Confirm & Analyze** düğmesine tıklayın. Adapty, paywall'ınızı analiz eder ve tanılama raporunu görüntüler.
### Paywall analiz raporu \{#paywall-analysis-report\}
Bir paywall seçip ekran görüntüsü yükledikten sonra Adapty, paywallınızı yerleşik tasarım kalıpları açısından analiz ederek hem iyi tercihleri hem de iyileştirme fırsatlarını öne çıkarır.
#### Neler iyi çalışıyor \{#whats-working-well\}
Bu bölüm, dönüşümü en üst düzeye çıkaran yerleşik kalıpları nasıl kullandığınızı vurgular. Örneğin: görünür bir tasarruf rozeti, öne çıkan bir kullanıcı yorumu bölümü veya açık abonelik özeti.
#### Paywallınızda düzeltilmesi gerekenler \{#what-to-fix-on-your-paywall\}
Adapty önerilerini iki kategoriye ayırır:
- **Kıyaslamalı öneriler**: Kategorinizdeki en başarılı uygulamaları temel alan, veriye dayalı öneriler. Her öneri bir kıyaslama istatistiği (örneğin, "En başarılı Eğitim uygulamalarının %72'si tarafından kullanılıyor") ve neyi değiştireceğinize dair bir açıklama içerir.
- **Görsel analiz önerileri**: Paywall ekran görüntünüzü temel alan, yapay zeka tarafından üretilen öneriler. Bunlar; metin iyileştirmeleri, düzen değişiklikleri ve daha fazlasını içerir.
:::tip
[Büyüme planınız](autopilot-growth-plan#view-the-growth-plan), kıyaslanmış önerilere dayalı hipotezler içerecektir. Görsel analiz önerilerini plana manuel olarak ekleyebilirsiniz.
:::
Devam etmek için **Get Market Insights** düğmesine tıklayın.
## Pazar ve Rakip Analizi \{#market-and-competitor-analysis\}
:::note
Pazar ve rakip analizi, önce [paywall analizinin](#paywall-analysis) tamamlanmasını gerektirir.
:::
Market Insights analizi, uygulamanızın fiyatlandırma ve dönüşüm metriklerini rakipleriyle ve sektör ortalamasıyla karşılaştırır. Karşılaştırmalar ülkeye özgüdür. Adapty, bir kıyaslama noktası sağlamak için App Store'daki uygulamalardan elde edilen verileri alt kategorinize ve ülkenize göre toplar ve analiz eder. Bu veriler başka hiçbir yerde kamuya açık değildir.
### Rakipleri Seçin \{#select-competitors\}
Karşılaştırma için en fazla 5 rakip seçin.
Adapty otomatik olarak 5 rakip belirler ve 5 tane daha önerir. App Store bağlantısıyla uygulamaları manuel olarak da ekleyebilirsiniz. Daha iyi sonuçlar için sizden daha yüksek MRR'ye sahip uygulamaları seçin.
Listeyi onaylamak için **Generate report** düğmesine tıklayın ve analizin tamamlanmasını bekleyin.
### Ülke Seçin \{#select-a-country\}
Ayrıntılı analiz için en iyi ülkelerinizden birini seçmek amacıyla Ülke açılır menüsünü kullanın.
### Gelir dağılımı \{#revenue-distribution\}
Bu gelir dağılımı grafiği, gelirinizin hangi ülkelerden geldiğini yüzdelik dağılımlarla gösterir. Analizin geri kalanında odaklanılan ilk 5 ülkenizi öne çıkarır.
### Rakip fiyatlandırma \{#competitor-pricing\}
Rakip fiyatlandırma tablosu, paywall'ınızın abonelik fiyatlarını [seçilen ülkedeki](#select-a-country) rakiplerinizin fiyatlarıyla karşılaştırır. Her abonelik süresi için ayrı sütunlar içerir.
### Dönüşüm hunisi \{#conversion-funnel\}
Bu grafik, dönüşüm oranlarınızı — Görüntülemeden Denemeye, Denemeden Ödemeye ve Görüntülemeden Ödemeye — benzer uygulamaların ortalamasıyla yan yana gösterir.
### Süreye göre gelir dağılımı \{#revenue-distribution-by-duration\}
Bu grafik, hangi abonelik sürelerinin gelirinize en fazla katkıda bulunduğunu sektör ortalamasıyla karşılaştırarak gösterir. Geliriniz belirli bir süreye yoğun biçimde yönelmişse, bu durum fiyatlandırma stratejinizi optimize etmek için bir fırsat olduğuna işaret edebilir.
### Aktivasyon ARPU \{#activation-arpu\}
**Aktivasyon ARPU: uygulamanız ve kategori** grafiği, uygulamanızın yeni kurulum başına ortalama gelirini kategori ortalamasıyla karşılaştırır.
Bunu [dönüşüm hunisiyle](#conversion-funnel) birlikte kullanın:
- Dönüşüm, kaç kullanıcının ödeme yaptığını gösterir.
- Aktivasyon ARPU ise kullanıcı başına ortalama geliri gösterir.
Yüksek bir dönüşüm oranıyla birlikte düşük bir Aktivasyon ARPU, tekliflerin düşük fiyatlandırıldığına işaret edebilir.
Bu metrik **kohort tabanlıdır**. Adapty, son 90 günde uygulamayı yükleyen kullanıcıları alır ve bu kullanıcıların elde ettiği geliri kullanıcı sayısına böler.
#### Diğer metriklerle karşılaştırma \{#comparison-to-other-metrics\}
Aktivasyon ARPU, kontrol panelinizde başka yerlerde gördüğünüz ARPU değerleriyle eşleşmeyecektir — her metrik farklı bir şeyi ölçer.
- **[ARPU analitik grafiği](arpu)**: Eski kohortların yenilemelerini de içerir; bu nedenle değer, Aktivasyon ARPU'sundan birkaç kat daha yüksektir.
- **[Gelir grafiği](revenue), Dönem filtresi "Activation" olarak ayarlandığında**: Yalnızca her kullanıcının ilk ödemesini sayar. Kohortun 90 günlük pencere içinde yaptığı yenilemeleri saymaz.
- **[Kohort geliri](analytics-cohorts) (90 gün)**: En yakın eşdeğer — bu metriği referans olarak kullanın.
## Sonraki Adımlar \{#next-steps\}
Analiz sonuçlarına göre A/B testlerini nasıl yürüteceğinizi öğrenmek için [Büyüme planınızı yönetin ve uygulayın](autopilot-growth-plan) makalesini okuyun.
Analiz sonuçlarınızı dilediğiniz zaman Growth Plan sayfasından görüntüleyebilirsiniz. Bunun için **Analysis Results** sekmesine tıklamanız yeterli.
---
# File: autopilot-growth-plan
---
---
title: "Büyüme planınızı yönetin"
description: "Özel hipotezler ekleyin, arşivleyin ve büyüme planını güncelleyin."
---
[Analizi](autopilot-analysis) tamamladıktan sonra Adapty, büyüme planınızı sunar — **uygulanabilir iyileştirme hipotezlerinden** oluşan bir liste. Her öğe, yeni bir fiyat noktası veya tasarım iyileştirmesi önerir.
Bir hipotez açın ve [bunu bir A/B testi ile deneyin](autopilot-execute-plan).
Her placement'ın kendi büyüme planı vardır. Piyasa koşulları değiştikçe önerileri güncellemek için analizi yeniden çalıştırabilirsiniz. Geçmiş çalıştırmalar sürüm geçmişinde saklanır.
## Hipotezler \{#hypotheses\}
Hipotezleri türe göre filtrelemek için büyüme planının en üstündeki sekmeler arasında geçiş yapın:
- **En yüksek öncelik**, en fazla etki yaratabilecek hipotezleri içerir. Uygun hipotez yoksa bu sekme gizlenir.
- **Tümü**, aktif planınızdaki tüm hipotezleri gösterir.
- **Fiyatlandırma** hipotezleri, yeni fiyat noktalarını veya deneme süresi yapılandırmalarını inceler. Her biri, paywall tanısından veya pazar içgörüleri raporundan gelen belirli bir öneriye dayanır.
- **Görsel** hipotezler, tasarım iyileştirme önerilerdir. Metin, düzen veya diğer görsel öğelerdeki değişiklikleri kapsayabilir.
- [**Coğrafi fiyatlandırma**](#geo-pricing-hypotheses) hipotezleri, ülkeye özgü fiyat ayarlamalarını test eder.
- [**Arşivlenen**](#archive-a-hypothesis) hipotezler, aktif planınızdan kaldırdığınız önerilerdir. İstediğiniz zaman geri yükleyebilirsiniz.
Kendi [hipotezinizi ekleyebilir](#add-your-own-hypothesis) ya da test etmek istemediğiniz hipotezleri [arşivleyebilirsiniz](#archive-a-hypothesis).
Bu hipotezleri herhangi bir sırayla, birer birer test edin. Coğrafi fiyatlandırma testleri bunun istisnasıdır; kitleleri örtüşmediğinden paralel olarak çalıştırılabilirler.
### Coğrafi fiyatlandırma hipotezleri \{#geo-pricing-hypotheses\}
:::important
Tek seferlik satın almalar, bölgesel fiyat optimizasyonu için uygun değildir.
:::
Coğrafi fiyatlandırma önerilerinin listesini görmek için **Geo-pricing** sekmesini açın. Her öneri, tek bir fiyat değişikliğiyle bir ülkeyi hedefler ve ayrı bir A/B testi olarak çalışır.
Adapty, fiyat ayarlaması gerektiren ülkeleri tespit eder ve [Adapty Pricing Index](https://uploads.adapty.io/adapty_pricing_index.pdf) tarafından doğrulanmış veri odaklı öneriler sunar.
Aynı verileri [API aracılığıyla da alabilirsiniz](export-analytics-api). Hangi yöntemi kullanırsanız kullanın, veri dosyası aynı olacaktır.
Bu özellik, ham verilere erişmenizi sağlar; bu verileri daha derin içgörüler elde etmek için elektronik tablo uygulamalarında veya başka araçlarda daha ayrıntılı inceleyebilirsiniz.
### Brüt veya net geliri görüntüleme \{#display-gross-or-net-revenue\}
Gelirle ilgili grafikler için ([Gelir](revenue), [MRR](mrr), [ARR](arr), [ARPU](arpu), [ARPPU](arppu)), Adapty üç görüntüleme modu sunan bir açılır menü sunar:
- **Gross revenue** — herhangi bir kesinti yapılmadan önceki toplam gelir.
- **Proceeds after store commission** — mağaza komisyonu düşüldükten sonraki gelir; vergiler hâlâ dahildir.
- **Proceeds after store commission and taxes** — hem komisyon hem de vergiler düşüldükten sonraki gelir.
Komisyon ve vergi hesaplamaları hakkında ayrıntılı bilgi için *Adapty Analytics nasıl çalışır* bölümündeki [Komisyonlar ve vergiler](how-adapty-analytics-works#commissions-and-taxes) konusuna bakın.
---
# File: revenue
---
---
title: "Gelir"
description: "Adapty'nin abonelik analizleriyle uygulamanızın gelirini takip edin ve analiz edin."
---
Gelir grafiği, hem aboneliklerden hem de tek seferlik satın almalardan elde edilen toplam geliri, daha sonra iade edilen gelir düşüldükten sonra gösterir. Uygulamanızın finansal performansını takip etmek için kullanabileceğiniz birincil metriktir.
Son 12 ayın genel trendlerini değerlendirmek için aylık çözünürlüğe geçin. Gelirin nereden geldiğini görmek için grafiği ürüne, kullanıcı segmentine veya attribution kaynağına göre gruplayın; büyümeyi hangi tarafın sürüklediğini anlamak için yeni-yenileme karışımını takip edin.
## Hesaplama \{#calculation\}
:::warning
Aşağıdaki hesap makinesi [mağaza komisyonu ve vergilendirmeyi](how-adapty-analytics-works#commissions-and-taxes) **dikkate almaz**. Sonucu **brüt gelir** hesaplamalarınızla karşılaştırın.
:::
Gelir, dönem içindeki tüm ücretli işlemlerin toplamından (yeni abonelikler, yenilemeler, deneme sürümü dönüşümleri, tek seferlik satın almalar) dönem içinde işlenen iadeler çıkarıldıktan sonra kalan tutardır: **Gelir = toplam işlemler − iadeler**.
Her işlemin tam tutarı, aboneliğin süresi boyunca dağıtılmak yerine satın alma gününe kaydedilir.
Grafik varsayılan olarak brüt geliri gösterir. Brüt, komisyon sonrası veya komisyon ve vergi sonrası görünümler arasında geçiş yapmak için [grafik kontrollerini](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue) kullanın.
## Huni grafiğini adım adım inceleyelim \{#funnel-chart-step-by-step\}
Kullanıcı yolculuğunu grafik üzerinde nasıl okuyacağınızı anlamak için huninin öğelerini birlikte inceleyelim.
### Kurulumlar \{#installs\}
1. sütun (1), kurulum sayısını gösterir. Bu değer; toplam kurulum sayısının (benzersiz kullanıcı sayısı değil) mutlak değeri (2) olarak ve sonraki dönüşümlerin göreli hesaplamasında temel alınan en büyük giriş sayısı olarak %100 şeklinde gösterilir. Bir kullanıcı uygulamayı silip yeniden yüklerse iki ayrı kurulum sayılır.
Yanındaki gri alan, adımlar arasındaki geçiş parametrelerini temsil eder. Sonraki adıma (Görüntülenen paywall) geçiş yüzdesi bir bayrak üzerinde (3) gösterilir. Düşüş yüzdesi ve kaybın mutlak değeri ise alt kısımda (4) yer alır.
### Paywall görüntülendi \{#paywall-displayed\}
2. sütun (5), uygulamanın en az bir kez paywall gören kullanıcı sayısını (6) gösterir. Bu sayıya yalnızca seçili dönemde gerçekleşen kurulumlar dahil edilir. Bir kullanıcı, seçili dönemde paywall görse bile kurulum tarihi aralık dışındaysa bu görüntüleme sayılmaz.
Ayrıca bu görüntülemelerin 1. adıma göre yüzdesi de gösterilir (7). Bu yüzdenin, 1. adımdaki gri bayrakla (3) eşit olduğunu fark edebilirsiniz. Bu eşitlik yalnızca bu ilk adımlar için geçerlidir.
Bu adım için tüm veriler, `logShowFlow()` (iOS SDK v4+) / `logShowPaywall()` metodunu kullanan paywalllarınızdan toplanır. Bu nedenle, her paywall görüntülemeyi [dokümanlarda](present-remote-config-paywalls#track-paywall-view-events) açıklandığı gibi bu metodu kullanarak Adapty'ye gönderdiğinizden emin olun.
2. sütunun yanındaki gri alan geçişi temsil eder. Bir sonraki adıma (Trial) dönüşüm yüzdesi bayrak üzerinde gösterilir (8). Paywall sonrasında kaybedilen müşterilerin düşüş yüzdesi ve mutlak değeri aşağıda gösterilir (9).
### Denemeler \{#trials\}
3. sütun (10), seçilen dönemde (11) uygulamayı yükleyen müşterilerin paywalllar üzerinden etkinleştirdiği deneme sayısını gösterir. Filtre deneme içermeyen ürün(ler)e ayarlandığında bu değer sıfır olur ve sütun boş görünür.
1. adımdan denemeye alınan kullanıcı yüzdesini de görebilirsiniz; bu, yüklemelerden denemele dönüşümü temsil eder (12).
Bu yüzdenin, bir önceki adım dönüşümünün gri bayrağıyla (8) aynı olmadığını fark edebilirsiniz. Bunun nedeni, mevcut değeri hem grafiğin en üstündeki 1. adımla hem de gri bayraklardaki bir önceki adımla karşılaştırmamızdır.
Dolayısıyla 3. sütunun yanındaki gri alan, bayrakta (13) gösterilen bir sonraki adıma (Ücretli) dönüşüm yüzdesini gösterir. Deneme süresi boyunca kaybedilen müşterilerin düşüş yüzdesi ve mutlak değeri ise aşağıda gösterilmektedir (14).
### Abonelikler ve yenilemeler \{#subscriptions-and-renewals\}
4. sütun, etkinleştirilen abonelik sayısını (15) gösterir. Deneme süresi olmayan ürünler için bu sayı, paywall üzerinden yapılan doğrudan abonelikleri içerir. Deneme süresi olan ürünler için ise ücretli aboneliğe dönüştürülen deneme sayısını kapsar. Her iki türde ürününüz varsa (deneme süreli ve deneme süresiz), bu değer ikisinin toplamı olur.
Üstteki yüzde, yüklemelerden dönüşümü gösterir (16).
Gri bayraktaki yüzde, bir sonraki adıma geçişi (2. döneme yenileme) gösterir (17).
2. döneme yenilemeden önceki düşüş yüzdesi ve mutlak değeri, dönüşümün altında gösterilir (18).
Bu adım, benzer yapıya sahip bir dizi adımı başlatır. 2. yenilemeden sonra 3., ardından 4. gelir ve bu böyle devam eder. Uygulama geçmişinizde yeterince veri varsa, yatay kaydırma ile düzinelerce dönem görebilirsiniz. Bu adımların mantığı aynı kalır:
- en üstte kurulumlardan yüzde,
- en altta önceki adımdan yüzde,
- en üstte mutlak yenileme miktarı,
- en altta mutlak churn miktarı,
- churn nedenleri açılır penceresi için üzerine gelme.
### Churn nedenleri \{#churn-reasons\}
Adapty, Trial aşaması ve sonrası için *churn* istatistiklerini ayrıntılı olarak gösterir. Bir aşamaya girip bir sonrakine geçemeyen her kullanıcı, bir churn örneği olarak sayılır.
* Belirli bir olay (örneğin, trial süresinin dolması veya ödeme sorunu) dönüşüm eksikliğine neden olduysa, Adapty bu nedeni görüntüler.
* **unknown** durumu geçici bir durumdur. Kullanıcının henüz bir sonraki aşamaya geçmesini sağlayacak olayla karşılaşmadığını gösterir.
Deneme aşamasında bu durum genellikle deneme süresinin henüz sona ermediği anlamına gelir. Bu, kısa tarih aralıkları veya tek günlük Funnel görünümlerinde sıkça yaşanır; zira denemelerin sonuçlanması zaman alır.
Kullanıcı denemeyi satın alım olarak tamamladığında veya iptal ettiğinde Adapty bilgileri günceller.
### Tablo görünümü, filtreler ve CSV dışa aktarımı \{#table-view-filters-and-csv-export\}
Huni grafiği, sayılarla çalışırken işe yarayacak kullanışlı materyaller sunmak amacıyla tablo biçimindeki verilerle zenginleştirilmiştir.
Bu tablo, dönüşüm hunisiyle aynı yaklaşımı bazı değişikliklerle tekrar eder.
1. ücretli abonelik adımı dışındaki tüm adımlara ait verileri gösteren sütunlar bulunur.
Bu adım yerine iki ayrı sütun yer alır: Install -> Paid ve Trial -> Paid. Bunlar, ücretsiz bir kullanıcının ödeme yapan birine dönüştüğü temel dönüşüm noktasını gösterir.
Install → Ödeme sütununun yalnızca deneme süresi olmayan ürünleri, Trial → Ödeme sütununun ise yalnızca deneme süresi olan ürünleri gösterdiği gibi bir ürün türü ayrımı varmış gibi görünebilir. Ancak iş tam olarak böyle işlemiyor. Çünkü deneme süresi dolmuş ve ardından deneme süresi olan bir ürünü sanki yokmuş gibi satın alan kullanıcıları da bu hesaba dahil ediyoruz.
Sayılara daha derine inerek, yeni hipotezler için güçlü filtreleme araçları bulacaksınız.
Farklı boyutlarda koşullar belirlemekten çekinmeyin. Veriye dayalı gerçek içgörüler elde edin.
Değiştirin:
1. Ürün türü - ekonomi, süre vb.
2. Zaman aralığı.
3. Ülke segmentasyonu.
4. Traffic attribution.
5. Mağaza.
Yalnızca gerekli verileri görüntülemek için Mutlak Sayı, Göreli % veya her ikisini seçin.
Son olarak, kontrol panelinin sağında huni verilerini CSV olarak dışa aktarma düğmesi bulunur. Bunu Excel'de, Google Sheets'te açabilir ya da kendi analitik sisteminize aktarabilirsiniz.
:::important
Uygulamanız indirimli komisyon programına kayıtlıysa Adapty'ye bildirin. Doğru hesaplamalar için [Küçük İşletme Programı](app-store-small-business-program) ve [İndirimli Hizmet Ücreti programı](google-reduced-service-fee) durumunuzu [uygulama ayarlarınızda](general) belirtin.
:::
---
# File: analytics-retention
---
---
title: "Elde tutma analizi"
description: "Kullanıcı elde tutma analizini anlayın ve abonelik stratejinizi optimize edin."
---
Elde tutma grafikleri şu sorulara yanıt bulmanıza yardımcı olabilir:
1. Uygulamanız kullanıcıları dönemden döneme nasıl elde tutuyor?
2. Hangi ürünler daha çekici ve daha iyi tutuyor?
3. Hangi kullanıcı grupları daha sadık?
4. Büyüme için kıyas noktası olarak hangi retention seviyesi kullanılabilir?
5. Ve tabii ki, yeni kullanıcı edinmek yerine mevcut kitleye yatırım yaparak nasıl para tasarrufu yapabilirsiniz.
Filtreler ve gruplar ayarlayarak kullanıcı davranışı hakkında değerli içgörüler elde edeceksiniz.
Retention, SDK ve mağaza bildirimleri aracılığıyla topladığımız verilerle gerçekleştirilir; sizin tarafınızdan herhangi bir ek yapılandırma gerektirmez.
### Elde tutmayı nasıl hesaplıyoruz? \{#how-do-we-calculate-retention\}
Elde tutma grafiğini incelerken, kullanıcı sayısının hangi adımda olduklarına göre nasıl değiştiğini görebilirsiniz: deneme (eğer "deneme sürümlerini göster" onay kutusu işaretliyse), 1. ödeme, 2. ödeme vb. Elde tutma grafiği için bir tarih aralığı seçtiğinizde hangi kullanıcıların sayıldığını açıklayalım.
Örneğin, takvimde son 3 ayı seçtiniz ve "deneme sürümlerini göster" onay kutusu işaretli değil. Bu durumda yalnızca son 3 ay içinde ilk aboneliğini başlatanlar sayılır. Eğer "deneme sürümlerini göster" onay kutusu işaretliyse ve takvimde son 3 ay seçiliyse, son 3 ay içinde deneme sürümü başlatmış olan herkes sayılır. Bu aboneler için, N. adımdaki mutlak elde tutma değeri, N. ödemeyi gerçekleştirenlerin sayısı olarak gösterilir. N. adım için göreli elde tutma değeri ise N. ödemenin mutlak miktarının, seçilen zaman aralığındaki toplam abonelik (veya deneme sürümü) sayısına oranı olarak hesaplanır.
:::info
Retention geriye dönük olarak değişir
Grafiği ne zaman kontrol ettiğinizden bağımsız olarak, seçilen zaman dilimi için baz sayı (%100) sabit kalır. Öte yandan bir sonraki döneme ait retention değeri zamanla artabilir.
Örneğin, aylık bir abonelikte 1-31 Aralık tarihleri arasında 20 ilk satın alma gerçekleştiyse, kullanıcılar çeşitli nedenlerle (ör. ek süre) bir sonraki abonelik dönemine zamanında ya da daha geç girdikçe ikinci döneme ait retention değerinin Ocak ayı boyunca (ve hatta sonrasında bile) artmaya devam etmesi beklenir.
:::
### İade işleme \{#refund-handling\}
İadeler, elde tutma hesaplamalarından **çıkarılmaz**. İade yapan bir kullanıcı, elde tutma eğrisinde sayılmaya devam eder; bu da Retention'ı aynı kohort için [Aktif abonelikler](active-subscriptions) veya [Gelir](revenue)'den daha yüksek gösterebilir.
Metrikler genelinde tam karşılaştırma için bkz. [Metriklerin iadeleri nasıl işlediği](refund-events#how-metrics-handle-refunds).
### Elde tutma fırsatları \{#retention-opportunities\}
Adapty'nin elde tutma özelliğinden nasıl daha fazla yararlanabileceğimize bakalım.
Yalnızca sayılara olan tutkuyla yetinmek yerine, analitik sonuçların uygulamaya konulmasından gerçek iş değeri çıkarmak istiyorsak önce amaçları düşünmek gerekir. Grafik özelliklerini derinlemesine incelediğimizde, bu verinin ne gibi bir etki yaratabileceğini anlamlandırmak faydalı olacaktır.
O hâlde NİÇİN ve NASIL sorularını birlikte ele alalım.
1 - Hedef kitleyle çalışın.
Her şeyden önce, elde tutma (retention); hedef kitle, bu kitlenin tercihleri ve ürününüzün tüketim süreci boyunca onların beklentilerini karşılayıp karşılamadığıyla doğrudan ilgilidir. İşletmenizin para kazandıran temel ilişkisini nasıl ölçeceğinizi merak ettiyseniz, retention tam da aradığınız şeydir.
Bu ölçüm değerlidir; çünkü mevcut müşterinize satış yapmak, yeni birine satış yapmaktan genellikle çok daha ucuzdur. Bu maliyetin düşük olmasının iki nedeni vardır: satış için daha az çaba gerekmesi ve daha yüksek ortalama sepet tutarı. Dolayısıyla retention düştüğünde abonelerinizin bağlılığına yatırım yapmak akıllıca bir tercih olabilir.
2 - Ürünle çalışın.
İKİNCİ neden şu: elde tutma grafikleri, ürününüzün gerçek kullanım ömrünü gösterir ve uzun vadeli tahmin yapmanıza olanak tanır. Geliştirmek istiyorsanız, ürünü kullanıcıya ulaştıran süreci düzeltin, ömrünü değiştirin ve ardından iş hedeflerinize daha yakın sonuçlar elde etmek için yeniden tahmin yapın. Bu tür güncellemeler, bir tahmin rutiniyle birlikte işleyen stratejik bir vizyonun parçası olabilir. Ve evet, bu süreç hiç bitmez; çünkü hepimiz, sürekli değişen bir ortamda aynı yerde kalabilmek için hızla koşuyoruz.
3 - pazar ile çalışmak.
Ana rakiplerden daha hızlı hareket etmek iyidir, ancak bazen sıradan yarışın dışına çıkmak daha fazla fayda sağlayabilir. Farklı ülkelerdeki ve mağazalardaki kullanıcı davranışlarını analiz ettiğinizde, bazı yerel özellikler olağanüstü içgörüler ve iş için yeni fırsatlar ortaya çıkarabilir. Kültürel ve pazar bağlamı, daha sonra segmentasyon ve gelecekteki gelişim için kullanılmak üzere elde tutma perspektifinden analiz edilebilir. Örneğin, bazı bölgelerde mavi okyanus bulabilir ve orada daha hızlı büyüyebilirsiniz.
Retention verilerinin kullanımı elbette bu temel yorumla sınırlı değildir; ancak hızlıca gerçek değer elde etmek istiyorsanız iyi bir başlangıç noktası olabilir.
### Eğriler, tablo görünümü, filtreler ve CSV dışa aktarma \{#curves-table-view-filters-and-csv-export\}
Artık elde tutma amacını ve temel yorumlama yöntemlerini anladığımıza göre, her şeyi kullanışlı hale getiren araçları inceleyelim.
Adapty'deki elde tutma özelliğinin özü grafiktir. Grafik, elde tutma düzeyinin bir müşterinin yaşam süresinin adımlarına göre nasıl değiştiğini gösterir.
Adımlar yatay eksende gösterilir: Trial, Paid (1. abonelik), P2 (2. abonelik), P3, P4, vb.
"Show trials" onay kutusu seçili olduğunda eksen yalnızca Trial adımıyla başlar.
Veri hesaplama açısından bu onay kutusu şu şekilde çalışır: "Show trials" seçili olduğunda ve eksen Trial adımıyla başladığında, yalnızca trial içeren senaryolar görüntülenir; kurulumdan doğrudan gelen işlemler gösterilmez ve Paid adımı yalnızca trial'lardan gelen işlemleri içerir. "Show trials" seçili olmadığında ve eksen Paid adımıyla başladığında, bu ilk adım hem trial'lardan hem de doğrudan kurulumlardan gelen ilk işlemlerin tamamını içerir.
Grafiğin üzerine geldiğinizde, veri özeti içeren bir açılır pencere görüntülenir. Aşağıdaki tablodaki bir sütunun üzerine geldiğinizde de grafikte ilgili verileri içeren bir özet açılır penceresi görürsünüz.
Tablo, grafik için seçilen gruplandırma ve filtrelerin aynısını içerir.
Gelişmiş analiz için filtreleri ve gruplamayı özgürce birleştirin. Veriye dayalı gerçek içgörüler elde edin.
Şunlara göre değiştirebilirsiniz:
1. Ürün türü.
2. Süre.
3. Zaman aralığı.
4. Ülke.
5. Traffic attribution.
6. Mağaza.
Gerekli verileri görüntülemek için #Mutlak ve %Göreli kontrolünü kullanın.
Son olarak, kontrol panelinin sağında huni verilerini CSV olarak dışa aktarma butonu bulunur. Ardından bunu Excel'de veya Google Sheets'te açabilir ya da kendi analitik sisteminize aktararak analiz ve tahminlerinizi tercih ettiğiniz ortamda sürdürebilirsiniz.
:::warning
Uygulamanızın Küçük İşletme Programı'na dahil olduğunu [Adapty Genel Ayarları](https://app.adapty.io/settings/general)'nda belirttiğinizden emin olun.
:::
---
# File: analytics-conversion
---
---
title: "Dönüşüm analizi"
description: "Adapty'nin analiz araçlarını kullanarak abonelik dönüşüm oranlarını ölçün."
---
Huniler size üst düzey bir genel bakış sunarken, retention kullanıcı sadakatine odaklanır; dönüşüm analizi ise kullanıcı yolculuğundaki her kritik adımın etkinliğini zaman içinde değerlendirmenize yardımcı olmak için tasarlanmıştır.
Dönüşümler şu soruları yanıtlamanıza yardımcı olur:
1. Uygulama dönüşümleri zaman içinde nasıl değişiyor? Mevsimsel trendler var mı?
2. Pazarlama faaliyetleri veya yeni koşullar sırasında dönüşümler nasıl değişiyor?
3. Farklı bölgelerdeki kullanıcılar uygulama güncellemelerinize nasıl tepki veriyor?
4. Hangi ürün türleri zaman içinde daha iyi dönüşüm sağlıyor?
Dönüşüm, Adapty SDK ve mağaza bildirimleri aracılığıyla topladığımız verilerle hesaplanır; sizin tarafınızdan herhangi bir ek yapılandırma gerektirmez.
## Ana kontroller ve grafikler \{#main-controls-and-charts\}
Gelir, başarıyı ölçmek için sıkça başvurulan bir metrik olsa da büyük resmin yalnızca bir parçasıdır. İşinizin zaman içinde nasıl performans gösterdiğini — farklı kullanıcı davranışları ve yaşam döngüsü aşamaları genelinde — anlamak da en az gelir kadar önemlidir. İşte tam burada dönüşüm analitiği devreye girer.
Filtreler ve gruplar ayarlayarak kullanıcı davranışı hakkında daha değerli içgörüler elde edebilirsiniz. Trendleri belirlemek ve analiz etmek için dönüşümlerinizin günlük, aylık veya yıllık bazda nasıl değiştiğini takip edin.
Grafiğin sol tarafında dönüşüm adımları kontrolünü bulacaksınız. Bu kontrol, hangi dönüşümleri takip edeceğinizi seçmenizi sağlar; örneğin Yükleme → Deneme, Deneme → Ücretli veya Ücretli → Yenileme gibi.
Her dönüşüm metriği şu mantıkla çalışır:
- **X**, seçilen tarihte başlangıç durumuna giren kullanıcı sayısı olsun (ör. yüklemeler).
- **Y**, bu kullanıcılar arasından hedef duruma ulaşanların sayısı olsun (ör. deneme başlatmalar).
- Dönüşüm oranı şu şekilde hesaplanır: **Dönüşüm = (Y / X) × 100%**
:::note
Grafikteki tarih, kullanıcıların başlangıç durumuna (X) girdikleri ana, yani dönüşüm için uygun hale geldikleri ana karşılık gelir.
:::
Her dönüşümün açıklamasını ve referans olması açısından örneklerini aşağıda bulabilirsiniz.
### Kurulum -> Ücretli \{#install---paid\}
Bu metrik, belirli bir tarihte uygulamayı yükleyen kullanıcıların kaçte kaçının sonunda ilk aboneliklerini satın aldığını gösterir.
**Predicted revenue** sütunu, bir abonelik kohortunun oluşturulmasından itibaren seçilen zaman diliminde elde etmesi beklenen tahmini toplam geliri gösterir. Bu değer, uygulamanın geçmiş kohort elde tutma verilerine dayanan Adapty'nin tahmin modeli kullanılarak hesaplanır.
**Predicted LTV** sütunu, seçilen kohortdaki her bir kullanıcının tahmini yaşam boyu değerini gösterir. Bu değer, tahmini gelirin kohorttaki tahmini ödeme yapan kullanıcı sayısına bölünmesiyle hesaplanır.
### Ufku seçin \{#select-the-horizon\}
Tahmin ufkunu değiştirmek için **Predictions** açılır menüsünden bir değer seçin. Kullanılabilir seçenekler, kohort oluşturulduktan sonra 3, 6, 9, 12, 18 ve 24 aydır.
### Ürüne göre filtrele \{#filter-by-product\}
Tahmini geliri ve LTV'yi ürüne göre filtreleyebilirsiniz. Varsayılan olarak tahminler tüm satın alma verilerinden oluşturulur; ürüne göre filtreleme ise her ürünün ne kadar katkı sağladığını gösterir.
## Tahminler mevcut olmadığında \{#when-predictions-are-unavailable\}
Bir kohort için tahmin üretilemediğinde, Predicted Revenue ve Predicted LTV sütunlarında değerler yerine em tire (—) gösterilir. Bunun birkaç farklı nedeni olabilir:
- **Kohort oluşturulmasından bu yana geçen süre yetersiz**: Tahminler yalnızca kohort ilk yenileme dönemini tamamladıktan sonra kullanılabilir hale gelir — haftalık abonelikler için yaklaşık bir hafta, aylık abonelikler için yaklaşık dört hafta.
- **Kohort boyutu çok küçük**: Güvenilir bir projeksiyon üretmek için yeterli sayıda ödeme yapan abone yok.
- **Alışılmadık kohort davranışı**: Kohort, modelin beklediği kalıplardan önemli ölçüde sapıyor. Daha fazla veri birikmesiyle birkaç hafta içinde bu sorun kendiliğinden çözülebilir.
- **Ufuk aşıldı**: Kohort, seçilen tahmin ufkundan daha eski. Örneğin, 3 aylık tahmin üç aydan sonra gizlenir, 12 aylık tahmin on iki aydan sonra gizlenir ve 24 aydan eski kohortlar için hiçbir tahmin gösterilmez.
:::warning
Tahminleri etkinleştirirken, Adapty kontrol panelinizde Gelir ve LTV için tahmin verilerinin görünür hale gelmesi için maksimum 24 saatlik bir gecikme olabileceğini unutmayın.
:::
---
# File: predictions-in-ab-tests
---
---
title: "A/B testlerinde tahminler"
description: "A/B testlerindeki tahminlerin abonelik fiyatlandırma stratejilerini nasıl geliştirdiğini öğrenin."
---
Adapty'nin A/B testi özelliği için Tahminsel Analiz dokümantasyonuna hoş geldiniz. Bu araç, çalışan A/B testlerinizin gelecekteki sonuçlarına dair içgörüler sunar ve Adapty'nin makine öğrenmesiyle desteklenen tahminleri sayesinde veriye dayalı kararlar almanızı hızlandırır 🚀
### A/B testi tahminleri nedir? \{#what-are-ab-test-predictions\}
Adapty'nin A/B Testi Tahminleri, bir A/B testinde karşılaştırılan paywallların uzun vadeli gelir potansiyelini öngörmek için gelişmiş makine öğrenmesi tekniklerinden (özellikle gradient boosting modelleri) yararlanır.
Bu tahminsel model, test çalışırken gözlemlediğiniz metriklere bağlı kalmak yerine, bir yıl sonraki tahmini gelire göre en etkili paywallı seçmenizi sağlar. Bu sayede verinin birikmesini haftalar boyu beklemek zorunda kalmadan kazananı daha güvenilir ve hızlı bir şekilde belirleyebilirsiniz.
### Model nasıl çalışır? \{#how-does-the-model-work\}
Model, farklı kategorilerdeki çok sayıda uygulamadan elde edilen kapsamlı geçmiş A/B testi verileriyle eğitilmiştir. Bir paywallın deney başlangıcından itibaren bir yıl içinde üreteceği geliri tahmin etmek için geniş bir özellik yelpazesini kullanır. Bu özellikler şunlardır:
- Farklı dönemlerde kullanıcı işlemleri ve dönüşüm oranları
- Kullanıcıların coğrafi dağılımı
- Platform kullanımı (iOS veya Android)
- İptal ve iade oranları
- Abonelik ürünleri ve dönem uzunlukları (günlük, aylık, yıllık vb.)
- Diğer işlem verisi
Model ayrıca paywallardaki deneme sürelerini de hesaba katar; kullanıcıların zaten dönüşüm gerçekleştirmiş gibi geliri tahmin etmek için geçmiş dönüşüm oranlarını kullanır. Bu yaklaşım, deneme teklifleri olan ve olmayan paywalllar arasında adil bir karşılaştırma yapılmasını sağlar; çünkü aktif denemelerin gelecekte gelir getirebileceği ihtimali de hesaba katılır.
### Tahminsel P2BB, standart P2BB'den nasıl farklıdır? \{#how-is-predicted-p2bb-different-from-just-the-p2bb\}
A/B testlerimizde Bayesçi yaklaşımı kullanıyoruz: temel olarak kullanıcı başına gelirin (daha doğrusu "1.000 kullanıcı başına gelir") dağılımını modelliyoruz, ardından bir dağılımın diğerinden "gerçek anlamda" daha iyi olup olmadığını ve bunun rastlantısal olmamasını hesaplıyoruz — buna En İyi Olma Olasılığı ya da P2BB diyoruz (yaklaşımımız hakkında daha fazla bilgiye [buradan](maths-behind-it) ulaşabilirsiniz).
Bunu yaparken yalnızca testin çalıştığı süre boyunca biriken gelire dayandığımızı belirtmek önemlidir. Örneğin yıllık bir aboneliği haftalık bir abonelikle karşılaştıran bir test çalıştırırsanız, hangisinin daha iyi performans gösterdiğini gerçekten anlamak için çok uzun süre beklemeniz gerekir. Benzer bir durum, A/B testinde deneme aboneliklerini deneme içermeyen aboneliklerle karşılaştırdığınızda da yaşanır; çünkü kazanan dinamiklerini etkileyebilecek aktif denemeler her zaman gelir hesabının dışında kalır.
İşte tahminsel modelimiz tam da burada devreye giriyor. Bir A/B testindeki mevcut gelir dağılımını alarak ve büyük bir veri setiyle eğitilerek, gelir dağılımının gelecekteki halini (yani 1 yıl sonrasını) tahmin edebiliyor. Bunu yaptıktan sonra, testi tüm yıl boyunca çalıştırsaydınız ulaşacağınız P2BB'yi yani tahminsel P2BB'yi üretiyor.
Bazen tahminsel P2BB ile mevcut P2BB'nin çelişebileceğini unutmayın. Bu durumda varyasyon satırlarını aşağıdaki gibi sarı renkle vurgularız:
Bunu, kazananı teyit etmek için daha fazla veri biriktirmeniz ya da A/B testini daha derinlemesine incelemeniz gerektiğinin bir işareti olarak değerlendiriyoruz. Genel olarak daha fazla veriyi göz önünde bulundurduğu için mevcut P2BB yerine tahminsel P2BB'ye güvenmenizi öneririz; ancak nihai karar elbette size aittir.
### Modelin doğruluğu ve güvenilirliği \{#model-accuracy-and-certainty\}
Model, %10'un biraz altında bir Ortalama Mutlak Yüzde Hata (MAPE) değeriyle yüksek düzeyde doğruluk sağlar. Bu hassasiyet düzeyi, işletmelerin veriye dayalı kararlar alırken modelin tahminlerine güvenle dayanmasına olanak tanır.
Kararlılığı daha da güvence altına almak için model, üç faktöre dayanan bir "kesinlik" kriteri uygular:
- Dar bir tahmin aralığı — model sonuçtan emindir
- Testte yeterli miktarda abonelik ve gelir bulunması
- Testin başlangıcından itibaren en az 2 haftanın geçmiş olması
Bir tahmin, bu üç kriterin en az ikisi karşılandığında güvenilir sayılır.
Yeni bir A/B testi başladığında, model her paywall için 1k başına yıllık gelir tahmini (ana A/B testi metriğimiz) sağlar. Tahminler yalnızca kesinlik kriterlerini karşıladıklarında görüntülenir. Veriler yetersizse model "tahmin için yetersiz veri" ibaresini gösterir.
### Sınırlılıklar ve dikkat edilmesi gerekenler \{#limitations-and-considerations\}
Tahminsel modelimiz güçlü bir araç olsa da sınırlılıklarını göz önünde bulundurmak önemlidir.
Modelin performansı, mevcut verilerin kalitesine ve temsiliyetine bağlıdır. Alışılmadık kohort davranışları ya da eğitim setinde yer almayan yeni uygulamalar tahmin doğruluğunu etkileyebilir.
Bununla birlikte, tahminler en güncel verileri ve kullanıcı davranışlarını yansıtmak amacıyla her gün güncellenir. Bu sayede aldığınız içgörüler her zaman en güncel bilgilere dayanır.
🚧 Not: Bu araç, uzman değerlendirmenizin ve uygulamanızın kendine özgü dinamiklerine dair anlayışınızın yerini almaz; ona destek sağlar. Bu tahminleri, bilinçli kararlar vermek için diğer metrikler ve pazar bilgisiyle birlikte bir rehber olarak kullanın.
---
# File: adapty-ads-manager
---
---
title: "Adapty Ads Manager"
description: "Apple Ads'den gerçek zamanlı analitik alın ve kampanyalarınızı yönetin ve optimize edin"
---
**Adapty Ads Manager**, Apple Ads kampanyalarınızı daha verimli yönetmenizi, optimize etmenizi ve ölçeklendirmenizi sağlamak için tasarlanmış hepsi bir arada bir platformdur. Herhangi bir MMP gerektirmeksizin Apple Search Ads performansınızı kurulum, deneme, abonelik ve yaşam boyu değer gibi temel gelir metrikleriyle birleştirir.
Gerçek zamanlı analizler, yapay zeka destekli tahminler ve akıllı otomasyon sayesinde Adapty Ads Manager, yorucu manuel teklif değişikliklerini, elektronik tabloları ve tahmin oyununu ortadan kaldırır; bunların yerine daha hızlı harekete geçmenizi sağlayan net içgörüler ve araçlar sunar.
Adapty Ads Manager ile şunlara sahip olursunuz:
- **[Genel Bakış](ads-manager-overview)**: Tüm önemli metrikler tek bakışta — harcama, gelir, ROAS, CPA ve daha fazlası — her biri günlük trend grafiğiyle birlikte
- **[AI Ajanı](ads-manager-ai-agent)**: Sade dilde sorular sorun, tam hunili yanıtlar ve öneriler alın
- **Gerçek zamanlı performans verileri**: Kampanyalar, reklam grupları ve anahtar kelimeler genelinde
- **Uçtan uca gelir takibi**: Aramadan → kuruluma → denemeye → aboneliğe → LTV'ye kadar
- **AI tahminleri ve önerileri**: Kârlı ölçeklendirme için
- **Toplu yönetim**: Teklifler, bütçeler, durumlar ve yapılar için
- **[Kural tabanlı otomasyonlar](ads-manager-automations)**: Anahtar kelime yaşam döngüsünün tamamını yönetin
- **[Pazar İstihbaratı](ads-manager-market-intelligence)**: 50'den fazla ülkede rakip anahtar kelime stratejileri
- **[CPP A/B Testleri](ads-manager-cpp-ab-tests)**: Özel ürün sayfalarını birbiriyle karşılaştırın ve en iyi performans göstereni bulun
## Adım 2. Reklam platformunuzu bağlayın ve izleme bağlantıları ekleyin \{#step-2-connect-your-ad-platform-and-add-tracking-links\}
Adapty, uygulama kurulumlarını kampanya verileriyle eşleştirmek için izleme bağlantıları kullanır.
Adapty Attribution ile ölçmek istediğiniz her reklam kampanyasında hedef URL olarak bir izleme bağlantısı kullanmanız gerekir.
Birden fazla platformda reklam yayınlıyorsanız, her platform için izleme bağlantılarını ayrı ayrı ayarlayın.
Adapty'nin reklam platformlarıyla çalışma biçimi iki şekildedir:
- **Yerel entegrasyonlar (Meta Ads, TikTok Ads).** Adapty, reklam platformuna doğrudan bağlanır. Takip bağlantıları otomatik olarak oluşturulur ve kampanya parametreleri, bağlantının kullanıldığı yere göre dinamik olarak doldurulur. Aynı bağlantıyı farklı kampanyalar, reklam grupları veya görseller genelinde kullanabilirsiniz; Adapty, doğru kampanya verilerini ve reklam harcamalarını otomatik olarak alır.
- **Yalnızca izleme linkleri (diğer tüm reklam platformları).** Adapty reklam platformuna bağlanmaz. İzleme linkleri manuel olarak oluşturulur ve tüm kampanya parametreleri link oluşturulurken açıkça tanımlanmalıdır. Bu platformlar için reklam harcaması verisi mevcut değildir.
3. Politika düzenleyicisine aşağıdaki JSON'ı yapıştırın ve `adapty-s3-integration-test` kısmını kendi bucket adınızla değiştirin:
```json showLineNumbers title="Json"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListObjectsInBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
},
{
"Sid": "AllowAllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": [
"arn:aws:s3:::adapty-s3-integration-test/*",
"arn:aws:s3:::adapty-s3-integration-test"
]
},
{
"Sid": "AllowBucketLocation",
"Effect": "Allow",
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
}
]
}
```
4. Politika yapılandırmasını tamamladıktan sonra isteğe bağlı olarak etiket ekleyebilir, ardından son adıma geçmek için **Next** düğmesine tıklayabilirsiniz
5. Bu adımda politikanıza bir ad verin ve oluşturma işlemini tamamlamak için **Create policy** düğmesine tıklayın
#### 1.2. IAM kullanıcısı oluşturma \{#12-create-iam-user\}
Adapty Attribution'ın ham veri raporlarını bucket'ınıza yükleyebilmesi için, ilgili bucket'a yazma erişimi olan bir kullanıcının Access Key ID ve Secret Access Key bilgilerini sağlamanız gerekecektir.
1. IAM Console'a gidin ve [Users bölümünü](https://console.aws.amazon.com/iamv2/home#/users) seçin
2. **Add users** düğmesine tıklayın
3. Kullanıcıya bir ad verin, **Access key – Programmatic access** seçeneğini işaretleyin ve izinler adımına geçin
4. Bir sonraki adımda **Add user to group** seçeneğini belirleyin ve ardından **Create group** düğmesine tıklayın
5. Kullanıcı Grubuna bir ad verin ve daha önce oluşturduğunuz politikayı seçin
6. Politikayı seçtikten sonra işlemi tamamlamak için **Create group** düğmesine tıklayın
7. Grubu başarıyla oluşturduktan sonra **seçin** ve bir sonraki adıma geçin
8. Bu bölümün son adımı olduğundan, **Create User** düğmesine tıklayarak devam edebilirsiniz
9. Son olarak kimlik bilgilerini **.csv formatında indirebilir** ya da doğrudan kontrol panelinden kopyalayıp yapıştırabilirsiniz
### Adım 2. Adapty Attribution'da entegrasyonu yapılandırın \{#step-2-configure-integration-in-adapty-attribution\}
1. [**Integrations** -> **Amazon S3**](https://app.adapty.io/ua/integrations/s3) bölümüne gidin.
2. **Export install events to Amazon S3** geçişini etkinleştirin.
3. Amazon S3 ile Adapty Attribution profillerini bağlamak için aşağıdaki alanları doldurun:
| Alan | Açıklama |
|:-----------------------------| :----------------------------------------------------------- |
| **Access Key ID** | AWS hizmetine erişimi doğrulamak için kullanılan benzersiz bir tanımlayıcı. Bu kimliği indirilen [csv dosyasında](ua-amazon-s3#step-1-create-amazon-s3-credentials) bulabilirsiniz. |
| **Secret Access Key** | AWS hizmetine erişimi doğrulamak için Access Key ID ile birlikte kullanılan özel bir anahtar. Bu anahtarı indirilen [csv dosyasında](ua-amazon-s3#step-1-create-amazon-s3-credentials) bulabilirsiniz. |
| **S3 Bucket Name** | AWS bulutundaki belirli bir S3 bucket'ını tanımlayan, küresel ölçekte benzersiz bir ad. S3 bucket'ları, kullanıcıların dosya ve resim gibi veri nesnelerini bulutta depolamasına ve almasına olanak tanıyan basit bir depolama hizmetidir. |
| **Folder Inside the Bucket** | Seçilen S3 bucket'ının içinde oluşturmak istediğiniz klasörün adı. S3'ün klasörleri, nesne anahtar önekleri (yani klasör adları) kullanarak simüle ettiğini unutmayın. |
| **Region** (İsteğe bağlı) | Region bilginizi AWS Management Console'da IAM kullanıcı hesabınızdan alabilirsiniz. |
## Manuel veri dışa aktarımı \{#manual-data-export\}
Adapty Attribution, Amazon S3'e otomatik olay verisi dışa aktarımına ek olarak manuel dosya dışa aktarma özelliği de sunar. Bu özellik sayesinde kullanıcı edinme verileri için belirli bir tarih seçerek bu verileri S3 bucket'ınıza manuel olarak aktarabilirsiniz. Böylece hangi verileri ne zaman dışa aktaracağınız üzerinde daha fazla kontrol sahibi olursunuz.
## Tablo yapısı \{#table-structure\}
AWS S3 entegrasyonunda Adapty Attribution, kurulum etkinliklerine ait geçmiş verileri depolamak için bir tablo sunar. Bu tablo; kullanıcı profili, gelir ve kazançlar ile kaynak mağaza gibi çeşitli veri noktalarına ilişkin bilgiler içerir.
:::warning
Bu yapının zamanla büyüyebileceğini unutmayın; biz veya birlikte çalıştığımız üçüncü taraflar yeni veriler ekleyebilir. Bu yapıyı işleyen kodunuzun yeterince sağlam olduğundan ve yapının tamamına değil, belirli alanlara dayandığından emin olun.
:::
Etkinliklere ait tablo yapısı aşağıdaki gibidir:
| Sütun | Açıklama |
|--------------------------|-------------------------------------------|
| `adapty_profile_id` | Benzersiz Adapty profil tanımlayıcısı |
| `install_id` | Benzersiz kurulum tanımlayıcısı |
| `created_at` | Kayıt oluşturma zaman damgası (ISO 8601) |
| `installed_at` | Uygulama kurulum zaman damgası (ISO 8601) |
| `store` | Uygulama mağazası (`ios`, `android`) |
| `country` | Kullanıcının ülke kodu (ISO 3166-1 alpha-2) |
| `ip_address` | İstemci IP adresi |
| `idfa` | iOS Reklamverenler için Tanımlayıcı |
| `idfv` | iOS Satıcılar için Tanımlayıcı |
| `gaid` | Google Reklam Kimliği (Android) |
| `android_id` | Android cihaz kimliği |
| `app_set_id` | Android App Set kimliği |
| `channel` | Attribution kanalı |
| `campaign_id` | Kampanya tanımlayıcısı |
| `campaign_name` | Kampanya adı |
| `adset_id` | Reklam seti tanımlayıcısı |
| `adset_name` | Reklam seti adı |
| `ad_id` | Reklam tanımlayıcısı |
| `ad_name` | Reklam adı |
| `keyword_id` | Anahtar kelime tanımlayıcısı |
| `keyword_name` | Anahtar kelime adı |
| `asa_org_id` | Apple Search Ads organizasyon kimliği |
| `asa_keyword_match_type` | ASA anahtar kelime eşleşme türü (`Exact`, `Broad`) |
| `asa_attribution` | ASA attribution verisi (JSON dizesi) |
| `asa_conversion_type` | ASA dönüşüm türü |
| `asa_country_or_region` | ASA ülke veya bölge |
| `asa_creative_set_name` | ASA yaratıcı set adı |
| `fbclid` | Facebook Tıklama Kimliği |
| `ttclid` | TikTok Tıklama Kimliği |
| `utm_source` | UTM kaynak parametresi |
| `utm_medium` | UTM medium parametresi |
| `utm_campaign` | UTM kampanya parametresi |
| `utm_term` | UTM terim parametresi |
| `utm_content` | UTM içerik parametresi |
---
# File: ua-google-cloud-storage
---
---
title: "Adapty Attribution'da Google Cloud Storage"
description: "Güvenli kullanıcı edinme verisi depolama için Google Cloud Storage'ı Adapty Attribution ile entegre edin."
---
Adapty Attribution'ın Google Cloud Storage ile entegrasyonu, kullanıcı edinme kampanya verilerinizi tek bir merkezi konumda güvenli bir şekilde saklamanızı sağlar. Kampanya performans verilerinizi, attribution verilerinizi ve kullanıcı edinme etkinliklerinizi Google Cloud Storage bucket'ınıza .csv dosyaları olarak kaydedebilirsiniz.
Bu entegrasyonu kurmak için Google Cloud Console ve Adapty Attribution Kontrol Paneli'nde birkaç basit adımı izlemeniz gerekecek.
:::note
Zamanlama
Adapty Attribution, verilerinizi her gün UTC 04:00'te Google Cloud Storage'a gönderir.
Her dosya, UTC'de önceki takvim gününün tamamına ait olay verilerini içerir. Örneğin, 8 Mart'ta 04:00 UTC'de otomatik olarak dışa aktarılan veriler, 7 Mart'ta 00:00:00 ile 23:59:59 UTC arasında oluşturulan tüm olayları kapsar.
:::
## Google Cloud Storage entegrasyonu nasıl kurulur \{#how-to-set-up-google-cloud-storage-integration\}
### Adım 1. Google Cloud Storage kimlik bilgilerini oluşturma \{#step-1-create-google-cloud-storage-credentials\}
Bu kılavuz, Google Cloud Platform Console'da gerekli kimlik bilgilerini oluşturmanıza yardımcı olacaktır.
Adapty Attribution'ın ham veri raporlarını belirlediğiniz bucket'a yükleyebilmesi için servis hesabının anahtarı ve ilgili bucket'a yazma erişimi gereklidir. Servis hesabı anahtarını sağlayarak ve bucket'a yazma erişimi vererek, Adapty Attribution'ın ham veri raporlarını kendi platformundan depolama ortamınıza güvenli ve verimli bir şekilde aktarmasına izin vermiş olursunuz.
:::warning
Lütfen dikkat edin: yalnızca Service Account HMAC key yetkilendirmesini destekliyoruz. Bu nedenle, Google Cloud Storage'a düzgün erişim sağlamak için Service Account HMAC key'inizin "Storage Object Viewer", "Storage Legacy Bucket Writer" ve "Storage Object Creator" rollerine sahip olduğundan emin olmanız gerekmektedir.
:::
#### 2.1. Service Account Oluşturma \{#21-create-service-account\}
1. Google Cloud hesabınızın [IAM](https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts) bölümüne gidin ve ilgili projeyi seçin ya da yeni bir proje oluşturun
2. Ardından, "+ CREATE SERVICE ACCOUNT" düğmesine tıklayarak Adapty Attribution için yeni bir hizmet hesabı oluşturun
3. Erişim daha sonraki bir aşamada verileceğinden, ilk adımdaki alanları doldurun. Bu sayfa hakkında daha fazla ayrıntı okumak için belgelere [buradan](https://docs.cloud.google.com/iam/docs/service-accounts-create) ulaşabilirsiniz.
4. [Özel bir JSON anahtarı](https://docs.cloud.google.com/iam/docs/keys-create-delete) oluşturmak ve indirmek için KEYS bölümüne gidin ve "ADD KEY" düğmesine tıklayın
5. DETAILS bölümünde, yeni oluşturulan servis hesabına bağlı Email değerini bulun ve kopyalayın. Bu bilgi, ilerleyen adımlarda hesabı yetkilendirmek ve bucket'a yazma izni vermek için gerekli olacaktır.
#### 2.2. Bucket İzinlerini Yapılandırın \{#22-configure-bucket-permissions\}
6. Google Cloud Storage'ın [Buckets](https://console.cloud.google.com/storage/browser) sayfasına gidin ve mevcut bir bucket seçin ya da Adapty Attribution'dan gelen kullanıcı edinme verisi raporlarını depolamak için yeni bir tane oluşturun.
7. **PERMISSIONS** bölümüne gidin ve [GRANT ACCESS](https://docs.cloud.google.com/identity/docs/how-to?hl=en) seçeneğini belirleyin.
8. PERMISSIONS bölümünde, daha önce beşinci adımda elde edilen hizmet hesabının E-posta adresini girin, ardından Storage Object Creator rolünü seçin
9. Son olarak, değişiklikleri uygulamak için SAVE'e tıklayın
10. Bucket adını ileride kullanmak üzere not almayı unutmayın
11. Bu adımları tamamladıktan sonra Google Cloud Console'daki gerekli kurulum adımlarını başarıyla bitirmiş olacaksınız! Son adım, bucket adını girmek ve Adapty Attribution'da kullanmak üzere JSON dosyasını indirmektir
### Adım 2. Adapty Attribution'da entegrasyonu yapılandırın \{#step-2-configure-integration-in-adapty-attribution\}
1. [**Integrations** -> **Google Cloud Storage**](https://app.adapty.io/ua/integrations/google-cloud-storage) sayfasına gidin
2. **Export install events to Google Cloud Storage** seçeneğini açın
3. Google Cloud Storage ile Adapty Attribution arasında bağlantı kurmak için gerekli alanları doldurun:
| Alan | Açıklama |
|:------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Google Cloud service account key file** | İndirilen özel [JSON anahtar dosyası](ua-google-cloud-storage#step-1-create-google-cloud-storage-credentials). |
| **Google Cloud bucket name** | Verilerinizi depolamak istediğiniz Google Cloud Storage'daki bucket adı. Google Cloud Storage ortamında benzersiz olmalı ve boşluk içermemelidir. |
| **Folder inside the bucket** | Verilerinizi depolamak istediğiniz bucket içindeki klasörün adı. Bucket içinde benzersiz olmalı ve verilerinizi düzenlemek için kullanılabilir. Bu alan isteğe bağlıdır. |
## Manuel veri dışa aktarma \{#manual-data-export\}
Google Cloud Storage'a otomatik etkinlik verisi dışa aktarmanın yanı sıra Adapty UA, manuel dosya dışa aktarma özelliği de sunar. Bu özellik sayesinde belirli bir tarih için kullanıcı edinimi verilerini seçip GCS bucket'ınıza manuel olarak aktarabilirsiniz. Bu, hangi verileri ne zaman dışa aktaracağınız konusunda daha fazla kontrol sahibi olmanızı sağlar.
## Tablo yapısı \{#table-structure\}
Google Cloud Storage entegrasyonunda Adapty Attribution, kurulum etkinliklerine ait geçmiş verileri depolamak için bir tablo sağlar. Tablo; kullanıcı profili, gelir ve kazançlar ile kaynak mağaza gibi birçok veri noktasına ilişkin bilgiler içerir.
:::warning
Bu yapının zamanla büyüyebileceğini unutmayın; bizim tarafımızdan veya birlikte çalıştığımız üçüncü taraflarca yeni veriler eklenebilir. Bu yapıyı işleyen kodunuzun yeterince sağlam olduğundan ve belirli alanlara dayandığından, ancak yapının tamamına bağımlı olmadığından emin olun.
:::
Etkinlikler için tablo yapısı aşağıdaki gibidir:
| Sütun | Açıklama |
|--------------------------|-------------------------------------------------------|
| `adapty_profile_id` | Benzersiz Adapty profil tanımlayıcısı |
| `install_id` | Benzersiz kurulum tanımlayıcısı |
| `created_at` | Kayıt oluşturma zaman damgası (ISO 8601) |
| `installed_at` | Uygulama kurulum zaman damgası (ISO 8601) |
| `store` | Uygulama mağazası (`ios`, `android`) |
| `country` | Kullanıcının ülke kodu (ISO 3166-1 alpha-2) |
| `ip_address` | İstemci IP adresi |
| `idfa` | iOS Reklamverenler için Tanımlayıcı |
| `idfv` | iOS Satıcılar için Tanımlayıcı |
| `gaid` | Google Reklamcılık Kimliği (Android) |
| `android_id` | Android cihaz kimliği |
| `app_set_id` | Android App Set Kimliği |
| `channel` | Attribution kanalı |
| `campaign_id` | Kampanya tanımlayıcısı |
| `campaign_name` | Kampanya adı |
| `adset_id` | Reklam seti tanımlayıcısı |
| `adset_name` | Reklam seti adı |
| `ad_id` | Reklam tanımlayıcısı |
| `ad_name` | Reklam adı |
| `keyword_id` | Anahtar kelime tanımlayıcısı |
| `keyword_name` | Anahtar kelime adı |
| `asa_org_id` | Apple Search Ads organizasyon kimliği |
| `asa_keyword_match_type` | ASA anahtar kelime eşleşme türü (`Exact`, `Broad`) |
| `asa_attribution` | ASA attribution verisi (JSON dizesi) |
| `asa_conversion_type` | ASA dönüşüm türü |
| `asa_country_or_region` | ASA ülkesi veya bölgesi |
| `asa_creative_set_name` | ASA kreatif set adı |
| `fbclid` | Facebook Tıklama Kimliği |
| `ttclid` | TikTok Tıklama Kimliği |
| `utm_source` | UTM kaynak parametresi |
| `utm_medium` | UTM medium parametresi |
| `utm_campaign` | UTM kampanya parametresi |
| `utm_term` | UTM term parametresi |
| `utm_content` | UTM içerik parametresi |
---
# File: adapty-mail
---
---
title: "Adapty Mail"
description: "Deneme kullanıcılarını ücretli abonelere dönüştüren yapay zeka destekli e-posta kampanyaları."
---
Entegrasyonlar, bu entegrasyon üzerinden gönderilen tüm etkinlikleri etkileyen şu yapılandırma seçeneklerini sunar:
| Ayar | Açıklama |
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Reporting Proceeds** | Gelir değerlerinin nasıl gösterileceğini seçin: App Store ve Play Store komisyonları düşüldükten sonra net olarak mı, yoksa kesintilerden önce brüt olarak mı. "Send sales as proceeds" onay kutusunu işaretleyerek satışları App Store / Play Store komisyonları düşüldükten sonraki net tutar olarak görüntüleyebilirsiniz. |
| **Send Trial Price** | İşaretlenirse Adapty, Trial Started etkinliği için abonelik fiyatını iletir. |
| **Exclude Historical Events** | Kullanıcının Adapty SDK'lı uygulamayı yüklemesinden önce gerçekleşen etkinlikleri hariç tutmayı seçin. Bu, etkinliklerin tekrarlanmasını önler ve doğru raporlama sağlar. Örneğin, bir kullanıcı 10 Ocak'ta aylık abonelik başlattıysa ve uygulamayı 6 Mart'ta Adapty SDK ile güncellediyse, Adapty 6 Mart öncesindeki etkinlikleri atlayıp sonrakileri aktarır. |
| **Report User's Currency** | Satışların kullanıcının para biriminde mi yoksa USD cinsinden mi raporlanacağını seçin. |
| **Send User Attributes** | Dil tercihleri gibi kullanıcıya özgü nitelikleri göndermek istiyorsanız ve OneSignal planınız 10'dan fazla etiketi destekliyorsa bu seçeneği işaretleyin. Bu seçeneği etkinleştirmek, varsayılan 10 etiketin ötesinde ek bilgilerin dahil edilmesine olanak tanır. Etiket sınırlarının aşılması hatalara yol açabilir. |
| **Send Attributions** | Attribution bilgilerini (ör. AppsFlyer attribution) iletmek ve ilgili ayrıntıları almak için bu seçeneği etkinleştirin. |
| **Send Play Store purchase token** | Gerektiğinde satın almayı yeniden doğrulamak için gereken Play Store token'ını almak üzere bu seçeneği etkinleştirin. Etkinleştirildiğinde etkinliğe `play_store_purchase_token` parametresi eklenir. |
| **Delay events with future datetime** | **Yalnızca AppsFlyer ve özel webhook'lar için**: Etkinleştirildiğinde, yenileme ve deneme dönüşüm etkinlikleri gerçekleştikleri tarihte gönderilir. Devre dışı bırakıldığında (varsayılan), bu etkinlikler tarih gelecekte olsa bile algılandığı anda gönderilir. |
| **Data residency** | **Yalnızca Mixpanel ve Amplitude için**: Etkinliklerinizin nerede işlenip depolanacağını belirlemek üzere veri yerleşimini seçin. |
## Etkinlikleri yapılandırma \{#configure-the-events\}
Kimlik bilgilerinin altında, Adapty'den seçili entegrasyon platformuna gönderebileceğiniz üç etkinlik grubu bulunur. İhtiyaç duyduklarınızı etkinleştirmeniz gerekir.
Etkinlik adı özelleştirmesinin yalnızca belirli entegrasyonlarda mevcut olduğunu, diğerlerinde ise etkinlik adlarının sabit olduğunu ve değiştirilemediğini belirtmek gerekir. Ayrıca [Airbridge](airbridge#configure-events-and-tags) gibi bazı entegrasyonlarda tek bir Adapty etkinliğine birden fazla etkinlik adı atama esnekliğine sahipsiniz. Adapty tarafından sunulan etkinliklerin tam listesini [buradan](events) inceleyebilirsiniz.
Adapty'nin varsayılan etkinlik adlarını kullanmanızı öneririz; ancak etkinlik adlarını özel gereksinimlerinize göre uyarlama özgürlüğüne de sahipsiniz.
---
# File: events
---
---
title: "Üçüncü taraf entegrasyonlara gönderilecek olaylar"
description: "Adapty'nin analitik araçlarını kullanarak önemli abonelik olaylarını takip edin."
---
Apple ve Google, abonelik olaylarını [App Store Sunucu Bildirimleri](enable-app-store-server-notifications) ve [Gerçek Zamanlı Geliştirici Bildirimleri (RTDN)](enable-real-time-developer-notifications-rtdn) aracılığıyla doğrudan sunuculara gönderir. Bu nedenle mobil uygulamalar, olayları analitik sistemlere gerçek zamanlı olarak güvenilir biçimde iletamaz. Örneğin bir kullanıcı abone olup uygulamayı bir daha açmazsa, geliştirici sunucu olmadan hiçbir abonelik durum güncellemesi alamaz.
Adapty bu boşluğu, abonelik verilerini toplayıp okunabilir olaylara dönüştürerek kapatır. Bu entegrasyon olayları JSON formatında gönderilir. Tüm olaylar aynı yapıyı paylaşsa da alanları olay türüne, mağazaya ve belirli yapılandırmaya göre farklılık gösterir. Her olaya dahil edilen tam alanları ilgili entegrasyon sayfalarında bulabilirsiniz.
Bir olayın başarıyla işlenip işlenmediğini veya bir sorun olup olmadığını nasıl anlayacağınızı öğrenmek için [Olay durumları](event-statuses) sayfasına göz atın.
## Olay türleri \{#event-types\}
Olayların büyük çoğunluğu oluşturulup etkinleştirildiklerinde yapılandırılmış tüm entegrasyonlara gönderilir. Ancak **Access level updated** olayı yalnızca [webhook entegrasyonu](webhook) yapılandırılmışsa ve bu olay etkinleştirilmişse tetiklenir. Bu olay [Event Feed](https://app.adapty.io/event-feed)'de görünecek ve webhook'a gönderilecektir; ancak diğer entegrasyonlarla paylaşılmaz.
Bir webhook entegrasyonu yapılandırılmamışsa veya bu olay türü etkinleştirilmemişse **Access level updated** olayı oluşturulmaz ve [Event Feed](https://app.adapty.io/event-feed)'de görünmez.
| Event name | Description |
|:-----------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| subscription_started | Kullanıcı deneme süresi olmaksızın ücretli bir abonelik etkinleştirdiğinde, yani anında ücretlendirildiğinde tetiklenir. |
| subscription_renewed | Abonelik yenilendiğinde ve kullanıcı ücretlendirildiğinde gerçekleşir. Bu olay, deneme süreli veya deneme süresiz aboneliklerde ikinci ödemeden itibaren başlar. |
| subscription_renewal_cancelled | Kullanıcı abonelik otomatik yenilemesini kapattığında tetiklenir. Kullanıcı, ücretli abonelik süresi sonuna kadar premium özelliklere erişmeye devam eder. |
| subscription_renewal_reactivated | Kullanıcı abonelik otomatik yenilemesini yeniden etkinleştirdiğinde tetiklenir. |
| subscription_expired | İptal edilen bir abonelik tamamen sona erdiğinde tetiklenir. Örneğin, kullanıcı aboneliğini 12 Aralık'ta iptal etmiş ancak abonelik 31 Aralık'a kadar aktif kalmaya devam ediyorsa, olay aboneliğin sona erdiği 31 Aralık'ta kaydedilir. |
| subscription_paused | Kullanıcı [abonelik duraklatma](https://developer.android.com/google/play/billing/lifecycle/subscriptions#pause) özelliğini etkinleştirdiğinde gerçekleşir (yalnızca Android). |
| subscription_deferred | Abonelik satın alımı [ertelendiğinde](https://adapty.io/glossary/subscription-purchase-deferral/) tetiklenir; kullanıcılar premium özelliklere erişimlerini sürdürürken ödemeyi geciktirebilir. Bu özellik Google Play Developer API aracılığıyla kullanılabilir ve ücretsiz denemeler için ya da mali güçlük yaşayan kullanıcılara destek sağlamak amacıyla kullanılabilir. |
| non_subscription_purchase | Süresiz erişim veya oyun içi coin gibi consumable ürünler dahil, abonelik dışındaki tüm satın almalar. |
| trial_started | Kullanıcı deneme aboneliği etkinleştirdiğinde tetiklenir. |
| trial_converted | Deneme süresi sona erdiğinde ve kullanıcı ücretlendirildiğinde (ilk satın alma) gerçekleşir. Örneğin, kullanıcının denemesi 14 Ocak'a kadar sürüyor ancak 7 Ocak'ta ücretlendiriliyorsa, bu olay 7 Ocak'ta kaydedilir. |
| trial_renewal_cancelled | Kullanıcı deneme süresi boyunca abonelik otomatik yenilemesini kapattığında tetiklenir. Kullanıcı deneme süresi sonuna kadar premium özelliklere erişmeye devam eder; ancak ücretlendirilmez ve abonelik başlatılmaz. |
| trial_renewal_reactivated | Kullanıcı deneme süresi boyunca abonelik otomatik yenilemesini yeniden etkinleştirdiğinde gerçekleşir. |
| trial_expired | Deneme süresi aboneliğe dönüşmeden sona erdiğinde tetiklenir. |
| entered_grace_period | Ödeme girişimi başarısız olduğunda ve kullanıcı ek süreye girdiğinde gerçekleşir (etkinleştirilmişse). Kullanıcı bu süre boyunca premium erişimini korur. |
| billing_issue_detected | Ücretlendirme girişimi sırasında bir ödeme sorunu oluştuğunda (örn. yetersiz kart bakiyesi) tetiklenir. |
| subscription_refunded | Bir abonelik iade edildiğinde (örn. Apple Support tarafından) tetiklenir. |
| non_subscription_purchase_refunded | Abonelik dışı bir satın alma iade edildiğinde tetiklenir. |
| access_level_updated | Kullanıcının access level'ı güncellendiğinde gerçekleşir. |
Yukarıdaki olaylar, kullanıcıların satın alma açısından durumunu eksiksiz biçimde kapsar. Birkaç örneğe bakalım.
### Örnek 1 \{#example-1\}
_Kullanıcı 1 Nisan'da 7 günlük deneme süresiyle aylık bir abonelik başlattı. 4. günde aboneliğini iptal etti._
Bu durumda şu olaylar gönderilir:
1. 1 Nisan'da `trial_started`
2. 4 Nisan'da `trial_renewal_cancelled`
3. 7 Nisan'da `trial_expired`
### Örnek 2 \{#example-2\}
_Kullanıcı 1 Nisan'da 7 günlük deneme süresiyle aylık bir abonelik başlattı. 10. günde aboneliğini iptal etti._
Bu durumda şu olaylar gönderilir:
1. 1 Nisan'da `trial_started`
2. 7 Nisan'da `trial_converted`
3. 10 Nisan'da `subscription_renewal_cancelled`
4. 1 Mayıs'ta `subscription_expired`
Her senaryoda hangi olayların tetiklendiğine dair ayrıntılı bir döküm için [Olay akışları](event-flows) sayfasına bakın.
---
# File: event-flows
---
---
title: "Etkinlik akışları"
description: "Adapty'deki abonelik etkinlik akışlarının ayrıntılı şemalarını keşfedin. Abonelik etkinliklerinin nasıl oluşturulduğunu ve integrasyonlara nasıl gönderildiğini öğrenerek müşterilerinizin yolculuklarındaki önemli anları takip edin."
---
Adapty'de, bir müşterinin uygulamanızdaki yolculuğu boyunca çeşitli abonelik olayları alırsınız. Bu abonelik akışları, kullanıcılar abone olurken, iptal ederken veya aboneliklerini yeniden etkinleştirirken Adapty'nin ürettiği olayları anlamanıza yardımcı olmak için yaygın senaryoları özetler.
Apple'ın abonelik ödemelerini gerçek başlangıç/yenileme zamanından birkaç saat önce işlediğini unutmayın. Aşağıdaki akışlarda, diyagramları sade tutmak amacıyla abonelik başlangıcı/yenilemesi ile ödemenin aynı anda gerçekleştiğini gösteriyoruz.
Ayrıca, aynı işleme ilişkin olaylar eş zamanlı gerçekleşir ve **Event Feed** bölümünüzde diyagramlarımızda gösterilen sıradan farklı bir sırayla görünebilir.
## Abonelik Yaşam Döngüsü \{#subscription-lifecycle\}
### İlk Satın Alma Akışı \{#initial-purchase-flow\}
Bu akış, bir müşteri deneme süresi olmadan ilk kez abonelik satın aldığında gerçekleşir. Bu durumda aşağıdaki olaylar oluşturulur:
- **Subscription started**
- **Access level updated**: kullanıcıya erişim izni vermek için
Abonelik yenileme tarihi geldiğinde abonelik yenilenir. Bu durumda aşağıdaki olaylar oluşturulur:
- **Subscription renewal**: aboneliğin yeni bir dönemini başlatmak için
- **Access level updated**: aboneliğin son kullanma tarihini güncelleyerek erişimi bir dönem daha uzatmak için
Ödemenin başarısız olduğu veya kullanıcının yenilemeyi iptal ettiği durumlar sırasıyla [Billing Issue Outcome Flow](event-flows#billing-issue-outcome-flow) ve [Subscription Cancellation Flow](event-flows#subscription-cancellation-flow) bölümlerinde açıklanmaktadır.
### Abonelik İptal Akışı \{#subscription-cancellation-flow\}
Bir kullanıcı aboneliğini iptal ettiğinde aşağıdaki olaylar oluşturulur:
- **Subscription renewal canceled**: Aboneliğin mevcut dönemin sonuna kadar aktif kaldığını, ardından kullanıcının erişimini kaybedeceğini belirtir.
- **Access level updated**: Access level için otomatik yenilemeyi devre dışı bırakmak amacıyla oluşturulur.
Abonelik sona erdiğinde, aboneliğin bitişini işaretlemek için **Subscription expired (churned)** olayı tetiklenir.
Bir iade onaylanırsa, **Subscription expired (churned)** yerine şu olay gelir:
- **Subscription refunded**: aboneliği sona erdirir ve iade hakkında ayrıntı sağlar
Stripe'ta bir abonelik, kalan süre atlanarak anında iptal edilebilir. Bu durumda tüm olaylar aynı anda oluşturulur:
- **Subscription renewal cancelled**
- **Subscription expired (churned)**
- **Access Level updated** (kullanıcının erişimi kaldırılır)
Bir iade onaylanırsa, onaylandığında aynı zamanda bir **Subscription refunded** olayı da tetiklenir.
### Abonelik Yeniden Etkinleştirme Akışı \{#subscription-reactivation-flow\}
Bir kullanıcı aboneliğini iptal ederse, abonelik sona erer ve kullanıcı daha sonra aynı aboneliği yeniden satın alırsa, bir **Subscription renewed** olayı oluşturulur. Erişimde bir kesinti olsa bile Adapty, bunu `vendor_original_transaction_id` ile bağlantılı tek bir işlem zinciri olarak değerlendirir. Dolayısıyla yeniden satın alma, bir yenileme olarak kabul edilir.
**Access level updated** olayları iki kez oluşturulur:
- abonelik sona erdiğinde kullanıcının erişimini iptal etmek için
- abonelik yeniden satın alındığında erişim vermek için
### Abonelik Duraklatma Akışı (Yalnızca Android) \{#subscription-pause-flow-android-only\}
Bu akış, bir kullanıcının Android'de aboneliğini duraklatıp daha sonra devam ettirmesi durumunda geçerlidir.
Aboneliği duraklatmanın etkileri hemen gerçekleşmez. Kullanıcı bir aboneliği yenilenmeden önce duraklatırsa, abonelik aktif kalmaya devam eder ve kullanıcı mevcut fatura döneminin sonuna kadar ücretli erişimini korur.
1. Kullanıcı bir aboneliği duraklatığında **Subscription paused (Android only)** etkinliği tetiklenir.
2. Abonelik döneminin sonunda Adapty, kullanıcının erişimini iptal etmek için **Access level updated** etkinliğini tetikler.
3. Kullanıcı aboneliği yeniden başlattığında şu etkinlikler tetiklenir:
- **Subscription renewed**
- Kullanıcının erişimini geri yüklemek için **Access level updated**
Bu abonelikler, aynı **vendor_original_transaction_id** ile bağlantılı olarak aynı işlem zincirinde yer alır.
## Trial Akışları \{#trial-flows\}
Uygulamanızda deneme süresi kullanıyorsanız, deneme süresine ilişkin ek etkinlikler alırsınız.
### Başarılı Dönüşümlü Deneme Akışı \{#trial-with-successful-conversion-flow\}
En yaygın akış, kullanıcının bir deneme başlatması, kredi kartı bilgilerini girmesi ve deneme süresi sonunda standart aboneliğe başarıyla geçmesiyle gerçekleşir. Bu durumda, deneme başlangıcı anında şu olaylar oluşturulur:
- **Trial started** — denemenin başladığını işaretler
- **Access level updated** — erişimi etkinleştirir
**Trial converted** olayı ise standart abonelik başladığında oluşturulur.
### Başarılı Dönüşüm Olmadan Deneme Akışı \{#trial-without-successful-conversion-flow\}
Kullanıcı deneme süresi aboneliğe dönüşmeden iptal ederse, iptal anında şu olaylar oluşturulur:
- **Trial renewal cancelled**: Deneme süresinin otomatik olarak aboneliğe dönüşmesi devre dışı bırakılır
- **Access level updated**: Access level yenileme devre dışı bırakılır
Kullanıcı, deneme süresinin sonuna kadar erişimine devam eder; bu sürenin bitişinde ise denemenin sona erdiğini işaretleyen **Trial expired** olayı oluşturulur.
### Süresi Dolmuş Deneme Sonrası Abonelik Yeniden Etkinleştirme Akışı \{#subscription-reactivation-after-expired-trial-flow\}
Bir deneme süresi (faturalandırma sorunu veya iptal nedeniyle) sona ererse ve kullanıcı daha sonra bir abonelik satın alırsa, şu olaylar oluşturulur:
- Kullanıcıya erişim vermek için **Access level updated**
- **Trial converted**
Deneme ile abonelik arasında bir boşluk olsa bile Adapty, `vendor_original_transaction_id` kullanarak ikisini birbirine bağlar. Bu dönüşüm, sıfır fiyatlı bir denemeyle başlayan kesintisiz bir işlem zincirinin parçası olarak değerlendirilir. Bu nedenle **Subscription started** yerine **Trial converted** olayı oluşturulur.
## Ürün Değişiklikleri \{#product-changes\}
Bu bölüm, aktif aboneliklerde yapılan değişiklikleri kapsar; yükseltmeler, düşürmeler veya başka bir gruptan ürün satın alımları gibi.
### Anlık Ürün Değişikliği Akışı \{#immediate-product-change-flow\}
Bir kullanıcı ürün değiştirdiğinde, abonelik sona ermeden önce bu değişiklik sistemde anlık olarak uygulanabilir (çoğunlukla bir ürünün yükseltilmesi veya değiştirilmesi durumunda). Bu durumda, ürün değişikliği anında:
- Access level değişir ve iki **Access level updated** olayı oluşturulur:
1. Birinci ürüne erişimi kaldırmak için.
2. İkinci ürüne erişim vermek için.
- Eski abonelik sona erer ve iade yapılır (**Subscription refunded** olayı `cancellation_reason` = `upgraded` ile oluşturulur). Dikkat: **Subscription expired (churned)** olayı oluşturulmaz; bunun yerine **Subscription refunded** olayı kullanılır.
- Yeni abonelik başlar (yeni ürün için **Subscription started** olayı oluşturulur).
Kullanıcı aboneliğini düşürürse, ilk abonelik ödenen süre sonuna kadar geçerliliğini korur ve sona erdiğinde yeni, daha düşük kademeli abonelikle değiştirilir. Bu durumda, yalnızca otomatik yenilemeyi devre dışı bırakmak için **Access level updated** eventi hemen oluşturulur. Diğer tüm eventler, aboneliğin fiilen değiştirildiği anda oluşturulur:
- İkinci ürüne erişim vermek için yeni bir **Access level updated** eventi oluşturulur.
- İlk ürünün aboneliğini sonlandırmak için **Subscription expired (churned)** eventi oluşturulur.
- Yeni ürün için yeni bir abonelik başlatmak amacıyla **Subscription started** eventi oluşturulur.
### Gecikmeli Ürün Değişim Akışı \{#delayed-product-change-flow\}
Kullanıcının ürünü abonelik yenileme anında değiştirdiği bir varyant da mevcuttur. Bu varyant bir öncekine çok benzer: eski ürün için otomatik yenilemeyi devre dışı bırakmak amacıyla tek bir **Access level updated** eventi hemen oluşturulur. Diğer tüm eventler, kullanıcının aboneliği değiştirdiği ve bu değişikliğin sistemde yansıtıldığı anda oluşturulur:
- İkinci ürüne erişim vermek için yeni bir **Access level updated** olayı oluşturulur.
- Birinci ürünün aboneliğini sona erdirmek için **Subscription expired (churned)** olayı oluşturulur.
- Yeni ürün için yeni bir abonelik başlatmak amacıyla **Subscription started** olayı oluşturulur.
## Ödeme Sorunu Sonuç Akışı \{#billing-issue-outcome-flow\}
Deneme süresini dönüştürme veya aboneliği yenileme girişimleri bir ödeme sorunu nedeniyle başarısız olursa, bundan sonra ne olacağı ek sürenin etkin olup olmadığına bağlıdır.
Ek süre etkinken ödeme başarılı olursa deneme süresi dönüşür ya da abonelik yenilenir. Başarısız olursa uygulama mağazası kullanıcıyı abonelik için ücretlendirmeye çalışmaya devam eder; yine başarısız olursa uygulama mağazası deneme süresini veya aboneliği kendisi sonlandırır.
Bu nedenle, ödeme sorununun yaşandığı anda Adapty'de aşağıdaki olaylar oluşturulur:
- **Billing issue detected**
- **Entered grace period** (ek süre etkinleştirilmişse)
- **Access level updated** (ek süre sonuna kadar erişim sağlamak için)
Ödeme daha sonra başarılı olursa, Adapty bir **Trial converted** veya **Subscription renewed** olayı kaydeder ve kullanıcı erişimini kaybetmez.
Ödeme sonunda başarısız olur ve uygulama mağazası aboneliği iptal ederse, Adapty şu olayları oluşturur:
- **Trial expired** veya **Subscription expired (churned)** — `cancellation_reason: billing_error` ile
- **Access level updated** (kullanıcının erişimini iptal etmek için)
Ek süre olmadan, Fatura Yeniden Deneme Süresi (uygulama mağazasının kullanıcıdan ücret almayı denemeye devam ettiği süre) hemen başlar.
Ek süre sonuna kadar ödeme hiçbir zaman başarılı olmazsa, akış aynıdır: uygulama mağazası aboneliği otomatik olarak sonlandırdığında aynı olaylar oluşturulur:
- `cancellation_reason` değeri `billing_error` olan **Trial expired** veya **Subscription expired (churned)** olayı
- Kullanıcının erişimini iptal etmek için **Access level updated**
## Kullanıcı Hesapları Arasında Satın Almaları Paylaşma Akışları \{#sharing-purchases-across-user-accounts-flows\}
Bir
Bu senaryoda oluşturulan olaylardaki access level atama ve aktarımıyla ilgili alanların dökümü şöyledir:
- **Kullanıcı A: Access level güncellendi (Kullanıcı A uygulamada bir abonelik satın aldığında gönderilir)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": null
}
```
- **User A: Access level güncellendi (uygulama yeniden yüklenip User B giriş yaptığında ve User A'nın erişimi iptal edildiğinde gönderilir)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": false,
},
"profiles_sharing_access_level": null
}
```
- **Kullanıcı B: Access level güncellendi (Kullanıcı B giriş yaptığında ve erişim verildiğinde gönderilir)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000001",
"customer_user_id": UserB,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": null
}
```
### Kullanıcılar Arasında Paylaşılan Erişim Akışı \{#shared-access-between-users-flow\}
Bu seçenek, aynı Apple/Google kimliğiyle oturum açılmış cihazlardaki birden fazla kullanıcının aynı access level'ı paylaşmasına olanak tanır. Bu özellik, kullanıcının uygulamayı yeniden yükleyip farklı bir e-posta ile giriş yaptığında önceki satın alımına erişimini kaybetmemesi için kullanışlıdır. Bu seçenek sayesinde, birden fazla tanımlı kullanıcı aynı access level'ı paylaşabilir. Access level paylaşılırken tüm işlemler, eksiksiz işlem geçmişi ve analitik verilerinin korunması amacıyla orijinal
Bu senaryoda oluşturulan olaylarda access level atama ve paylaşımıyla ilgili alanların ayrıntılı açıklaması:
**Kullanıcı B: Access level updated (Kullanıcı B giriş yaptığında ve erişim verildiğinde gönderilir)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": [
{
"profile_id": "00000000-0000-0000-0000-000000000001,
"customer_user_id": UserB
}
]
}
```
### Erişimin Kullanıcılar Arasında Paylaşılmadığı Akış \{#access-not-shared-between-users-flow\}
Bu seçenekte, access level'ı ilk alan kullanıcı profili bunu kalıcı olarak korur. Satın almaların tek bir
---
# File: event-statuses
---
---
title: "Entegrasyon etkinlik durumları"
description: ""
---
Adapty, teslim edilebilirliği HTTP durum koduna göre belirler; `200-399` aralığı dışındaki her yanıtı başarısız kabul eder.
Entegrasyon etkinliklerinin durumunu Adapty Kontrol Paneli'ndeki **Event List** bölümünde takip edebilirsiniz. Sistem, belirli bir etkinlik türü ilgili entegrasyon için açık olup olmadığına bakılmaksızın, etkinleştirilmiş tüm entegrasyonların durumlarını gösterir.
- Siyah: Etkinlik başarıyla gönderildi.
- Gri: Etkinlik türü bu entegrasyon için devre dışı.
- Kırmızı: Dikkat gerektiren bir entegrasyon sorunu var.
Başarısız etkinlikler hakkında daha fazla bilgi için entegrasyon adının üzerine gelin; belirli hata bilgilerini içeren bir ipucu görüntülenir.
**Event Feed**, performansı optimize etmek amacıyla yalnızca son iki haftanın verilerini gösterir. Bu sınırlama, sayfa yükleme hızını artırır ve kullanıcıların etkinlikleri daha kolay gezinip analiz etmesini sağlar.
---
# File: adjust
---
---
title: "Adjust"
description: "Daha iyi abonelik takibi ve analitik için Adjust'ı Adapty ile bağlayın."
---
[Adjust](https://www.adjust.com/), pazarlama kampanyalarından veri toplayıp sunan önde gelen Mobil Ölçüm Ortağı (MMP) platformlarından biridir. Bu sayede şirketler kampanya performanslarını takip edebilir.
Adapty, mağazalardan gelen [abonelik etkinliklerini](events) tek bir yerden takip etmenizi sağlayan eksiksiz bir veri seti sunar. Adapty sayesinde abonelerinizin davranışlarını kolayca görebilir, neyi sevdiklerini öğrenebilir ve bu bilgileri hedefli ve etkili bir şekilde iletişim kurmak için kullanabilirsiniz. Bu entegrasyon, abonelik etkinliklerini Adjust'ta takip etmenize ve kampanyalarınızın tam olarak ne kadar gelir ürettiğini analiz etmenize olanak tanır.
Adapty ile Adjust arasındaki entegrasyon iki temel şekilde çalışır.
1. **Adapty, Adjust'tan attribution verisi alır**
Adjust entegrasyonunu kurduktan sonra Adapty, Adjust'tan attribution verisi almaya başlar. Bu verilere kullanıcının profil sayfasından kolayca erişebilir ve görüntüleyebilirsiniz.
2. **Adapty, abonelik olaylarını Adjust'a gönderir**
Adapty, entegrasyonunuzda yapılandırılmış tüm abonelik olaylarını Adjust'a gönderebilir. Böylece bu olayları Adjust kontrol panelinde takip edebilirsiniz. Bu entegrasyon, reklam kampanyalarınızın etkinliğini değerlendirmek için oldukça faydalıdır.
## Entegrasyonu kurma \{#set-up-integration\}
### Adapty'yi Adjust'a Bağlama \{#connect-adapty-to-adjust\}
1. Adapty Kontrol Paneli'ni açın ve [Integrations > Adjust](https://app.adapty.io/integrations/adjust) sayfasına gidin.
2. Sayfanın üstündeki geçiş düğmesini "on" konumuna getirin.
3. Alanları doldurun ve erişim kimlik bilgilerinizi girin.
3. Adjust platformunda OAuth yetkilendirmeyi etkinleştirdiyseniz, iOS ve Android uygulamalarınız için entegrasyon sürecinde **OAuth Token** sağlamanız zorunludur.
4. Ardından iOS ve Android uygulamalarınız için **app token**'larını girin. Adjust kontrol panelinizi açtığınızda uygulamalarınızı göreceksiniz.
:::note
iOS ve Android için farklı Adjust uygulamalarınız olabilir; bu nedenle Adapty'de bunlar için iki bağımsız bölüm bulunmaktadır. Yalnızca bir Adjust uygulamanız varsa aynı bilgileri iki alana da girebilirsiniz.
:::
5. Listeden uygulamanızı seçin ve **App Token**'ı kopyalayın. Token'ı Adapty kontrol panelindeki ilgili alana yapıştırın.
### Etkinlikleri ve etiketleri yapılandırma \{#configure-events-and-tags\}
Adjust, diğer platformlardan biraz farklı çalışır. Adjust kontrol panelinde etkinlikleri manuel olarak oluşturmanız, etkinlik token'larını almanız ve bunları Adapty'deki ilgili etkinliklere kopyalayıp yapıştırmanız gerekir.
Dolayısıyla buradaki ilk adım, Adapty'nin göndermesini istediğiniz tüm etkinlikler için etkinlik token'larını bulmaktır. Bunun için:
1. Adjust kontrol panelinde uygulamanızı açın ve **Events** sekmesine geçin.
1. Etkinlik token'ını kopyalayın ve Adapty'ye yapıştırın. Kimlik bilgilerinin altında, Adapty'den Adjust'a gönderebileceğiniz üç grup etkinlik bulunmaktadır. Adapty'nin sunduğu etkinliklerin tam listesine [buradan](events) ulaşabilirsiniz.
Adapty, sunucular arası entegrasyon aracılığıyla abonelik etkinliklerini Adjust'a gönderir. Bu sayede tüm abonelik etkinliklerini Adjust kontrol panelinizde görüntüleyebilir ve bunları edinim kampanyalarınızla ilişkilendirebilirsiniz.
:::important
Aşağıdakileri göz önünde bulundurun:
- Adjust, 58 günden eski etkinlikleri desteklemiyor. Bu nedenle, 58 günden eski bir etkinliğiniz varsa Adapty onu Adjust'a gönderir; ancak etkinlik tarihi/saati geçerli zaman damgasıyla değiştirilir.
- Adjust, IPv6'yı desteklemiyor. **App settings** bölümünde veya SDK etkinleştirme sırasında SDK'da IP toplamayı devre dışı bırakırsanız yalnızca bir backend IPv6 gönderilebilir ve izleme başarısız olabilir — IPv4 kullanıldığından emin olmak için SDK IP toplamayı etkin tutun.
:::
### Uygulamanızı Adjust ile bağlayın \{#connect-your-app-to-adjust\}
Yukarıda açıklanan adımları tamamladıktan sonra, uygulamanıza aşağıdaki iki metodu ekleyin. Bu metodlar, uygulamanız ile Adjust arasındaki iletişimi sağlayacaktır:
1. **Abonelik verilerini Adjust'a göndermek için**: Adjust cihaz ID'sini `setIntegrationIdentifier()` SDK metoduna aktarın
2. **Adjust'tan attribution verisi almak için**: `updateAttribution()` SDK metoduyla attribution verisini güncelleyin
Adjust 5.0 veya sonraki sürümler için aşağıdaki örneği kullanın:
Her ikisi de Airbridge kontrol panelinizde [Third-party Integrations > Adapty](https://app.airbridge.io/app/testad/integrations/third-party/adapty) bölümünde bulunabilir.
Adapty API token alanı, Adapty tarafında önceden oluşturulmuştur. Adapty API token değerini kopyalayarak Airbridge Kontrol Paneli'ndeki Adapty Authorization Token alanına yapıştırmanız gerekir.
### Etkinlikleri ve etiketleri yapılandırma \{#configure-events-and-tags\}
Kimlik bilgilerinin altında, Adapty'den Airbridge'e gönderebileceğiniz üç etkinlik grubu bulunur.
İhtiyaç duyduklarınızı etkinleştirmeniz yeterlidir.
### Uygulamanızı Airbridge'e bağlama \{#connect-your-app-to-airbridge\}
Entegrasyon için `airbridge_device_id` değerini profil oluşturucuya iletmeniz ve aşağıdaki örnekte gösterildiği gibi `setIntegrationIdentifier` fonksiyonunu çağırmanız gerekir:
## Entegrasyonu Kurma \{#set-up-integration\}
### Adapty'yi AdServices framework'üne bağlama \{#connect-adapty-to-the-adservices-framework\}
Apple Ads, [AdServices](https://developer.apple.com/documentation/adservices) aracılığıyla Adapty Kontrol Paneli'nde bazı yapılandırmalar gerektirir ve bunu uygulama tarafında da etkinleştirmeniz gerekir. AdServices framework'ü aracılığıyla Adapty üzerinden Apple Ads'i kurmak için şu adımları izleyin:
#### 1. Adım: Genel anahtarı edinin \{#step-1-obtain-public-key\}
Adapty Kontrol Paneli'nde [Settings -> Apple Ads](https://app.adapty.io/settings/apple-search-ads) sayfasına gidin.
Önceden oluşturulmuş genel anahtarı (Adapty sizin için bir anahtar çifti sağlar) bulun ve kopyalayın.
:::note
Apple Ads attribution için alternatif bir hizmet veya kendi çözümünüzü kullanıyorsanız, kendi özel anahtarınızı yükleyebilirsiniz.
:::
#### Adım 2: Apple Ads'de kullanıcı yönetimini yapılandırın \{#step-2-configure-user-management-on-apple-ads\}
[Apple Ads hesabınızda](https://ads.apple.com/app-store) **Settings > User Management** sayfasına gidin. Adapty'nin attribution verilerini çekebilmesi için başka bir Apple ID hesabını davet etmeniz ve bu hesaba API Account Manager erişimi vermeniz gerekir. Erişiminiz olan herhangi bir hesabı kullanabilir ya da bu amaç için yeni bir hesap oluşturabilirsiniz. Önemli olan nokta şudur: bu Apple ID ile Apple Ads'e giriş yapabilmeniz gerekir.
#### Adım 3: API kimlik bilgileri oluşturun \{#step-3-generate-api-credentials\}
Bir sonraki adım olarak, Apple Ads'e yeni eklenen hesapla giriş yapın. Apple Ads arayüzünde Settings -> API bölümüne gidin. Daha önce kopyaladığınız genel anahtarı ilgili alana yapıştırın. Yeni API kimlik bilgileri oluşturun.
#### Adım 4: Adapty'yi Apple Ads kimlik bilgileriyle yapılandırın \{#step-4-configure-adapty-with-apple-ads-credentials\}
Apple Ads ayarlarından Client ID, Team ID ve Key ID alanlarını kopyalayın. Adapty Kontrol Paneli'nde bu kimlik bilgilerini ilgili alanlara yapıştırın.
### Uygulamanızı AdServices ağına bağlama \{#connect-your-app-to-the-adservices-network\}
[AdServices framework kurulumunu](#connect-the-adservices-framework) tamamladıktan sonra Adapty, Apple Search Ad attribution verilerini otomatik olarak toplamaya başlar. Herhangi bir SDK kodu eklemenize gerek yoktur.
iOS uygulamaları için bu attribution verisi **her zaman** diğer kaynaklardan gelen verilere göre öncelikli olacaktır. Bu davranış istenmiyor ise aşağıdaki talimatları kullanarak ASA attribution'ı *devre dışı bırakın*.
## Entegrasyonu devre dışı bırakma \{#disable-integration\}
Apple Search Ads attribution'ını kapatmak için [**App Settings** -> **Apple Search Ads** sekmesini](https://app.adapty.io/settings/apple-search-ads) açın ve **Receive Apple Search Ads attribution** anahtarını kapatın.
:::warning
Bunu devre dışı bırakmanın ASA analizlerinin tamamen durmasına yol açacağını unutmayın. Sonuç olarak, ASA artık analizlerde kullanılmayacak ve entegrasyonlara gönderilmeyecektir. Ayrıca SplitMetrics Acquire ve Asapty, doğru çalışmak için ASA attribution'a bağlı olduklarından işlevlerini yitirecektir.
Bu değişiklikten önce alınan attribution verileri etkilenmeyecektir.
:::
## Kendi Anahtarlarınızı Yükleme \{#uploading-your-own-keys\}
:::note
İsteğe bağlı
Bu adımlar Apple Ads attribution için zorunlu değildir; yalnızca Asapty gibi diğer hizmetlerle veya kendi çözümünüzle çalışmak için gereklidir.
:::
ASA attribution için başka hizmetler ya da kendi çözümünüzü kullanıyorsanız kendi genel-özel anahtar çiftinizi kullanabilirsiniz.
### Adım 1 \{#step-1\}
Terminal'de özel anahtar oluşturun
```text showLineNumbers title="Text"
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
```
Adapty Settings -> Apple Ads bölümünden yükleyin (Upload private key butonu)
### Adım 2 \{#step-2\}
Terminal'de genel anahtar oluşturun
```text showLineNumbers title="Text"
openssl ec -in private-key.pem -pubout -out public-key.pem
```
Bu genel anahtarı, API Account Manager rolüne sahip hesabın Apple Ads ayarlarında kullanabilirsiniz. Böylece oluşturulan Client ID, Team ID ve Key ID değerlerini hem Adapty hem de diğer hizmetler için kullanabilirsiniz.
---
# File: switch-from-appsflyer-s2s-api-2-to-3
---
---
title: "AppsFlyer S2S API 2'den 3'e Geçiş"
description: "Adapty'de AppsFlyer S2S API 2'den 3'e yükseltin."
---
[Resmi AppsFlyer What's New](https://support.appsflyer.com/hc/en-us/articles/20509378973457-Bulletin-Upgrading-the-AppsFlyer-S2S-API) sayfasına göre AppsFlyer, API kullanımını daha güvenli hale getirmek ve dolandırıcılığı azaltmak amacıyla uygulama içi etkinlikler için sunucudan sunucuya (S2S) API'sini yükseltti. Mevcut endpoint ileride kullanımdan kaldırılacak; bu nedenle geçişi şimdiden planlamaya başlamanızı öneririz.
Adapty, AppsFlyer S2S API 3'ü destekler ve API 2'den sorunsuz bir geçiş sunar. Bu geçişin tek yönlü olduğunu unutmayın; değişikliği yaptıktan sonra API 2'ye geri dönemezsiniz.
AppsFlyer S2S API 2'den 3'e geçmek için:
1. [AppsFlyer sitesini](https://www.appsflyer.com/home) açın ve giriş yapın.
2. Kontrol panelinin sol üst köşesinde **Hesap adınıza** tıklayın ve **Security Center**'ı seçin.
3. **Manage your account security** penceresinde **Manage your AppsFlyer API and S2S tokens** düğmesine tıklayın.
4. S2S tokenınız yoksa **New token** düğmesine tıklayın. Zaten varsa 8. adıma geçin.
5. **New token** penceresinde token için bir ad girin. Bu ad yalnızca sizin referansınız içindir.
6. **Choose type** listesinden **S2S** seçeneğini seçin.
7. Yeni tokeni kaydetmek için **Create new token** düğmesine tıklamayı unutmayın.
8. **Tokens** penceresinde S2S tokenı kopyalayın.
9. Adapty Kontrol Paneli'nde [**Integrations** -> **AppsFlyer**](https://app.adapty.io/integrations/appsflyer) bölümünü açın.
10. **AppsFlyer S2S API** alanında **API 3**'ü seçin.
11. Kopyaladığınız S2S anahtarını **Dev key for iOS** ve **Dev key for Android** alanlarına yapıştırın.
12. Geçişi onaylamak için **Save** düğmesine tıklayın.
Bu işlemin ardından entegrasyonunuz anında AppsFlyer S2S API 3'e geçer ve yeni etkinlikleriniz şu URL'ye gönderilmeye başlar: `https://api3.appsflyer.com/inappevent`.
---
# File: asapty
---
---
title: "Asapty"
description: "Asapty'yi ve Adapty'nin abonelik ekosistemindeki rolünü keşfedin."
---
[Asapty](https://asapty.com/) entegrasyonunu kullanarak Search Ads kampanyalarınızı optimize edebilirsiniz. Adapty, abonelik olaylarını Asapty'ye gönderir; böylece Apple Search Ads attribution verilerine dayalı özel kontrol panelleri oluşturabilirsiniz.
Bu entegrasyon, Adapty'ye herhangi bir attribution verisi eklemez; zira ihtiyacımız olan her şeyi doğrudan [ASA](apple-search-ads) üzerinden alıyoruz.
## Entegrasyonu kurma \{#set-up-integration\}
### Adapty'yi Asapty'ye bağlama \{#connect-adapty-to-asapty\}
Asapty entegrasyonunu kurmak için Adapty kontrol panelinde [Integrations > Asapty](https://app.adapty.io/integrations/asapty) bölümüne gidin ve Asapty ID alanını doldurun.
Asapty ID'nizi Asapty hesabınızdaki **Settings > General** bölümünde bulabilirsiniz.
### Olayları ve etiketleri yapılandırma \{#configure-events-and-tags\}
Kimlik bilgilerinin altında, Adapty'den Asapty'ye gönderebileceğiniz üç grup olay yer almaktadır. İhtiyacınız olanları etkinleştirmeniz yeterli. Adapty'nin sunduğu olayların tam listesine [buradan](events) ulaşabilirsiniz.
Asapty'nin sağladığı varsayılan olay adlarını kullanmanızı öneririz. Ancak ihtiyaçlarınıza göre olay adlarını değiştirebilirsiniz.
### Uygulamanızı Asapty'ye bağlama \{#connect-your-app-to-asapty\}
Yukarıdaki adımları tamamladıktan sonra Adapty, attribution verilerini Asapty'den otomatik olarak alır. Uygulama kodunuzda attribution verilerini açıkça talep etmenize gerek yoktur. Daha doğru attribution verileri için Asapty'yi her olayın verisiyle birlikte `customerUserId` paylaşacak şekilde yapılandırın.
## Asapty olay yapısı \{#asapty-event-structure\}
Adapty, olayları sorgu parametreleri aracılığıyla GET isteğiyle Asapty'ye gönderir. Her olay URL'si şu şekilde görünür:
```
https://asapty.com/_api/mmpEvents/?source=adapty&asaptyid=a1b2c3d4&keywordid=12345&adgroupid=67890&campaignid=11223&conversiondate=1709294400000&event_name=subscription_renewed&install_time=1709100000&app_name=MyApp&json=%7B%22af_revenue%22%3A%229.99%22%2C%22af_currency%22%3A%22USD%22...%7D
```
Sorgu parametreleri:
| Parametre | Tür | Açıklama |
|:-----------------|:-------|:--------------------------------------------------------------|
| `source` | String | Her zaman "adapty" değerini alır. |
| `asaptyid` | String | Kimlik bilgilerinizdeki Asapty ID. |
| `keywordid` | String | Apple Search Ads Anahtar Kelime ID'si (varsa). |
| `adgroupid` | String | Apple Search Ads Reklam Grubu ID'si (varsa). |
| `campaignid` | String | Apple Search Ads Kampanya ID'si (varsa). |
| `conversiondate` | Long | Olayın **milisaniye** cinsinden zaman damgası. |
| `event_name` | String | Olay adı (Adapty olayından eşlenen). |
| `install_time` | Long | Kurulumun saniye cinsinden zaman damgası. |
| `app_name` | String | Adapty'deki uygulama başlığı (varsa). |
| `json` | String | Olay ayrıntılarını içeren URL kodlu JSON dizesi (aşağıya bakın). |
`json` parametresi, aşağıdaki alanları içeren URL kodlu bir JSON dizesidir:
| Parametre | Tür | Açıklama |
|:--------------------------|:-------|:----------------------------------------------------|
| `af_revenue` | String | Dize olarak gelir miktarı. |
| `af_currency` | String | Para birimi kodu (ör. "USD"). |
| `transaction_id` | String | Mağaza İşlem ID'si. |
| `original_transaction_id` | String | Orijinal Mağaza İşlem ID'si. |
| `purchase_date` | Long | Milisaniye cinsinden satın alma zaman damgası. |
| `original_purchase_date` | Long | Milisaniye cinsinden orijinal satın alma zaman damgası. |
| `environment` | String | `Production` veya `Sandbox`. |
| `vendor_product_id` | String | Mağazadaki Ürün ID'si. |
| `profile_country` | String | Kullanıcının IP'sine göre ülke kodu. |
| `store_country` | String | Kullanıcının mağaza ülke kodu. |
## Sorun giderme \{#troubleshooting\}
- Adapty'de [Apple Search Ads](apple-search-ads) yapılandırdığınızdan ve [kimlik bilgilerini yüklediğinizden](https://app.adapty.io/settings/apple-search-ads) emin olun; bunlar olmadan Asapty çalışmaz.
- Yalnızca ayrıntılı, organik olmayan ASA attribution verisine sahip profiller olaylarını Asapty'ye iletebilir. Attribution yeterli değilse "The user profile is missing the required integration data." mesajını görürsünüz.
- Entegrasyon yapılandırılmadan önce oluşturulan profiller olaylarını Asapty'ye iletamaz.
- Doğru kuruluma rağmen Adapty entegrasyonu çalışmıyorsa [**App Settings** -> **Apple Search Ads** sekmesinde](https://app.adapty.io/settings/apple-search-ads) **Receive Apple Search Ads attribution in Adapty** geçişinin etkin olduğundan emin olun.
---
# File: branch
---
---
title: "Branch"
description: "Branch'i Adapty ile entegre ederek derin bağlantıları ve uygulama dönüşümlerini takip edin."
---
[Branch](https://www.branch.io/), müşterilerin farklı cihazlar, kanallar ve platformlar arasında kullanıcılara ulaşmasını, onlarla etkileşim kurmasını ve sonuçları değerlendirmesini sağlar. Tüm cihazlar, kanallar ve platformlarda sorunsuz çalışan özel bağlantılar aracılığıyla mobil geliri artırmak için tasarlanmış kullanıcı dostu bir platformdur.
Adapty, mağazalardan gelen [abonelik etkinliklerini](events) tek bir yerde takip etmenizi sağlayan eksiksiz bir veri seti sunar. Adapty ile abonelerinizin davranışlarını kolayca gözlemleyebilir, tercihlerini öğrenebilir ve bu bilgileri hedefli ve etkili bir şekilde iletişim kurmak için kullanabilirsiniz.
Adapty ile Branch arasındaki entegrasyon iki ana şekilde çalışır.
1. **Branch'ten attribution verisi alma**
Entegrasyonu kurduktan sonra Adapty, Branch'ten attribution verisi almaya başlar. Bu verilere kullanıcının profil sayfasından kolayca erişip görüntüleyebilirsiniz.
2. **Branch'e abonelik olayları gönderme**
Adapty, entegrasyonunuzda yapılandırılan tüm abonelik olaylarını Branch'e gönderebilir. Böylece bu olayları Branch kontrol panelinde takip edebilirsiniz.
## Entegrasyonu kurma \{#set-up-integration\}
### Adapty'yi Branch'e bağlama \{#connect-adapty-to-branch\}
Branch entegrasyonu için Adapty Kontrol Paneli'nde [Integrations > Branch](https://app.adapty.io/integrations/branch) bölümüne gidin, geçiş düğmesini açık konuma getirin ve gerekli alanları doldurun.
**Branch Key** değerini almak için Branch [Hesap Ayarları](https://dashboard.branch.io/account-settings/profile) sayfasını açın ve **Branch Key** alanını bulun. Bu değeri Adapty Kontrol Paneli'ndeki **Key test** (Sandbox için) veya **Key live** (Prodüksiyon için) alanına girin. Branch'te uygun anahtarı kullanmak için Live ve Test ortamları arasında geçiş yapın.
### Etkinlikleri ve etiketleri yapılandırma \{#configure-events-and-tags\}
Kimlik bilgilerinin altında, Adapty'den Branch'e gönderebileceğiniz üç grup etkinlik yer alır. İhtiyaç duyduklarınızı açmanız yeterli. Adapty'nin sunduğu etkinliklerin tam listesine [buradan](events) ulaşabilirsiniz.
Etkinlikleri Gelir (Apple/Google payı düşüldükten sonra) veya yalnızca ciro olarak gönderebilirsiniz. Ayrıca raporlamayı kullanıcının para biriminden yapılacak şekilde ayarlayabilirsiniz.
Adapty'nin sunduğu varsayılan etkinlik adlarını kullanmanızı öneririz. Ancak ihtiyacınıza göre etkinlik adlarını değiştirebilirsiniz.
Adapty, abonelik etkinliklerini sunucudan sunucuya entegrasyon aracılığıyla Branch'e gönderir. Bu sayede tüm abonelik etkinliklerini Branch kontrol panelinizde görüntüleyebilir ve edinim kampanyalarınızla ilişkilendirebilirsiniz.
### Uygulamanızı Branch'e bağlayın \{#connect-your-app-to-branch\}
1. Bağlantıyı başlatmak için `.setIntegrationIdentifier()` SDK metodunu çağırın. Branch Identity ID'nizi `customerUserId` parametresine iletebilirsiniz.
:::note
Üçüncü taraf SDK'lar kullanıcı kimliklerini asenkron olarak oluşturur. `Adapty.activate()` çalıştığında bu kimlik henüz hazır olmayabilir. **Customer User ID**'niz bu SDK'lardan birinden geliyorsa, `Adapty.activate()` fonksiyonunu kimlik olmadan çağırın. Kimlik hazır olduğunda önce `setIntegrationIdentifier()`, ardından CUID ile birlikte `identify()` fonksiyonunu çağırın.
:::
1. App ID'yi bulmak için [App Store Connect](https://appstoreconnect.apple.com/)'te uygulamanızın sayfasını açın, **General** bölümündeki **App Information** sayfasına gidin ve ekranın sol alt kısmında **Apple ID**'yi bulun.
2. [Meta for Developers](https://developers.facebook.com/) platformunda bir uygulamanız olması gerekir. Uygulamanıza giriş yapın ve gelişmiş ayarları bulun. **App ID**'yi üst bilgi kısmında görebilirsiniz.
3. Meta Ads Manager'da gelirin çift sayılmasını önlemek için Meta SDK yapılandırmanızda istemci taraflı izlemeyi devre dışı bırakın. Bu ayarı Meta Developer Console'da **App Settings > Advanced Settings** altında bulabilirsiniz. **Log in-app events automatically** seçeneğini "No" olarak ayarlayın. Bu sayede gelir etkinlikleri yalnızca Adapty'nin entegrasyonu üzerinden izlenir.
Yükleme ve kullanım etkinliklerini izlemek için kodunuzda Meta SDK'yı etkinleştirmeniz gerekir. Platforma göre uygulama ayrıntılarını Meta SDK belgelerinde bulabilirsiniz:
- [iOS SDK](https://developers.facebook.com/docs/ios/getting-started)
- [Android SDK](https://developers.facebook.com/docs/android/getting-started)
- [Unity SDK](https://developers.facebook.com/docs/unity/getting-started/canvas)
Bu entegrasyonu Android uygulamalarıyla da kullanabilirsiniz. **App Settings** bölümünde Android SDK yapılandırmasını ayarladıysanız yalnızca **Facebook App ID**'yi girmek yeterlidir.
### Etkinlikleri ve etiketleri yapılandırma \{#configure-events-and-tags\}
Facebook Ads entegrasyonunun özellikle reklam kampanyaları için Meta kullanan ve bu kampanyaları müşteri davranışlarına göre optimize eden şirketlere yönelik olduğunu lütfen unutmayın. Bu entegrasyon, optimizasyon amacıyla Meta'nın standart etkinliklerini destekler. Dolayısıyla Meta Ads entegrasyonunda etkinlik adını değiştirmek mümkün değildir. Adapty, müşteri etkinliklerinizi doğru analiz için ilgili Meta etkinlikleriyle otomatik olarak eşleştirir.
| Adapty etkinliği | Meta Ads etkinliği |
| :---------------------------- | :-------------------------- |
| Subscription initial purchase | Subscribe |
| Subscription renewed | Subscribe |
| Subscription cancelled | CancelSubscription |
| Trial started | StartTrial |
| Trial converted | Subscribe |
| Trial cancelled | CancelTrial |
| Non subscription purchase | fb_mobile_purchase |
| Billing issue detected | billing_issue_detected |
| Entered grace period | entered_grace_period |
| Auto renew off | auto_renew_off |
| Auto renew on | auto_renew_on |
| Auto renew off subscription | auto_renew_off_subscription |
| Auto renew on subscription | auto_renew_on_subscription |
StartTrial, Subscribe ve CancelSubscription standart etkinliklerdir.
Belirli etkinlikleri etkinleştirmek için istediğiniz etkinlikleri açmanız yeterlidir. Birden fazla etkinlik adı seçilmesi durumunda Adapty, seçilen tüm etkinliklerin verilerini tek bir Adapty etkinlik adı altında birleştirir.
### Uygulamanızı Facebook Ads'e bağlama \{#connect-your-app-to-facebook-ads\}
Yukarıdaki adımları izlerseniz Facebook, abonelik verilerini Adapty'den otomatik olarak alır.
iOS 14.5'te IDFA'ya yapılan değişikliklerin ardından, kullanıcının `facebookAnonymousId` bilgisini Facebook'tan istemenizi öneririz. Bu sayede kullanıcının IDFA'sı mevcut olmasa bile entegrasyon çalışmaya devam eder. Bu parametreyi ayarlamak için
Kimlik bilgilerinin altında, Adapty'den Singular'a gönderebileceğiniz üç grup etkinlik bulunmaktadır. Adapty'nin sunduğu etkinliklerin tam listesini [buradan](events) inceleyebilirsiniz.
Adapty'nin sunduğu varsayılan etkinlik adlarını kullanmanızı öneririz. Ancak etkinlik adlarını ihtiyaçlarınıza göre değiştirebilirsiniz.
Adapty, abonelik etkinliklerini sunucudan sunucuya entegrasyon kullanarak Singular'a gönderir; böylece tüm abonelik etkinliklerini Singular kontrol panelinde görüntüleyebilir ve bunları edinim kampanyalarınızla ilişkilendirebilirsiniz.
:::warning
Entegrasyonlar yapılandırılmadan önce oluşturulan profiller, etkinliklerini Singular'a iletemiyor.
:::
### Uygulamanızı Singular'a bağlama \{#connect-your-app-to-singular\}
Adapty ile Singular arasındaki entegrasyon sunucudan sunucuyadır. Bu nedenle uygulamanıza herhangi bir ek kod eklemeniz gerekmez.
## Etkinlik yapısı \{#event-structure\}
Adapty, etkinlikleri Singular'a sorgu parametreleri kullanarak GET isteğiyle gönderir. Her etkinlik şu şekilde yapılandırılmıştır:
```json
{
"n": "subscription_renewed",
"a": "singular_sdk_key_123",
"p": "iOS",
"i": "com.example.app",
"ip": "192.168.100.1",
"idfa": "00000000-0000-0000-0000-000000000000",
"idfv": "00000000-0000-0000-0000-000000000000",
"ve": "17.0.1",
"att_authorization_status": 3,
"custom_user_id": "user_12345",
"utime": 1709294400,
"amt": 9.99,
"cur": "USD",
"purchase_product_id": "yearly.premium.6999",
"purchase_transaction_id": "GPA.3383...",
"e": "{\"is_revenue_event\":true,\"amt\":9.99,\"cur\":\"USD\",\"purchase_product_id\":\"yearly.premium.6999\",\"purchase_transaction_id\":\"GPA.3383...\"}"
}
```
Parametreler:
| Parametre | Tür | Açıklama |
|:---------------------------|:--------|:---------------------------------------------------------------|
| `n` | String | Etkinlik adı (Adapty etkinliğinden eşlenir). |
| `a` | String | Singular SDK Key'iniz. |
| `p` | String | Platform ("iOS" veya "Android"). |
| `i` | String | Mağaza Uygulama Kimliği (Bundle ID). |
| `ip` | String | Kullanıcının IP adresi. |
| `idfa` | String | **Yalnızca iOS**. Reklamverenler için Kimlik (büyük harf). |
| `idfv` | String | **Yalnızca iOS**. Satıcılar için Kimlik (büyük harf). |
| `aifa` | String | **Yalnızca Android**. Google Reklam Kimliği (küçük harf). |
| `andi` | String | **Yalnızca Android**. Android Kimliği (küçük harf). |
| `asid` | String | **Yalnızca Android**. Uygulama Set Kimliği (küçük harf). |
| `ve` | String | İşletim sistemi sürümü. |
| `att_authorization_status` | Integer | **Yalnızca iOS**. ATT durumu (örn. yetkili için `3`). |
| `custom_user_id` | String | Kullanıcının Müşteri Kullanıcı Kimliği. |
| `utime` | Long | Etkinliğin saniye cinsinden UNIX zaman damgası. |
| `amt` | Float | Gelir tutarı. |
| `cur` | String | Para birimi kodu (örn. "USD"). |
| `purchase_product_id` | String | Mağazadaki Ürün Kimliği. |
| `purchase_transaction_id` | String | Orijinal işlem kimliği. |
| `e` | String | Etkinlik ayrıntılarını içeren JSON dizesi (aşağıya bakın). |
`e` parametresi (özel etkinlik verisi), şunları içeren JSON kodlu bir dizedir:
| Parametre | Tür | Açıklama |
|:--------------------------|:--------|:--------------------------------------------|
| `is_revenue_event` | Boolean | Etkinlik gelir içeriyorsa `true`. |
| `amt` | Float | Gelir tutarı. |
| `cur` | String | Para birimi kodu. |
| `purchase_product_id` | String | Mağazadaki Ürün Kimliği. |
| `purchase_transaction_id` | String | Orijinal işlem kimliği. |
---
# File: tenjin
---
---
title: "Tenjin entegrasyonu"
description: ""
---
Tenjin, uygulama geliştiricileri ve pazarlamacılar için bir mobil attribution ve analitik platformudur. Uygulama performansı ve kullanıcı davranışına ilişkin ayrıntılı bilgiler sunarak kullanıcı edinme kampanyalarını ölçmenizi ve optimize etmenizi sağlayan araçlar içerir. Şeffaf ve esnek yapısıyla Tenjin, reklam ağlarından ve uygulama mağazalarından gelen verileri bir araya getirerek ekiplerin ROI analizini yapmasına, dönüşümleri takip etmesine ve temel performans metriklerini izlemesine olanak tanır.
[Abonelik etkinliklerini](events) Tenjin'e ileterek dönüşümlerin tam olarak nereden geldiğini ve hangi kampanyaların tüm kanallar, platformlar ve cihazlar genelinde en fazla değer getirdiğini görebilirsiniz. Temelde Tenjin kontrol panelleri, pazarlama kampanyaları için gelişmiş analitik sunar.
Tenjin'in attribution verilerini Adapty'ye ileterek, kohort ve dönüşüm analizlerinde kullanabileceğiniz ek filtreleme kriterleriyle Adapty analitiğini zenginleştirirsiniz.
Bu entegrasyon iki temel şekilde çalışır:
1. **Tenjin'den attribution verisi alma**
Entegrasyon tamamlandıktan sonra Adapty, Tenjin'den attribution verisi toplar. Bu bilgilere Adapty Kontrol Paneli'ndeki kullanıcı profil sayfasından erişebilirsiniz.
2. **Tenjin'e abonelik etkinlikleri gönderme**
Adapty, satın alma etkinliklerini gerçek zamanlı olarak Tenjin'e gönderir. Bu etkinlikler, reklam kampanyalarınızın etkinliğini doğrudan Tenjin'in kontrol panelinde değerlendirmenize yardımcı olur.
| Entegrasyon özelliği | Açıklama |
| -------------------------- | ------------------------------------------------------------ |
| Zamanlama | Gerçek zamanlı |
| Veri yönü | İki yönlü iletim:
3. [Tenjin Dashboard](https://tenjin.com/)'a giriş yapın.
4. Gezinme menüsünde **Configuration** -> **Apps** bölümüne gidin.
5. Platformunuza (iOS veya Android) ait uygulamayı seçin ve **App and SDK** sekmesine gidin.
6. **App and SDK** sekmesinde, **SDK Key** sütunundaki **Copy** butonuna tıklayın. Henüz bir SDK anahtarınız yoksa **Generate SDK Key** butonuna tıklayarak bir tane oluşturun.
7. Adapty Kontrol Paneli'ne dönün ve kopyaladığınız SDK Anahtarını ilgili platform alanına yapıştırın:
- iOS uygulamaları için: **iOS SDK Key** veya **iOS Sandbox SDK Key** alanına yapıştırın
- Android uygulamaları için: **Android SDK Key** veya **Android Sandbox SDK Key** alanına yapıştırın
:::info
Tenjin'in sunucudan sunucuya entegrasyon için özel bir Sandbox modu yoktur. Hem production hem de sandbox olayları için ayrı bir Tenjin uygulaması veya aynı anahtarı kullanabilirsiniz.
:::
8. Her iki platformda da uygulamanız varsa 5-7. adımları diğer platform için tekrarlayın.
9. (isteğe bağlı) Gerekirse **How the revenue data should be sent** bölümünü düzenleyin. Ayarların ayrıntılı açıklaması için [Integration settings](configuration#integration-settings) sayfasına bakın.
10. Kurulumu tamamlamak için **Save** butonuna tıklayın.
Adapty artık satın alma olaylarını Tenjin'e gönderecek ve attribution verilerini alacaktır. **Events names** bölümünden olay paylaşımını ayarlayabilirsiniz.
### Olayları ve etiketleri yapılandırma \{#configure-events-and-tags\}
Tenjin yalnızca satın alma ve **Trial started** olaylarını kabul eder. **Events names** bölümünde, takip hedeflerinize uygun olarak Tenjin ile hangi olayları paylaşacağınızı seçin.
### Uygulamanızı Tenjin'e bağlama \{#connect-your-app-to-tenjin\}
Tenjin'den attribution verilerini almak ve Adapty'ye iletmek için `Adapty.updateAttribution()` SDK metodunu kullanın.
2. **Amplitude integration** seçeneğini açık konuma getirerek entegrasyonu etkinleştirin.
3. Entegrasyon alanlarını doldurun:
| Alan | Açıklama |
| ------------------------------------------ | ------------------------------------------------------------ |
| **Amplitude iOS/ Android/ Stripe API key** | iOS/ Android/ Stripe için Amplitude **API Key**'ini Adapty'ye girin. Amplitude'de **Project settings** altında bulabilirsiniz. Yardım için [Amplitude dokümanlarına](https://amplitude.com/docs/apis/authentication) bakın. Teste başlamak için **Sandbox** anahtarlarını kullanın, testler başarılı olduktan sonra **Production** anahtarlarına geçin. |
4. Daha fazla özelleştirme için isteğe bağlı ayarlar:
| Parametre | Açıklama |
| --------------------------------------- | ------------------------------------------------------------ |
| **How the revenue data should be sent** | Gelir verilerini brüt olarak mı yoksa vergi ve komisyonlar düşüldükten sonra mı göndereceğinizi seçin. Ayrıntılar için [Mağaza komisyonu ve vergiler](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue) bölümüne bakın. |
| **Exclude historical events** | Adapty SDK kurulumundan önceki olayları dışlamak için bu seçeneği etkinleştirin; böylece veri tekrarını önlemiş olursunuz. Örneğin, kullanıcı 10 Ocak'ta abone olmuş ancak Adapty SDK'yı 6 Mart'ta kurmuşsa, Adapty yalnızca 6 Mart'tan itibaren olan olayları gönderir. |
| **Send User Attributes** | Dil tercihleri gibi kullanıcıya özgü nitelikleri göndermek için bu seçeneği işaretleyin. |
| **Always populate user_id** | Adapty, `device_id`'yi otomatik olarak `amplitudeDeviceId` olarak gönderir. `user_id` için bu ayar şu şekilde çalışır:
Adapty'nin sağladığı varsayılan olay adlarını kullanmanızı öneririz. Ancak olay adlarını ihtiyaçlarınıza göre değiştirebilirsiniz. Adapty, abonelik olaylarını sunucudan sunucuya entegrasyon aracılığıyla Amplitude'e gönderir; böylece tüm abonelik olaylarını Amplitude kontrol panelinde görüntüleyebilirsiniz.
### SDK yapılandırması \{#sdk-configuration\}
`amplitude_device_id` parametresini ayarlamak için `setIntegrationIdentifier()` metodunu kullanın. Bu, entegrasyonun çalışması için zorunludur.
Kullanıcı kaydınız varsa `amplitude_user_id`'yi de aktarabilirsiniz.
:::note
Üçüncü taraf SDK'lar kullanıcı kimliklerini asenkron olarak oluşturur. `Adapty.activate()` çalıştığında bu kimlik henüz hazır olmayabilir. **Customer User ID**'niz bu SDK'lardan birinden geliyorsa, `Adapty.activate()` fonksiyonunu kimlik olmadan çağırın. Kimlik hazır olduğunda önce `setIntegrationIdentifier()`, ardından CUID ile birlikte `identify()` fonksiyonunu çağırın.
:::
4. Adapty Kontrol Paneli'nde [Integrations > AppMetrica](https://app.adapty.io/integrations/appmetrica) sayfasına gidin
5. AppMetrica kimlik bilgilerinizi yapıştırın.
### Etkinlikler ve etiketler \{#events-and-tags\}
Adapty, AppMetrica'ya üç grup etkinlik göndermenize olanak tanır. Uygulamanızın performansını izlemek için ihtiyaç duyduğunuz etkinlikleri etkinleştirebilirsiniz. Mevcut etkinliklerin tam listesi için [etkinlikler belgelerimize](events) bakın.
:::note
AppMetrica etkinlikleri her 4 saatte bir senkronize ettiğinden, etkinliklerin kontrol panelinizde görünmesi bir süre alabilir.
:::
:::tip
Tutarlılık açısından Adapty'nin varsayılan etkinlik adlarını kullanmanızı öneririz; ancak bunları mevcut analitik kurulumunuzla eşleşecek şekilde özelleştirebilirsiniz.
:::
### Gelir ayarları \{#revenue-settings\}
Adapty varsayılan olarak gelir verilerini etkinliklerdeki özellikler olarak gönderir; bu veriler AppMetrica'nın Etkinlikler raporunda görünür. Bu gelir verilerinin nasıl hesaplanıp görüntüleneceğini yapılandırabilirsiniz:
- **Gelir hesaplama**: Finansal raporlama ihtiyaçlarınıza uygun gelir değerlerinin nasıl hesaplanacağını seçin:
- **Brüt gelir**: Herhangi bir kesinti yapılmadan önceki toplam geliri gösterir; müşterilerin ödediği tam tutarı izlemek için kullanışlıdır
- **Mağaza komisyonu sonrası gelir**: App Store/Play Store ücretleri düşüldükten sonraki geliri gösterir; gerçek kazançlarınızı izlemenize yardımcı olur
- **Mağaza komisyonu ve vergiler sonrası gelir**: Hem mağaza ücretleri hem de geçerli vergiler düşüldükten sonraki net geliri gösterir; kazançlarınızın en doğru görünümünü sunar
- **Kullanıcının para birimini raporla**: Etkinleştirildiğinde, satışlar kullanıcının yerel para biriminde raporlanır; bu da bölgeye göre geliri analiz etmeyi kolaylaştırır. Devre dışı bırakıldığında, farklı pazarlarda tutarlı raporlama için tüm satışlar USD'ye dönüştürülür.
- **Gelir etkinliklerini gönder**: Bu seçeneği etkinleştirerek gelir verilerinin yalnızca Etkinlikler raporunda değil, aynı zamanda AppMetrica'nın [Uygulama içi ve reklam geliri](https://appmetrica.yandex.com/docs/en/mobile-reports/revenue-report) raporunda da görünmesini sağlayabilirsiniz. Başka bir yerden de gelir göndermediğinizden emin olun; aksi takdirde veri tekrarına yol açabilir.
- **Geçmiş etkinlikleri hariç tut**: Etkinleştirildiğinde, Adapty kullanıcının uygulamayı Adapty SDK ile yüklemesinden önce gerçekleşen etkinlikleri göndermez. Adapty'yi entegre etmeden önce zaten analitiğe etkinlik gönderiyorsanız bu, veri tekrarını önlemeye yardımcı olur.
### SDK yapılandırması \{#sdk-configuration\}
Uygulamanızda AppMetrica entegrasyonunu etkinleştirmek için iki tanımlayıcı ayarlamanız gerekir:
1. `appmetrica_device_id`: Temel entegrasyon için zorunludur
2. `appmetrica_profile_id`: İsteğe bağlıdır, ancak uygulamanızda kullanıcı kaydı varsa önerilir
Bu değerleri ayarlamak için `setIntegrationIdentifier()` metodunu kullanın. Her platform için nasıl uygulayacağınız aşağıda açıklanmıştır:
:::note
Üçüncü taraf SDK'lar kullanıcı kimliklerini asenkron olarak oluşturur. `Adapty.activate()` çalıştığında bu kimlik henüz hazır olmayabilir. **Customer User ID**'niz bu SDK'lardan birinden geliyorsa, `Adapty.activate()` fonksiyonunu kimlik olmadan çağırın. Kimlik hazır olduğunda önce `setIntegrationIdentifier()`, ardından CUID ile birlikte `identify()` fonksiyonunu çağırın.
:::
### Mixpanel Token'ınızı bulma \{#finding-your-mixpanel-token\}
**Mixpanel Token**'ınızı almak için:
1. [Mixpanel Dashboard](https://mixpanel.com/settings/project/)'unuza giriş yapın.
2. **Settings** bölümünü açın ve **Organization Settings** seçeneğini tıklayın.
3. Sol kenar çubuğundan **Projects** bölümüne gidin ve projenizi seçin.
## Entegrasyon nasıl çalışır \{#how-the-integration-works\}
Adapty, kullanıcı kimliği ve gelir gibi ilgili olay özelliklerini otomatik olarak [Mixpanel'e özgü özelliklere](https://docs.mixpanel.com/docs/data-structure/user-profiles) eşler. Bu sayede abonelikle ilgili olaylar doğru bir şekilde takip edilir ve raporlanır.
Bunun yanı sıra Adapty, kullanıcı başına gelir verilerini biriktirir ve `subscription state` ile `subscription product ID` dahil olmak üzere [Kullanıcı Profil Özelliklerini](https://docs.mixpanel.com/docs/data-structure/user-profiles) günceller. Bir olay alındığında Mixpanel, ilgili alanları gerçek zamanlı olarak günceller.
## Olaylar ve etiketler \{#events-and-tags\}
Kimlik bilgilerinin altında, Adapty'den Mixpanel'e gönderebileceğiniz üç grup olay bulunur. İhtiyacınız olanları açmanız yeterli. Adapty'nin sunduğu olayların tam listesine [buradan](events) ulaşabilirsiniz.
Adapty'nin sağladığı varsayılan olay adlarını kullanmanızı öneririz. Ancak ihtiyacınıza göre olay adlarını değiştirebilirsiniz.
## SDK yapılandırması \{#sdk-configuration\}
`mixpanelUserId` ayarlamak için `.setIntegrationIdentifier()` metodunu kullanın. Bu değer ayarlanmazsa Adapty, kullanıcı kimliğinizi (`customerUserId`) ya da bu değer null ise Adapty ID'sini kullanır. Uygulamanızdan Mixpanel'e veri göndermek için kullandığınız kullanıcı kimliğinin Adapty'e gönderdiğinizle aynı olduğundan emin olun.
:::note
Üçüncü taraf SDK'lar kullanıcı kimliklerini asenkron olarak oluşturur. `Adapty.activate()` çalıştığında bu kimlik henüz hazır olmayabilir. **Customer User ID**'niz bu SDK'lardan birinden geliyorsa, `Adapty.activate()` fonksiyonunu kimlik olmadan çağırın. Kimlik hazır olduğunda önce `setIntegrationIdentifier()`, ardından CUID ile birlikte `identify()` fonksiyonunu çağırın.
:::
2. [PostHog Kontrol Paneli](https://posthog.com/)'ne giriş yapın.
3. **Settings -> Project** bölümüne gidin.
4. **Project** penceresinde **Project ID** bölümüne kadar aşağı kaydırın ve **Project API key** değerini kopyalayın.
5. API anahtarını Adapty Kontrol Paneli'ndeki **Project API key** alanına yapıştırın. PostHog, sunucudan sunucuya entegrasyon için özel bir Sandbox modu sunmaz.
6. **PostHog Deployment** seçeneğinizi belirleyin:
| Seçenek | Açıklama |
| ------ | ------------------------------------------------------------ |
| us/eu | Varsayılan PostHog barındırmalı dağıtımlar. |
| Custom | Kendi barındırdığınız örnekler için. Örnek URL'nizi **PostHog Instance URL** alanına girin. |
7. (isteğe bağlı) Kendi barındırdığınız bir PostHog dağıtımı kullanıyorsanız, dağıtımınızın adresini **PostHog Instance URL** alanına girin.
8. (isteğe bağlı) **Reporting Proceeds**, **Exclude Historical Events**, **Report User's Currency** ve **Send Trial Price** gibi ayarları düzenleyin. Bu seçenekler hakkında ayrıntılı bilgi için [Integration settings](configuration#integration-settings) bölümüne bakın.
9. (isteğe bağlı) **Events names** bölümünde PostHog'a hangi etkinliklerin gönderileceğini özelleştirebilirsiniz. İstemediğiniz etkinlikleri devre dışı bırakın veya gerektiğinde yeniden adlandırın.
10. Kurulumu tamamlamak için **Save**'e tıklayın.
## SDK yapılandırması \{#sdk-configuration\}
PostHog'dan attribution verisi alabilmek için `distinctId` değerini aşağıda gösterildiği gibi Adapty'e iletin:
:::note
Üçüncü taraf SDK'lar kullanıcı kimliklerini asenkron olarak oluşturur. `Adapty.activate()` çalıştığında bu kimlik henüz hazır olmayabilir. **Customer User ID**'niz bu SDK'lardan birinden geliyorsa, `Adapty.activate()` fonksiyonunu kimlik olmadan çağırın. Kimlik hazır olduğunda önce `setIntegrationIdentifier()`, ardından CUID ile birlikte `identify()` fonksiyonunu çağırın.
:::
SplitMetrics Acquire hesabınızı açın, MMP logolarından birinin üzerine gelin ve **Settings** düğmesine tıklayın. İletişim kutusundaki **5.** madde altında Client ID'nizi bulun, kopyalayın ve Adapty'ye **Client ID** olarak yapıştırın.
Entegrasyonu kullanmak için Apple App ID'nizi de girmeniz gerekecek. App ID'nizi bulmak için App Store Connect'te uygulama sayfanızı açın, **General** bölümündeki **App Information** sayfasına gidin ve ekranın sol alt kısmındaki **Apple ID**'yi bulun.
## Etkinlikler ve etiketler \{#events-and-tags\}
Kimlik bilgilerinin altında, Adapty'den SplitMetrics Acquire'a gönderebileceğiniz üç grup etkinlik yer alır. İhtiyacınız olanları açmanız yeterli. Adapty'nin sunduğu etkinliklerin tam listesini [buradan](events) inceleyebilirsiniz.
Adapty'nin sağladığı varsayılan etkinlik adlarını kullanmanızı öneririz. Ancak etkinlik adlarını ihtiyaçlarınıza göre değiştirebilirsiniz. Adapty, sunucudan sunucuya entegrasyon aracılığıyla SplitMetrics Acquire'a abonelik etkinlikleri gönderir; böylece tüm abonelik etkinliklerini SplitMetrics kontrol panelinizde görüntüleyebilirsiniz.
## SDK yapılandırması \{#sdk-configuration\}
SDK tarafında herhangi bir şey yapılandırmanıza gerek yok; ancak daha iyi doğruluk için Adapty'ye `customerUserId` göndermenizi öneririz.
:::warning
[Apple Search Ads](apple-search-ads)'i Adapty'de yapılandırdığınızdan ve [kimlik bilgilerini yüklediğinizden](https://app.adapty.io/settings/apple-search-ads) emin olun; bunlar olmadan SplitMetrics Acquire çalışmaz.
:::
## Sorun giderme \{#troubleshooting\}
Doğru kuruluma rağmen SplitMetrics Acquire entegrasyonu çalışmıyorsa:
- [App Settings -> Apple Search Ads sekmesinde](https://app.adapty.io/settings/apple-search-ads) **Receive Apple Search Ads attribution in Adapty** geçişinin etkin olduğundan, Adapty'de [Apple Search Ads](apple-search-ads)'in yapılandırıldığından ve [kimlik bilgilerinin yüklendiğinden](https://app.adapty.io/settings/apple-search-ads) emin olun; bunlar olmadan SplitMetrics çalışmaz.
- Profillerin organik olmayan ASA attribution'ına sahip olduğundan emin olun. Yalnızca ayrıntılı, organik olmayan ASA attribution'ına sahip profiller etkinliklerini Adapty'ye iletir.
## SplitMetrics Acquire etkinlik yapısı \{#splitmetrics-acquire-event-structure\}
Adapty, etkinlikleri sorgu parametreleri kullanarak GET isteğiyle SplitMetrics Acquire'a gönderir. Her etkinlik şu şekilde yapılandırılmıştır:
```json
{
"source": "Apple Search Ads",
"app_id": "123456789",
"name": "subscription_renewed",
"type": "subscription_renewed",
"revenue": 9.99,
"currency": "USD",
"tap_time": "2024-03-01 12:00:00",
"open_time": "2024-03-01 12:05:00",
"event_time": "2024-03-02 12:00:00",
"adaccount_id": "123456",
"campaign_id": "123456789",
"adgroup_id": "123456789",
"keyword_id": "123456789",
"creative_set_id": "123456789",
"Ad_id": "123456789",
"country_or_region": "US",
"conversion_type": "Download",
"user_id": "user_12345",
"att_status": "3",
"device_type": "iphone",
"app_version": "1.2.3",
"sdk_version": "2.10.0",
"ios_version": "17.2",
"event_value": "{\"vendor_product_id\":\"yearly.premium.6999\",\"original_transaction_id\":\"GPA.3383...\"}",
"event_id": "123e4567-e89b-12d3-a456-426614174000"
}
```
Parametreler:
| Parametre | Tür | Açıklama |
|:--------------------|:-------|:----------------------------------------------------------------------------------------------------------------------|
| `source` | String | Her zaman "Apple Search Ads". |
| `app_id` | String | Apple App ID. |
| `name` | String | Etkinlik adı (Adapty etkinliğinden eşlenir). |
| `type` | String | Etkinlik türü (`name` ile aynı). |
| `revenue` | Float | Gelir miktarı. |
| `currency` | String | Para birimi kodu. |
| `tap_time` | String | Reklama tıklanma tarihi ve saati. |
| `open_time` | String | Uygulamanın açıldığı (kurulduğu) tarih ve saat. |
| `event_time` | String | Etkinliğin gerçekleştiği tarih ve saat. |
| `adaccount_id` | String | ASA Organizasyon ID'si. |
| `campaign_id` | String | ASA Kampanya ID'si. |
| `adgroup_id` | String | ASA Reklam Grubu ID'si. |
| `keyword_id` | String | ASA Anahtar Kelime ID'si. |
| `creative_set_id` | String | ASA Kreatif Set ID'si. |
| `Ad_id` | String | ASA Reklam ID'si. |
| `country_or_region` | String | Mağaza ülkesi veya bölgesi. |
| `conversion_type` | String | Dönüşüm türü (örn. "Download"). |
| `user_id` | String | Müşteri Kullanıcı ID'si veya Adapty Profil ID'si. |
| `att_status` | String | İzleme kullanım durumu (0-3). |
| `device_type` | String | Cihaz türü (örn. "iphone", "ipad"). |
| `app_version` | String | Uygulama sürümü. |
| `sdk_version` | String | Adapty SDK sürümü. |
| `ios_version` | String | iOS sürümü. |
| `event_value` | String | Mevcut tüm [etkinlik ayrıntılarını](webhook-event-types-and-fields#for-most-event-types) içeren JSON dizesi. |
| `event_id` | String | Benzersiz etkinlik ID'si (UUID). |
---
# File: braze
---
---
title: "Braze"
description: "Adapty ile Braze'i entegre ederek müşteri etkileşimini ve push bildirimlerini kolaylaştırın."
---
En iyi müşteri etkileşim çözümlerinden biri olan [Braze](https://www.braze.com/), push bildirimleri, e-posta, SMS ve uygulama içi mesajlaşma için geniş bir araç yelpazesi sunar. Adapty'yi Braze ile entegre ederek tüm abonelik etkinliklerinize tek bir yerden erişebilir ve bu etkinliklere dayalı otomatik iletişim tetikleyebilirsiniz.
Adapty, tüm mağazalardan [abonelik etkinliklerini](events) tek bir yerde takip etmenizi sağlayan eksiksiz bir veri seti sunar ve bu veriyi Braze'deki kullanıcı profillerinizi güncellemek için kullanabilirsiniz. Adapty ile abonelerinizin davranışlarını kolayca izleyebilir, tercihlerini öğrenebilir ve bu bilgileri hedefli ve etkili bir iletişim kurmak için kullanabilirsiniz. Bu entegrasyon sayesinde abonelik etkinliklerini Braze kontrol panelinizde takip edebilir ve bunları [edinim kampanyalarınızla](https://www.braze.com/product/journey-orchestration) ilişkilendirebilirsiniz.
Adapty, abonelik etkinliklerini, kullanıcı özelliklerini ve satın alımları Braze'e aktarır; böylece aşağıda açıklanan kısa ve kolay entegrasyonun ardından Braze push bildirimleriyle müşterilerinizle hedefli iletişim kurabilirsiniz.
## Braze entegrasyonu nasıl kurulur \{#how-to-set-up-braze-integration\}
Braze'i entegre etmek için [Integrations -> Braze](https://app.adapty.io/integrations/braze) sayfasına gidin, geçişi açın ve alanları doldurun.
Entegrasyon sürecinin ilk adımı, Braze ile Adapty profilleriniz arasında bağlantı kurabilmek için gerekli kimlik bilgilerini sağlamaktır. Entegrasyonun düzgün çalışması için **REST API Key**, **Braze Instance ID** ve iOS ile Android için **App ID**'lere ihtiyacınız olacak:
1. **REST API Key**, **Braze Dashboard** → **Settings** → **API Keys** bölümünden oluşturulabilir. Anahtarı oluştururken `users.track` iznine sahip olduğundan emin olun:
2. **Braze Instance ID**'yi öğrenmek için Braze Dashboard URL'nize bakın ve instance ID'nin belirtildiği [Braze Docs](https://www.braze.com/docs/api/basics/#endpoints) bölümüne gidin. US-03, EU-01 gibi bölgesel bir biçimde olmalıdır.
3. iOS ve Android App ID'leri de Braze Dashboard → **Settings** → **API Keys** bölümünden bulunabilir. Buradan kopyalayın:
## Etkinlikler, kullanıcı özellikleri ve satın alımlar \{#events-user-attributes-and-purchases\}
Kimlik bilgilerinin altında, Adapty'den Braze'e gönderebileceğiniz üç grup etkinlik bulunur. İhtiyacınız olanları açmanız yeterli. Braze'e gönderilecek etkinliklerin adlarını da değiştirebilirsiniz. Adapty'nin sunduğu etkinliklerin tam listesine [buradan](events) ulaşabilirsiniz:
Adapty, abonelik etkinliklerini ve kullanıcı özelliklerini sunucudan sunucuya entegrasyon aracılığıyla Braze'e gönderir; böylece bunları Braze kontrol panelinizde görüntüleyebilir ve kampanyalarınızı buna göre yapılandırabilirsiniz.
Deneme dönüşümleri ve yenilemeler gibi gelir içeren etkinlikler için Adapty bu bilgiyi Braze'e satın alım olarak gönderir.
Braze'e gönderilen etkinlik özelliklerinin tam spesifikasyonlarına [buradan](messaging#event-properties) ulaşabilirsiniz.
:::note
Kullanışlı kullanıcı özellikleri
Adapty, Braze entegrasyonu için varsayılan olarak bazı kullanıcı özelliklerini gönderir. İhtiyacınıza en uygun olanı belirlemek için aşağıdaki listeye başvurabilirsiniz.
:::
| Kullanıcı özelliği | Tür | Değer |
|--------------|----|-----|
| `adapty_customer_user_id` | String | Müşteri tarafından tanımlanan kullanıcının benzersiz tanımlayıcısının değerini içerir. Hem Adapty [Kontrol Paneli'nde](profiles-crm) hem de Braze'de bulunabilir. |
| `adapty_profile_id` | String | Adapty [Kontrol Paneli'nde](profiles-crm) bulunabilen Adapty Kullanıcı Profili ID'sinin benzersiz tanımlayıcısının değerini içerir. |
| `environment` | String | Kullanıcının sandbox mı yoksa production ortamında mı işlem yaptığını gösterir.
Değerler `Sandbox` veya `Production` şeklindedir.
| | `store` | String |Satın alma için kullanılan mağazanın adını içerir.
Olası değerler:
`app_store` veya `play_store`.
| | `vendor_product_id` | String |Apple/Google mağazasındaki Ürün ID'sinin değerini içerir.
Örn. org.locals.12345
| | `subscription_expires_at` | String |En son aboneliğin bitiş tarihini içerir.
Değer biçimi:
YYYY-MM-DDTHH:mm:ss.SSS+TZ
Örn. 2023-02-15T17:22:03.000+0000
| | `active_subscription` | String | Herhangi bir satın alma/yenileme etkinliğinde `true`, abonelik sona erdiyse `false` olarak ayarlanır. | | `period_type` | String |Satın alma veya yenileme için en son dönem türünü gösterir.
Olası değerler:
Deneme dönemi için `trial`, diğerleri için `normal`.
| Tüm ondalıklı değerler tam sayıya yuvarlanır. String değerler değişmeden kalır. Önceden tanımlanmış etiket listesine ek olarak, etiketleri kullanarak [özel özellikler](segments#custom-attributes) göndermek de mümkündür. Bu, etiketle birlikte gönderilebilecek veri türünde daha fazla esneklik sağlar ve bir ürün veya hizmete ilişkin belirli bilgilerin takibinde kullanışlıdır. Kullanıcı [entegrasyon sayfasından](https://app.adapty.io/integrations/braze) **Send user attributes** onay kutusunu işaretlerse tüm özel kullanıcı özellikleri otomatik olarak Braze'e gönderilir. ## SDK Yapılandırması \{#sdk-configuration\} Adapty ve Braze'deki kullanıcı profillerini bağlamak için Braze SDK'yı Adapty ile aynı müşteri kullanıcı ID'siyle yapılandırmanız ya da `.changeUser()` metodunu kullanmanız gerekir:
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.
2. **OneSignal App ID**'nizi kopyalayın ve Adapty Kontrol Paneli'ndeki **App ID** alanına yapıştırın.
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.
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ü.
1. **App ID**, Pushwoosh kontrol panelinizde bulunabilir.
2. **Auth token**, Pushwoosh Ayarları'ndaki API Access bölümünde bulunabilir.
## Olaylar ve etiketler \{#events-and-tags\}
Kimlik bilgilerinin altında, Adapty'den Pushwoosh'a gönderebileceğiniz üç grup olay yer almaktadır. İhtiyacınız olanları açmanız yeterli. Pushwoosh'a gönderim için olay adlarını da değiştirebilirsiniz. Adapty'nin sunduğu olayların tam listesine [buradan](events) ulaşabilirsiniz.
Adapty, sunucudan sunucuya entegrasyon aracılığıyla abonelik olaylarını Pushwoosh'a gönderir ve tüm abonelik olaylarını Pushwoosh Kontrol Panelinizde görüntülemenizi sağlar.
:::note
Özel etiketler
Adapty ile Pushwoosh entegrasyonunda kendi özel etiketlerinizi de kullanabilirsiniz. Hangi etiketin ihtiyacınıza en uygun olduğunu belirlemek için aşağıdaki etiket listesine başvurabilirsiniz.
:::
| Etiket | Tür | Değer |
|---|----|-----|
| `adapty_customer_user_id` | String | Pushwoosh tarafında bulunan kullanıcının benzersiz tanımlayıcısının değerini içerir. |
| `adapty_profile_id` | String | Adapty [kontrol panelinde](profiles-crm) bulunabilen kullanıcının Adapty Kullanıcı Profili kimliğinin benzersiz tanımlayıcı değerini içerir. |
| `environment` | String | Kullanıcının sandbox mı yoksa production ortamında mı çalıştığını belirtir.
Değerler `Sandbox` veya `Production` şeklindedir.
| | `store` | String |Satın alma işleminde kullanılan Store adını içerir.
Olası değerler:
`app_store` veya `play_store`.
| | `vendor_product_id` | String |Apple/Google mağazasındaki Ürün Kimliğinin değerini içerir.
Örn. org.locals.12345
| | `subscription_expires_at` | String |En son aboneliğin sona erme tarihini içerir.
Değer formatı:
yıl-ay günTsaat:dakika:saniye
Örn. 2023-02-10T17:22:03.000000+0000
| | `last_event_type` | String | Entegrasyon için etkinleştirdiğiniz standart [Adapty olayları](events) listesinden alınan son olayın türünü belirtir. | | `purchase_date` | String |Son işlemin (orijinal satın alma veya yenileme) tarihini içerir.
Değer formatı:
yıl-ay günTsaat:dakika:saniye
Örn. 2023-02-10T17:22:03.000000+0000
| | `original_purchase_date` | String |İşleme göre ilk satın alma tarihini içerir.
Değer formatı:
yıl-ay günTsaat:dakika:saniye
Örn. 2023-02-10T17:22:03.000000+0000
| | `active_subscription` | String | Herhangi bir satın alma/yenileme olayında `true`, abonelik sona erdiğinde `false` olarak ayarlanır. | | `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`, geri kalanı için `normal`.
| Tüm float değerler int'e yuvarlanır. String değerler aynı kalır. Önceden tanımlanmış etiket listesine ek olarak, [özel nitelikler](segments#custom-attributes) etiketler aracılığıyla da gönderilebilir. Bu, etikete eklenebilecek veri türünde daha fazla esneklik sağlar ve bir ürün veya hizmete ilişkin belirli bilgilerin takibi için faydalı olabilir. Tüm özel kullanıcı nitelikleri, kullanıcı [entegrasyon sayfasındaki](https://app.adapty.io/integrations/pushwoosh) **Send user custom attributes** onay kutusunu işaretlerse otomatik olarak Pushwoosh'a gönderilir. ## SDK yapılandırması \{#sdk-configuration\} Adapty'yi Pushwoosh ile ilişkilendirmek için `HWID` değerini bize göndermeniz gerekir:
2. Uygulamaya istediğiniz bir ad verin (örneğin `Adapty`) ve çalışma alanınıza ekleyin:
### 2\. Gönderi iznini verin ve uygulamanız için token alın \{#2-give-permission-to-post-and-get-a-token-for-your-app\}
Slack'teki uygulamanızın sayfasına yönlendirileceksiniz.
1. Aşağı kaydırın ve **Permissions**'a tıklayın:
2. Yönlendirmeden sonra **Scopes** bölümüne gidin ve **Add an OAuth Scope**'a tıklayın:
3. Kanallarınıza mesaj gönderebilmek ve mesajları özelleştirebilmek için `chat:write`, `chat:write.public` ve `chat:write.customize` izinlerini verin:
4. Sayfanın en üstüne dönün ve **Install to Workspace**'e tıklayın:
5. Açılan ekranda **Allow**'a tıklayın:
Bu adımın ardından aynı sayfaya yönlendirileceksiniz; ancak artık bir OAuth Token (`xoxb-...`) göreceksiniz. Kurulumu tamamlamak için ihtiyaç duyulan tam olarak budur:
### 3\. Adapty'de entegrasyonu yapılandırma \{#3-configure-the-integration-in-adapty\}
1. [**Integrations** → **Slack**](https://app.adapty.io/integrations/slack) sayfasına gidin:
2. Önceki adımdan aldığınız `xoxb-...` token'ını yapıştırın ve uygulamanın hangi kanallara mesaj göndereceğini seçin. Entegrasyonu yalnızca production, yalnızca sandbox ya da her iki ortamdan gelen olayları alacak şekilde ayarlayabilirsiniz. Ayrıca hangi para biriminde gönderi yapılacağını da seçebilirsiniz (orijinal veya USD'ye dönüştürülmüş).
:::note
Adapty'den özel bir kanala mesaj göndermek istiyorsanız, Slack'te oluşturduğunuz `Adapty` uygulamasını o kanala manuel olarak eklemeniz gerekir. Aksi takdirde çalışmayacaktır.
:::
3. Son olarak, **Events** bölümünden hangi olayları almak istediğinizi seçebilirsiniz:
Hepsi bu kadar!
Olaylar belirlediğiniz kanallara gönderilecek. Geçerli olduğunda geliri görebilir ve Adapty'deki müşteri profiline erişebilirsiniz:
---
# File: s3-exports
---
---
title: "Amazon S3"
description: "Gelişmiş analiz ve raporlama için abonelik verilerini S3'e aktarın."
---
Adapty'nin Amazon S3 ile entegrasyonu, etkinlik ve paywall ziyareti verilerini güvenli bir şekilde tek bir merkezi konumda saklamanıza olanak tanır. [Abonelik etkinliklerinizi](events) Amazon S3 bucket'ınıza .csv dosyaları olarak kaydedebilirsiniz.
Bu entegrasyonu kurmak için AWS Console ve Adapty Kontrol Paneli'nde birkaç basit adımı takip etmeniz gerekir.
:::note
Zamanlama
Adapty verilerinizi her **24 saatte bir** 04:00 UTC'de gönderir.
Her dosya, önceki tam takvim günü (UTC) boyunca oluşturulan event verilerini içerecektir. Örneğin, 8 Mart'ta 04:00 UTC'de otomatik olarak dışa aktarılan veriler, 7 Mart'ta 00:00:00 ile 23:59:59 UTC arasında oluşturulan tüm eventleri içerecektir.
:::
## Amazon S3 entegrasyonunu nasıl kurarsınız \{#how-to-set-up-amazon-s3-integration\}
Veri almaya başlamak için aşağıdaki bilgilere ihtiyacınız olacak:
1. Access key ID
2. Secret access key
3. S3 bucket adı
4. S3 bucket içindeki klasör adı
:::note
İç içe dizinler
Amazon S3 bucket adı alanında iç içe dizinler belirtebilirsiniz; örneğin: adapty-events/com.sample-app
:::
Amazon S3 entegrasyonu için [**Integrations** -> **Amazon S3**](https://app.adapty.io/integrations/s3) sayfasına gidin, toggle'ı açık konuma getirin ve alanları doldurun.
Her şeyden önce, Amazon S3 ile Adapty profilleri arasında bağlantı kurmak için kimlik bilgilerini girin.
Adapty Kontrol Paneli'nde bağlantıyı kurmak için aşağıdaki alanlar gereklidir:
| Alan | Açıklama |
| :--------------------------- | :----------------------------------------------------------- |
| **Access Key ID** | AWS hizmetine erişimi doğrulamak için kullanılan benzersiz tanımlayıcı. Bu kimliği indirilen [csv dosyasında](s3-exports#how-to-create-amazon-s3-credentials) bulabilirsiniz. |
| **Secret Access Key** | AWS hizmetine erişimi doğrulamak için Access Key ID ile birlikte kullanılan özel anahtar. Bu anahtarı indirilen [csv dosyasında](s3-exports#how-to-create-amazon-s3-credentials) bulabilirsiniz. |
| **S3 Bucket Name** | AWS bulutundaki belirli bir S3 bucket'ını tanımlayan, küresel olarak benzersiz ad. S3 bucket'ları, kullanıcıların bulutta dosya ve görsel gibi veri nesnelerini depolamasına ve almasına olanak tanıyan basit bir depolama hizmetidir. |
| **Folder Inside the Bucket** | Seçili S3 bucket'ının içinde oluşturmak istediğiniz klasörün adı. S3'ün klasörleri, nesne anahtarı önekleri (yani klasör adları) kullanarak simüle ettiğini unutmayın. |
## Amazon S3 kimlik bilgileri nasıl oluşturulur \{#how-to-create-amazon-s3-credentials\}
Bu kılavuz, AWS Console'da gerekli kimlik bilgilerini oluşturmanıza yardımcı olacaktır.
### 1\. Erişim Politikası Oluşturun \{#create-access-policy\}
Önce AWS Console'unuzdaki [IAM Policy Dashboard](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/policies) sayfasına gidin ve **Create Policy** seçeneğini tıklayın.
**Policy editor** bölümüne aşağıdaki JSON'ı yapıştırın ve `adapty-s3-integration-test` kısmını kendi bucket adınızla değiştirin:
```json showLineNumbers title="Json"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListObjectsInBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
},
{
"Sid": "AllowAllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": [
"arn:aws:s3:::adapty-s3-integration-test/*",
"arn:aws:s3:::adapty-s3-integration-test"
]
},
{
"Sid": "AllowBucketLocation",
"Effect": "Allow",
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
}
]
}
```
Politika yapılandırmasını tamamladıktan sonra etiket eklemeyi seçebilirsiniz (isteğe bağlı) ve ardından son adıma geçmek için **Next** düğmesine tıklayın. Bu adımda politikanıza bir ad verip **Create policy** düğmesine tıklayarak oluşturma işlemini tamamlayın.
### 2\. IAM kullanıcısı oluşturun \{#create-iam-user\}
Adapty'nin ham veri raporlarını bucket'ınıza yükleyebilmesi için, ilgili bucket'a yazma erişimi olan bir kullanıcıya ait Access Key ID ve Secret Access Key bilgilerini sağlamanız gerekir.
Devam etmek için IAM Console'a gidin ve [Users bölümünü](https://console.aws.amazon.com/iamv2/home#/users) seçin. Ardından **Add users** butonuna tıklayın.
Kullanıcıya bir isim verin, **Access key – Programmatic access** seçeneğini seçin ve izinlere geçin.
Bir sonraki adım için **Add user to group** seçeneğini işaretleyin ve ardından **Create group** butonuna tıklayın.
Ardından, Kullanıcı Grubunuza bir ad vermeniz ve daha önce oluşturduğunuz politikayı seçmeniz gerekir. Politikayı seçtikten sonra işlemi tamamlamak için **Create group** düğmesine tıklayın.
Grubu başarıyla oluşturduktan sonra lütfen **seçin** ve bir sonraki adıma geçin.
Bu bölümün son adımı olduğundan, **Create User** düğmesine tıklayarak devam edebilirsiniz.
Son olarak, kimlik bilgilerini **.csv formatında indirebilir** ya da doğrudan kontrol panelinden kopyalayıp yapıştırabilirsiniz.
## Manuel veri dışa aktarımı \{#manual-data-export\}
Amazon S3'e otomatik etkinlik verisi dışa aktarımına ek olarak, Adapty manuel dosya dışa aktarımı özelliği de sunar. Bu özellik sayesinde etkinlik verileri için belirli bir zaman aralığı seçerek bunları S3 bucket'ınıza manuel olarak aktarabilirsiniz. Bu, hangi verileri ne zaman dışa aktaracağınız konusunda size daha fazla kontrol imkânı tanır.
Belirlenen tarih aralığı, A Tarihi 00:00:00 UTC ile B Tarihi 23:59:59 UTC arasında oluşturulan etkinlikleri dışa aktarmak için kullanılır.
## Tablo yapısı \{#table-structure\}
AWS S3 entegrasyonunda Adapty, işlem olayları ve paywall ziyaretlerine ait geçmiş verileri saklamak için bir tablo sunar. Tablo; kullanıcı profili, gelir ve kazançlar ile kaynak mağaza gibi birçok veri noktasını içerir. Temelde bu tablolar, bir uygulamanın belirli bir zaman diliminde oluşturduğu tüm işlemleri kaydeder.
:::warning
Bu yapının zamanla büyüyebileceğini unutmayın — bizim veya birlikte çalıştığımız 3. tarafların yeni veriler eklemesiyle. Bu yapıyı işleyen kodunuzun yeterince sağlam olduğundan ve yapının tamamına değil, belirli alanlara dayandığından emin olun.
:::
İşte event'ler için tablo yapısı:
:::note
Adapty, diğer para birimlerini [currencylayer.com](https://currencylayer.com/) döviz kuru üzerinden USD'ye çevirir (her 8 saatte bir güncellenir). Kur, **işlem anında sabitlenir** — sonraki değişiklikler dönüşüm sonucunu etkilemez.
:::
| Sütun | Açıklama |
|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **profile_id** | Adapty kullanıcı ID'si. |
| **event_type** | Küçük harfli event adı. Event türleri hakkında bilgi almak için [Events](events) bölümüne bakın. |
| **event_datetime** | ISO 8601 tarihi. |
| **transaction_id** | Satın alma veya yenileme gibi bir işlem için benzersiz tanımlayıcı. |
| **original_transaction_id** | Orijinal satın almanın işlem tanımlayıcısı. |
| **subscription_expires_at** | Aboneliğin sona erme tarihi. Genellikle gelecekte bir tarihtir. |
| **environment** | Sandbox veya Production olabilir. |
| **revenue_usd** | USD cinsinden gelir. Boş olabilir. |
| **proceeds_usd** | USD cinsinden net hasılat. Boş olabilir. |
| **net_revenue_usd** | USD cinsinden net gelir (vergiler düşüldükten sonraki kazanç). Boş olabilir. |
| **tax_amount_usd** | USD cinsinden kesilen vergi tutarı. Boş olabilir. |
| **revenue_local** | Yerel para biriminde gelir. Boş olabilir. |
| **proceeds_local** | Yerel para biriminde net hasılat. Boş olabilir. |
| **net_revenue_local** | Yerel para biriminde net gelir (vergiler düşüldükten sonraki kazanç). Boş olabilir. |
| **tax_amount_local** | Yerel para biriminde kesilen vergi tutarı. Boş olabilir. |
| **customer_user_id** | Geliştirici kullanıcı ID'si. Örneğin kullanıcı UUID'niz, e-posta adresiniz veya başka bir ID olabilir. Ayarlamadıysanız null döner. |
| **store** | _app_store_ veya _play_store_ olabilir. |
| **product_id** | Apple App Store, Google Play Store veya Stripe'taki ürün ID'si. |
| **base_plan_id** | Google Play Store'daki [temel plan ID'si](https://support.google.com/googleplay/android-developer/answer/12154973) veya Stripe'taki [fiyat ID'si](https://docs.stripe.com/products-prices/how-products-and-prices-work#use-products-and-prices). |
| **developer_id** | İşlemin gerçekleştiği paywallın geliştirici (SDK) ID'si. |
| **ab_test_name** | İşlemin gerçekleştiği A/B testinin adı. |
| **ab_test_revision** | İşlemin gerçekleştiği A/B testinin revizyonu. |
| **paywall_name** | İşlemin gerçekleştiği paywallın adı. |
| **paywall_revision** | İşlemin gerçekleştiği paywallın revizyonu. |
| **profile_county** | Adapty tarafından IP'ye göre belirlenen profil ülkesi. |
| **install_date** | Kurulumun gerçekleştiği ISO 8601 tarihi. |
| **idfv** | iOS cihazlarda [identifierForVendor](https://developer.apple.com/documentation/uikit/uidevice/identifierforvendor) |
| **idfa** | iOS cihazlarda [advertisingIdentifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/advertisingidentifier) |
| **advertising_id** | Android İşletim Sistemi tarafından atanan ve reklamverenlerin bir kullanıcının cihazını benzersiz biçimde tanımlamak için kullanabileceği benzersiz kod. |
| **ip_address** | Cihaz IP'si (IPv4 veya IPv6 olabilir; mevcut olduğunda IPv4 tercih edilir). Cihazın IP'si her değiştiğinde güncellenir. |
| **cancellation_reason** | Kullanıcının aboneliği iptal etme nedeni.
Şunlar olabilir:
**iOS & Android** _voluntarily_cancelled_, _billing_error_, _refund_
**iOS** _price_increase_, _product_was_not_available_, _unknown_, _upgraded_
**Android** _new_subscription_replace_, _cancelled_by_developer_
| | **android_app_set_id** | Parasal olmayan reklam kullanım senaryoları için cihaz başına, geliştirici hesabı başına ve kullanıcı tarafından sıfırlanabilir benzersiz bir ID olan [AppSetId](https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/appsetid/AppSetId). | | **android_id** | Android 8.0 (API düzeyi 26) ve üzeri sürümlerde, uygulama imzalama anahtarı, kullanıcı ve cihaz kombinasyonuna özgü 64 bit'lik (onaltılık dize olarak ifade edilen) benzersiz bir sayı. Daha fazla ayrıntı için [Android geliştirici belgelerine](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) bakın. | | **device** | Son kullanıcıya görünen cihaz modeli adı. | | **currency** | İşlemin 3 harfli para birimi kodu (ISO-4217). | | **store_country** | Apple/Google mağazası tarafından belirlenen profil ülkesi. | | **attribution_source** | Attribution kaynağı. | | **attribution_network_user_id** | Attribution kaynağı tarafından kullanıcıya atanan ID. | | **attribution_status** | organic, non_organic veya unknown olabilir. | | **attribution_channel** | Pazarlama kanalı adı. | | **attribution_campaign** | Pazarlama kampanyası adı. | | **attribution_ad_group** | Attribution reklam grubu. | | **attribution_ad_set** | Attribution reklam seti. | | **attribution_creative** | Attribution kreatif anahtar kelimesi. | | **attributes** | [Özel kullanıcı nitelikleri](setting-user-attributes#custom-user-attributes) içeren JSON. Mobil uygulamanızdan göndermek üzere ayarladığınız özel nitelikleri içerir. Göndermek için [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) sayfasındaki **Send User Attributes** seçeneğini etkinleştirin. | | **integration_ids** | Bir profille ilişkili tüm entegrasyon ID'leri. Sözlük. Örnek: {'mixpanel_user_id': 'mixpanelUserId-test', 'facebook_anonymous_id': 'facebookAnonymousId-test'} | Here is the table structure for the paywall visits: | Sütun | Açıklama | | :-------------------- | :-------------------------------------------------------------------------------------------------------------------- | | **profile_id** | Adapty kullanıcı ID'si. | | **customer_user_id** | Geliştirici kullanıcı ID'si. Örneğin kullanıcı UUID'niz, e-postanız veya başka bir ID olabilir. Ayarlamadıysanız null. | | **profile_country** | Apple/Google store tarafından belirlenen profil ülkesi. | | **install_date** | Kurulumun gerçekleştiği ISO 8601 tarih değeri. | | **store** | _app_store_ veya _play_store_ olabilir. | | **paywall_showed_at** | Paywallın kullanıcıya gösterildiği tarih. | | **developer_id** | İşlemin gerçekleştiği paywallın geliştirici (SDK) ID'si. | | **ab_test_name** | İşlemin gerçekleştiği A/B testinin adı. | | **ab_test_revision** | İşlemin gerçekleştiği A/B testinin revizyonu. | | **paywall_name** | İşlemin gerçekleştiği paywallın adı. | | **paywall_revision** | İşlemin gerçekleştiği paywallın revizyonu. | ## Etkinlikler ve etiketler \{#events-and-tags\} İntegrasyon tarafından iletilen verileri yönetebilirsiniz. İntegrasyon aşağıdaki yapılandırma seçeneklerini sunar: | Ayar | Açıklama | | :--------------------------------- | :----------------------------------------------------------- | | **Exclude Historical Events** | Adapty SDK'nın yüklendiği günden önce gerçekleşen etkinlikleri dışarıda bırakmak için bu seçeneği işaretleyin. Bu sayede etkinlik tekrarının önüne geçilir ve raporlama doğruluğu korunur. Örneğin, bir kullanıcı 10 Ocak'ta aylık abonelik başlattıysa ve uygulamayı Adapty SDK ile 6 Mart'ta güncelledi ise Adapty, 6 Mart öncesindeki etkinlikleri atlar ve sonraki etkinlikleri saklar. | | **Include events without profile** | Adapty'de bir kullanıcı profiline bağlı olmayan işlemleri dahil etmek için bu seçeneği işaretleyin. Bunlar; Adapty SDK yüklenmeden önce yapılan satın almalar ya da mağaza sunucu bildirimlerinden gelen ve belirli bir kullanıcıyla hemen ilişkilendirilemeyen işlemler olabilir. | | **Send User Attributes** | Dil tercihleri gibi kullanıcıya özgü öznitelikleri göndermek istiyorsanız ve OneSignal planınız 10'dan fazla etiketi destekliyorsa bu seçeneği etkinleştirin. Etkinleştirildiğinde varsayılan 10 etiketin ötesinde ek bilgiler gönderilebilir. Etiket sınırının aşılması hatalara yol açabileceğini unutmayın. | Entegrasyon ayarlarının altında, Adapty'den Amazon S3'e aktarıp depolayabileceğiniz üç grup etkinlik bulunur. İhtiyacınız olanları açmanız yeterli. Adapty'nin sunduğu etkinliklerin tam listesine [buradan](events) ulaşabilirsiniz.
---
# File: google-cloud-storage
---
---
title: "Google Cloud Storage"
description: "Güvenli veri depolama için Google Cloud Storage'ı Adapty ile entegre edin."
---
Google Cloud Storage entegrasyonunu etkinleştirerek [abonelik olaylarını](events) ve [paywall ziyaret verilerini](paywall-metrics) tek bir merkezi konumda güvenle saklayın: Google Cloud Storage bucket'ınız.
Her gün UTC 04:00'te Adapty, bir önceki günün verilerini içeren .csv dosyalarını bucket'larınıza yükler. **event** verilerini, **paywall visit** verilerini veya **her ikisini** almak isteyip istemediğinizi seçebilirsiniz. Bu verileri istediğiniz zaman, istediğiniz zaman aralığı için [manuel olarak](#manual-data-export) da dışa aktarabilirsiniz.
Entegrasyonu kurmak için Google Cloud konsolunuzda [bir bucket erişim anahtarı oluşturun](#create-google-cloud-storage-credentials) ve [bunu Adapty ayarlarınıza ekleyin](#set-up-google-cloud-storage-integration).
## Yükleme zamanlaması ve süresi \{#upload-schedule-and-duration\}
Adapty, verileri her 24 saatte bir UTC 04:00'de Google Cloud Storage'a yükler.
Dosyalar, bir önceki takvim gününde (UTC) oluşturulan etkinliklerin verilerini içerir. 8 Mart'ta yüklenen dosya, 7 Mart'ta 00:00:00 ile 23:59:59 UTC arasında oluşturulan tüm etkinlikleri içerir.
Kuyruktaki toplam dosya sayısına ve kişisel olarak talep ettiğiniz veri miktarına bağlı olarak işlem birkaç saate kadar sürebilir. Adapty ilk yüklemede geçmiş verileri de ekliyorsa, sonraki günlük yüklemelerden daha uzun sürer.
## Google Cloud Storage entegrasyonunu kurma \{#set-up-google-cloud-storage-integration\}
**Yazma erişimine** sahip geçerli bir Google Cloud hizmet hesabı anahtarına ihtiyacınız var. Oluşturmak için [kimlik bilgileri oluşturma](#create-google-cloud-storage-credentials) bölümündeki adımları izleyin.
:::warning
Etkinlikler ve paywall ziyaretleri için farklı kimlik bilgileriyle farklı bucket'lar kullanabilirsiniz. Ancak kimlik bilgilerinden **herhangi biri** geçersizse [**her iki yükleme de başarısız olur**](#troubleshooting).
:::
[**Integrations** -> **Google Cloud Storage**](https://app.adapty.io/integrations/google-cloud-storage) sayfasına gidin ve ilgili sekmeyi açın (**Events** veya **Paywall visits**). Entegrasyonu etkinleştirin.
**Google Cloud hizmet hesabı anahtarınızı** içeren dosyayı yükleyin. Hedef **bucket** ve **klasörü** belirtin. Değişikliklerinizi kaydedin.
### Etkinlik verileri için isteğe bağlı ayarlar \{#optional-settings-for-event-data\}
Rapora dahil edilecek etkinlikleri belirleyebilir ve etkinlikler için özel isimler ayarlayabilirsiniz. Mevcut etkinliklerin tam listesi için [etkinlikler](events) makalesine bakın.
| Ad | Varsayılan | Açıklama |
| ------------------------------ | ----------------- | ----------- |
| Exclude historical events | true | Adapty SDK'yı uygulamanıza entegre etmeden önce gerçekleşen etkinliklere ait bilgileri hariç tutar. Bir kullanıcı 10 Ocak'ta aylık abonelik satın aldı. Uygulamanızın 1 Mart güncellemesi Adapty SDK'yı ilk kez içeriyordu.
Bu ayar **açıksa** rapor, Ocak'taki "abonelik başladı" etkinliğini veya Şubat'taki "abonelik yenilendi" etkinliğini içermez. Mart'ın 10'undaki "abonelik yenilendi" etkinliğini **içerir**.
Kullanıcının aboneliği iptal etme nedeni.
Olası değerler:
**iOS & Android** — *voluntarily_cancelled*, *billing_error*, *refund*
**Yalnızca iOS** — *price_increase*, *product_was_not_available*, *unknown*, *upgraded*
**Yalnızca Android** — *new_subscription_replace*, *cancelled_by_developer*
| | **android_app_set_id** | Parasal olmayan reklam kullanım durumları için cihaz başına, geliştirici hesabı başına kullanıcı tarafından sıfırlanabilir benzersiz bir kimlik olan [AppSetId](https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/appsetid/AppSetId). | | **android_id** | Android 8.0 (API seviyesi 26) ve üzeri platformlarda uygulama imzalama anahtarı, kullanıcı ve cihaz kombinasyonuna özgü 64 bitlik bir sayı (onaltılık dize olarak ifade edilir). Daha fazla bilgi için [Android geliştirici belgelerine](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) bakın. | | **device** | Son kullanıcıya görünür cihaz model adı. | | **currency** | İşlemin 3 harfli para birimi kodu (ISO-4217). | | **store_country** | Apple/Google mağazası tarafından belirlenen profil ülkesi. | | **attribution_source** | Attribution kaynağı. | | **attribution_network_user_id** | Attribution kaynağı tarafından kullanıcıya atanan kimlik. | | **attribution_status** | organic, non_organic veya unknown olabilir. | | **attribution_channel** | Pazarlama kanalı adı. | | **attribution_campaign** | Pazarlama kampanyası adı. | | **attribution_ad_group** | Attribution reklam grubu. | | **attribution_ad_set** | Attribution reklam seti. | | **attribution_creative** | Attribution kreatif anahtar kelimesi. | | **attributes** | [Özel kullanıcı özniteliklerinin](setting-user-attributes#custom-user-attributes) JSON'ı. Mobil uygulamanızdan gönderecek şekilde ayarladığınız tüm özel öznitelikleri içerir. Göndermek için [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) sayfasındaki **Send User Attributes** seçeneğini etkinleştirin. | | **integration_ids** | Bir profille ilişkili tüm entegrasyon kimlikleri. Sözlük. Örnek: {'mixpanel_user_id': 'mixpanelUserId-test', 'facebook_anonymous_id': 'facebookAnonymousId-test'} | ### Paywall ziyaretleri \{#paywall-visits\} | Sütun | Açıklama | | :-------------------- | :----------------------------------------------------------------------------------------------------------- | | **profile_id** | Adapty kullanıcı kimliği. | | **customer_user_id** | Geliştirici kullanıcı kimliği. Örneğin kullanıcı UUID'niz, e-postanız veya başka bir kimlik olabilir. Ayarlanmadıysa null. | | **profile_country** | Apple/Google mağazası tarafından belirlenen profil ülkesi. | | **install_date** | Kurulumun gerçekleştiği ISO 8601 tarih formatı. | | **store** | *app_store* veya *play_store* olabilir. | | **paywall_showed_at** | Paywallın müşteriye gösterildiği tarih. | | **developer_id** | İşlemin gerçekleştiği paywallın geliştirici (SDK) kimliği. | | **ab_test_name** | İşlemin gerçekleştiği A/B testinin adı. | | **ab_test_revision** | İşlemin gerçekleştiği A/B testinin revizyonu. | | **paywall_name** | İşlemin gerçekleştiği paywallın adı. | | **paywall_revision** | İşlemin gerçekleştiği paywallın revizyonu. | ## Sorun giderme \{#troubleshooting\} Adapty, yükleme başlamadan **önce** erişim anahtarlarınızın geçerliliğini kontrol eder. Google Cloud Storage anahtarlarınızdan yalnızca biri geçersizse bile Adapty **yüklemeyi iptal eder** ve hata fırlatır. Yüklemelerin kesintisiz devam etmesi için anahtarlarınızı süresi dolmadan önce yenileyin. **Etkinlikler** için anahtarı güncellediyseniz **paywall ziyaretleri** için de güncellemeyi unutmayın; ya da tam tersi. --- # File: webhook-event-types-and-fields --- --- title: "Webhook olay türleri ve alanları" description: "" --- Adapty, abonelik olaylarına yanıt olarak webhook'lar gönderir. Bu bölüm, bu olay türlerini ve her webhook'ta yer alan verileri tanımlar. ## Webhook olay türleri \{#webhook-event-types\} Tüm olay türlerini webhook'unuza gönderebilir ya da yalnızca bir kısmını seçebilirsiniz. Hangi tür verilerin geleceğini ve bunların etrafında iş mantığınızı nasıl oluşturacağınızı öğrenmek için [Event flows](event-flows) sayfamıza göz atabilirsiniz. İhtiyaç duymadığınız olay türlerini, [Webhook entegrasyonunu kurma](set-up-webhook-integration#configure-webhook-integration-in-the-adapty-dashboard) adımında devre dışı bırakabilirsiniz. Aynı yerden, gerekirse Adapty'nin varsayılan olay kimliklerini kendi olay kimliklerinizle de değiştirebilirsiniz. | Event name | Description | |:-----------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | subscription_started | Kullanıcı deneme süresi olmaksızın ücretli bir abonelik etkinleştirdiğinde, yani anında ücretlendirildiğinde tetiklenir. | | subscription_renewed | Abonelik yenilendiğinde ve kullanıcı ücretlendirildiğinde gerçekleşir. Bu olay, deneme süreli veya deneme süresiz aboneliklerde ikinci ödemeden itibaren başlar. | | subscription_renewal_cancelled | Kullanıcı abonelik otomatik yenilemesini kapattığında tetiklenir. Kullanıcı, ücretli abonelik süresi sonuna kadar premium özelliklere erişmeye devam eder. | | subscription_renewal_reactivated | Kullanıcı abonelik otomatik yenilemesini yeniden etkinleştirdiğinde tetiklenir. | | subscription_expired | İptal edilen bir abonelik tamamen sona erdiğinde tetiklenir. Örneğin, kullanıcı aboneliğini 12 Aralık'ta iptal etmiş ancak abonelik 31 Aralık'a kadar aktif kalmaya devam ediyorsa, olay aboneliğin sona erdiği 31 Aralık'ta kaydedilir. | | subscription_paused | Kullanıcı [abonelik duraklatma](https://developer.android.com/google/play/billing/lifecycle/subscriptions#pause) özelliğini etkinleştirdiğinde gerçekleşir (yalnızca Android). | | subscription_deferred | Abonelik satın alımı [ertelendiğinde](https://adapty.io/glossary/subscription-purchase-deferral/) tetiklenir; kullanıcılar premium özelliklere erişimlerini sürdürürken ödemeyi geciktirebilir. Bu özellik Google Play Developer API aracılığıyla kullanılabilir ve ücretsiz denemeler için ya da mali güçlük yaşayan kullanıcılara destek sağlamak amacıyla kullanılabilir. | | non_subscription_purchase | Süresiz erişim veya oyun içi coin gibi consumable ürünler dahil, abonelik dışındaki tüm satın almalar. | | trial_started | Kullanıcı deneme aboneliği etkinleştirdiğinde tetiklenir. | | trial_converted | Deneme süresi sona erdiğinde ve kullanıcı ücretlendirildiğinde (ilk satın alma) gerçekleşir. Örneğin, kullanıcının denemesi 14 Ocak'a kadar sürüyor ancak 7 Ocak'ta ücretlendiriliyorsa, bu olay 7 Ocak'ta kaydedilir. | | trial_renewal_cancelled | Kullanıcı deneme süresi boyunca abonelik otomatik yenilemesini kapattığında tetiklenir. Kullanıcı deneme süresi sonuna kadar premium özelliklere erişmeye devam eder; ancak ücretlendirilmez ve abonelik başlatılmaz. | | trial_renewal_reactivated | Kullanıcı deneme süresi boyunca abonelik otomatik yenilemesini yeniden etkinleştirdiğinde gerçekleşir. | | trial_expired | Deneme süresi aboneliğe dönüşmeden sona erdiğinde tetiklenir. | | entered_grace_period | Ödeme girişimi başarısız olduğunda ve kullanıcı ek süreye girdiğinde gerçekleşir (etkinleştirilmişse). Kullanıcı bu süre boyunca premium erişimini korur. | | billing_issue_detected | Ücretlendirme girişimi sırasında bir ödeme sorunu oluştuğunda (örn. yetersiz kart bakiyesi) tetiklenir. | | subscription_refunded | Bir abonelik iade edildiğinde (örn. Apple Support tarafından) tetiklenir. | | non_subscription_purchase_refunded | Abonelik dışı bir satın alma iade edildiğinde tetiklenir. | | access_level_updated | Kullanıcının access level'ı güncellendiğinde gerçekleşir. | :::note `subscription_renewal_reactivated` olayı, kullanıcının aboneliği iptal ettiği sırada aktif olan **önceki** ürün kimliğini taşır; kullanıcı daha sonra farklı bir ürün satın alarak aboneliği yeniden etkinleştirmiş olsa bile bu böyledir. Apple, iptal → yeniden etkinleştirme zinciri boyunca aynı `original_transaction_id`'yi kullandığından bu olay orijinal ürünü yansıtır. Yeni ürün, yeni ürüne ait faturalandırma başladığında gerçekleşen bir sonraki `subscription_renewed` olayında görünür. ::: ## Webhook etkinlik yapısı \{#webhook-event-structure\} Adapty, yalnızca [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) sayfasının **Events names** bölümünde seçtiğiniz etkinlikleri size gönderir. Webhook olayları JSON formatında serileştirilir. Sunucunuza gönderilen `POST` isteğinin gövdesi, aşağıdaki yapıya sarmalanmış serileştirilmiş olayı içerir. Tüm olaylar aynı yapıyı izler, ancak alanlar olay türüne, mağazaya ve özel yapılandırmanıza göre farklılık gösterir. Kullanıcı özellikleri, ayarladığınız [özel kullanıcı özellikleri](setting-user-attributes#custom-user-attributes)dir, dolayısıyla yapılandırdığınız içerikleri barındırır. Attribution verisi alanları da tüm olay türleri için aynıdır; ancak attribution listesi, mobil uygulamanızda kullandığınız attribution kaynaklarına göre değişir. Aşağıda bir olay örneği görebilirsiniz: ```json title="Json" showLineNumbers { "profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem", "idfv": "00000000-0000-0000-0000-000000000000", "idfa": "00000000-0000-0000-0000-000000000000", "advertising_id": "00000000-0000-0000-0000-000000000000", "profile_install_datetime": "2000-01-31T00:00:00.000000+0000", "user_agent": "ExampleUserAgent/1.0 (Device; OS Version) Browser/Engine", "email": "john.doe@company.com", "event_type": "subscription_started", "event_datetime": "2000-01-31T00:00:00.000000+0000", "event_properties": { "store": "play_store", "currency": "USD", "price_usd": 4.99, "profile_id": "00000000-0000-0000-0000-000000000000", "cohort_name": "All Users", "environment": "Production", "price_local": 4.99, "original_price_usd": 4.99, "original_price_local": 4.99, "discount_amount_usd": 0, "discount_amount_local": 0, "base_plan_id": "b1", "developer_id": "onboarding_placement", "ab_test_name": "onboarding_ab_test", "ab_test_revision": 1, "paywall_name": "UsedPaywall", "proceeds_usd": 4.2315, "variation_id": "00000000-0000-0000-0000-000000000000", "purchase_date": "2024-11-15T10:45:36.181000+0000", "store_country": "AR", "event_datetime": "2000-01-31T00:00:00.000000+0000", "proceeds_local": 4.2415, "tax_amount_usd": 0, "transaction_id": "0000000000000000", "net_revenue_usd": 4.2415, "profile_country": "AR", "paywall_revision": "1", "profile_event_id": "00000000-0000-0000-0000-000000000000", "tax_amount_local": 0, "net_revenue_local": 4.2415, "vendor_product_id": "onemonth_no_trial", "profile_ip_address": "10.10.1.1", "consecutive_payments": 1, "rate_after_first_year": false, "original_purchase_date": "2000-01-31T00:00:00.000000+0000", "original_transaction_id": "0000000000000000", "subscription_expires_at": "2000-01-31T00:00:00.000000+0000", "profile_has_access_level": true, "profile_total_revenue_usd": 4.99, "promotional_offer_id": null, "store_offer_category": null, "store_offer_discount_type": null }, "event_api_version": 1, "profiles_sharing_access_level": [{"profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem"}], "attributions": { "appsflyer": { "ad_set": "Keywords 1.12", "status": "non_organic", "channel": "Google Ads", "ad_group": null, "campaign": "Social media influencers - Rest of the world", "creative": null, "created_at": "2000-01-31T00:00:00.000000+0000" } }, "user_attributes": {"Favourite_color": "Violet", "Pet_name": "Fluffy"}, "integration_ids": {"firebase_app_instance_id": "val1", "branch_id": "val2", "one_signal_player_id": "val3"}, "play_store_purchase_token": { "product_id": "product_123", "purchase_token": "token_abc_123", "is_subscription": true } } ``` ### Etkinlik alanları \{#event-fields\} Etkinlik parametreleri tüm etkinlik türleri için aynıdır. | **Alan** | **Tür** | **Açıklama** | |---|---|---| | **advertising_id** | UUID | Reklam kimliği (yalnızca Android). | | **attributions** | JSON | [Attribution verisi](webhook-event-types-and-fields#attributions). [Webhook ayarları](https://app.adapty.io/integrations/customwebhook)'nda **Send Attribution** etkinleştirilmişse eklenir. | | **customer_user_id** | String | [Kullanıcıları tanımlarken](ios-quickstart-identify) uygulama kodunuzda ayarladıysanız uygulamanızdaki kullanıcı kimliği (UUID, e-posta veya başka bir kimlik). Kullanıcıları uygulama kodunda tanımlamıyorsanız ya da bu kullanıcı anonimse (oturum açmamışsa) bu alan `null` olur. | | **email** | String | Adapty SDK'daki [`updateProfile`](setting-user-attributes) metodunu kullanarak veya sunucu taraflı API aracılığıyla profil oluştururken/güncellerken ayarladıysanız kullanıcının e-postası. `email` değerini SDK veya API metoduna geçirmiyorsanız bu alan `null` olur. | | **event_api_version** | Integer | Adapty API sürümü (güncel: `1`). | | **event_datetime** | ISO 8601 | Etkinliğin gerçekleşme (iş) zamanı; örneğin bir satın alma için satın alma tarihi, sona erme için son kullanma tarihi — Adapty'nin etkinliği aldığı veya gönderdiği zaman değil. [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) formatı (ör. `2020-07-10T15:00:00.000000+0000`). Sıralama hakkında aşağıdaki nota bakın. | | **event_properties** | JSON | [Etkinlik özellikleri](webhook-event-types-and-fields#event-properties). | | **event_type** | String | Adapty formatındaki etkinlik adı. Tam liste için [Webhook etkinlik türleri](webhook-event-types-and-fields#webhook-event-types)'ne bakın. | | **idfa** | UUID | Reklam kimliği (yalnızca Apple). [Adapty Kontrol Paneli](https://app.adapty.io/profiles/users)'ndeki profilde **IDFA**. İzleme kısıtlamaları, çocuk modu veya gizlilik ayarları nedeniyle kullanılamıyorsa `null` olabilir. | | **idfv** | UUID | Geliştirici başına benzersiz Vendor Tanımlayıcısı (IDFV). [Adapty Kontrol Paneli](https://app.adapty.io/profiles/users)'ndeki profilde **IDFV**. | | **integration_ids** | JSON | Adapty SDK'daki `setIntegrationIdentifier` metodunu kullanarak veya sunucu taraflı API aracılığıyla profil oluştururken/güncellerken ayarladıysanız kullanıcı entegrasyon kimlikleri. Kullanılamıyorsa veya entegrasyonlar devre dışıysa `null`. | | **play_store_purchase_token** | JSON | [Play Store satın alma token'ı](webhook-event-types-and-fields#play-store-purchase-token); [Webhook ayarları](https://app.adapty.io/integrations/customwebhook)'nda **Send Play Store purchase token** etkinleştirilmişse eklenir. | | **profile_id** | UUID | Adapty'nin her profil için otomatik olarak oluşturduğu profil kimliği. Kullanıcıları tanımlamıyorsanız veya giriş öncesi satın almalara izin veriyorsanız, bir Apple/Google kimliği farklı profil kimlikleriyle ilişkilendirilebilir. Adapty'nin üst/devralınan profillerle çalışma şekli hakkında [daha fazla bilgi edinin](how-profiles-work#parent-and-inheritor-profiles). | | **profile_install_datetime** | ISO 8601 | [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) formatında kurulum zaman damgası (ör. `2020-07-10T15:00:00.000000+0000`). | | **profiles_sharing_access_level** | JSON | Mevcut kullanıcı profili hariç [access level'ı paylaşan](general#6-sharing-paid-access-between-user-accounts) kullanıcıların listesi. Uygulamanız için access level paylaşımı etkinleştirilmişse bu liste, aynı Apple/Google kimliğiyle kullanılmış diğer profilleri içerir.Mobil uygulama kodundaki özel nitelik değerleri float veya string olarak ayarlanabilse de sunucu taraflı API veya geçmiş içe aktarma yoluyla alınan nitelikler farklı formatlarda gelebilir. Bu durumda boolean ve integer değerler float'a dönüştürülür.
| :::note `event_datetime`, bir etkinliğin abonelik yaşam döngüsünde ne zaman gerçekleştiğini yansıtır; Adapty'nin bunu ne zaman işlediğini veya ilettiğini değil. Bu nedenle, etkinlikler aynı `event_datetime` değerini paylaşabilir ya da kronolojik sıradan farklı bir sırada gelebilir. Örneğin, bir `subscription_expired` etkinliği, Adapty'nin daha önce ilettiği bir `subscription_renewal_cancelled` etkinliğinden daha erken bir `event_datetime` taşıyabilir. Etkinlikleri sıralamak için `event_datetime` değerine güvenmeyin. Bunun yerine, etkinlikleri kendi alım zamanınıza göre sıralayın ve `profile_event_id` ya da işlem kimliklerini kullanarak tekrar edenleri temizleyin. ::: ### Attributions Attribution verilerini göndermek için [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) sayfasında **Send Attribution** seçeneğini etkinleştirin. Attribution verilerini göndermeyi etkinleştirdiyseniz ve [attribution entegrasyonları](attribution-integration) kurduysanız, aşağıdaki veriler her kaynak için etkinlikle birlikte gönderilir. Aynı attribution verileri tüm etkinlik türlerine gönderilir. ```json title="Json" showLineNumbers { "attributions": { "appsflyer": { "ad_set": "sample_ad_set_123", "status": "non_organic", "channel": "sample_channel", "ad_group": "sample_ad_group_456", "campaign": "sample_ios_campaign", "creative": "sample_creative_789", "created_at": "2000-01-31T00:00:00.000000+0000", "network_user_id": "0000000000000-0000000" } } } ``` | Alan adı | Alan türü | Açıklama | | :------------------ | :------------ | :------------------------------------------------- | | **ad_set** | String | Attribution reklam seti. | | **status** | String | `organic`, `non_organic,` veya `unknown` olabilir. | | **channel** | String | Pazarlama kanalı adı. | | **ad_group** | String | Attribution reklam grubu. | | **campaign** | String | Pazarlama kampanyası adı. | | **creative** | String | Attribution yaratıcı anahtar kelimesi. | | **created_at** | ISO 8601 date | Attribution kaydının oluşturulma tarihi ve saati. | | **network_user_id** | String | Attribution kaynağının kullanıcıya atadığı ID. | ### Entegrasyon ID'leri \{#integration-ids\} Aşağıdaki entegrasyon ID'leri artık etkinliklerde kullanılmaktadır: - `adjust_device_id` - `airbridge_device_id` - `amplitude_device_id` - `amplitude_user_id` - `appmetrica_device_id` - `appmetrica_profile_id` - `appsflyer_id` - `branch_id` - `facebook_anonymous_id` - `firebase_app_instance_id` - `mixpanel_user_id` - `pushwoosh_hwid` - `one_signal_player_id` - `one_signal_subscription_id` - `tenjin_analytics_installation_id` - `posthog_distinct_user_id` ### Play Store satın alma token'ı \{#play-store-purchase-token\} Bu alan, gerektiğinde bir satın almayı yeniden doğrulamak için gereken tüm verileri içerir. Yalnızca [Webhook entegrasyon ayarları](https://app.adapty.io/integrations/customwebhook)nda **Send Play Store purchase token** seçeneği etkinleştirilmişse gönderilir. | Alan | Tür | Açıklama | | :------------------ | :------ | :----------------------------------------------------------- | | **product_id** | String | Play Store'da satın alınan ürünün benzersiz tanımlayıcısı (SKU). | | **purchase_token** | String | Google Play tarafından bu satın alma işlemini benzersiz şekilde tanımlamak için oluşturulan token. | | **is_subscription** | Boolean | Satın alınan ürünün bir abonelik (`true`) mi yoksa tek seferlik satın alma (`false`) mı olduğunu belirtir. | ### Etkinlik özellikleri \{#event-properties\} Etkinlik özellikleri, etkinlik türüne ve hatta aynı türdeki etkinlikler arasında bile farklılık gösterebilir. Örneğin, App Store'dan gelen bir etkinlik, `base_plan_id` gibi Android'e özgü özellikleri içermez. [Access Level Updated](webhook-event-types-and-fields#for-access-level-updated-event) olayının kendine özgü özellikleri bulunduğundan, bu olay için ayrı bir bölüm hazırladık. Benzer şekilde, yalnızca belirli olay türlerine özgü oldukları için [Ek vergi ve gelir olayı özellikleri](webhook-event-types-and-fields#additional-tax-and-revenue-event-properties) de ayrı bir bölümde ele alınmaktadır. #### Çoğu olay türü için \{#for-most-event-types\} **Access Level Updated** eventi dışındaki çoğu olay türü için olay özellikleri tutarlıdır (bu olay kendi bölümünde açıklanmaktadır). Aşağıda özellikleri öne çıkaran ve bunların belirli olaylara ait olup olmadığını gösteren kapsamlı bir tablo yer almaktadır. :::note Adapty, diğer para birimlerini [currencylayer.com](https://currencylayer.com/) döviz kuru üzerinden USD'ye çevirir (her 8 saatte bir güncellenir). Kur, **işlem anında sabitlenir** — sonraki değişiklikler dönüşüm sonucunu etkilemez. ::: | Alan | Tür | Açıklama | |:------------------------------|:--------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **ab_test_name** | String | İşlemin kaynaklandığı [Adapty A/B testi](ab-tests) adı. | | **ab_test_revision** | Integer | İşlemin kaynaklandığı A/B testinin revizyonu. | | **base_plan_id** | String | Google Play Store'daki [temel plan ID'si](https://support.google.com/googleplay/android-developer/answer/12154973) veya Stripe'taki [fiyat ID'si](https://docs.stripe.com/products-prices/how-products-and-prices-work#use-products-and-prices). | | **cancellation_reason** | String |Olası iptal nedenleri: `voluntarily_cancelled`, `billing_error`, `price_increase`, `product_was_not_available`, `refund`, `cancelled_by_developer`, `new_subscription_replace`, `upgraded`, `unknown`, `adapty_revoked`.
Şu etkinlik türlerinde bulunur:
`subscription_cancelled`, `subscription_refunded` ve `trial_cancelled`. | | **cohort_name** | String | Kullanıcıya hangi paywall'ın gösterileceğini belirleyen [kitlenin](audience) adı. | | **consecutive_payments** | Integer | Kullanıcının kesintisiz olarak abone olduğu dönem sayısı. Mevcut dönemi de içerir. | | **currency** | String | Yerel para birimi. | | **developer_id** | String | İşlemin kaynaklandığı [placement](placements) ID'si. | | **discount_amount_local** | Float | İşleme uygulanan indirim: Apple/Google kesintisi öncesinde standart fiyat eksi gerçekte tahsil edilen tutar, yerel para birimi cinsinden. Tam fiyatlı satın alımlarda `0`. Ücretsiz deneme süresinde hiçbir şey tahsil edilmediğinden tam standart fiyata (`original_price_local`) eşittir. Bir teklif uygulandığında ancak standart fiyat bilinmediğinde `null` (bkz. `original_price_local`). App Store ön ödemeli teklifler için her zaman `null`'dır: tek seferlik ön ödeme birden fazla faturalandırma dönemini kapsadığından dönemlik standart fiyatla karşılaştırılamaz. | | **discount_amount_usd** | Float | `discount_amount_local` değerinin USD cinsinden karşılığı. | | **environment** | String | Olası değerler: `Sandbox` veya `Production`. | | **event_datetime** | ISO 8601 date | Etkinliğin tarih ve saati. Etkinliğin kök düzeyindekiyle aynıdır. | | **original_price_local** | Float | Ürünün Apple/Google kesintisi öncesindeki standart, indirimsiz fiyatı, yerel para birimi cinsinden. Abonelikler için bu yenileme fiyatıdır. Tam fiyatlı satın alımlarda `price_local` değerine eşittir ve tek seferlik satın alımlar için her zaman `price_local` değerine eşittir; zira mağazalar bunlar için ayrı bir standart fiyat bildirmez. Mağazanın güvenilir bir standart fiyat bildirmediği indirimli satın alımlarda `null` olur (örneğin otomatik yenileme kapalıysa, yenileme hâlâ bir teklif içeriyorsa veya ürün değişikliği beklemedeyse). | | **original_price_usd** | Float | `original_price_local` ile aynı, USD cinsinden. | | **original_purchase_date** | ISO 8601 date | Yinelenen abonelikler için orijinal satın alma, zincirdeki ilk işlemdir; orijinal işlem ID'si olarak adlandırılan bu ID, yenileme zincirini birbirine bağlar; sonraki işlemler bunun uzantılarıdır. Orijinal satın alma tarihi, bu ilk işlemin tarih ve saatidir. | | **original_transaction_id** | String |Yinelenen abonelikler için bu, yenileme zincirini birbirine bağlayan orijinal işlem ID'sidir. Orijinal işlem zincirdeki ilktir; sonraki işlemler bunun uzantılarıdır.
Uzantı yoksa `original_transaction_id`, store_transaction_id ile eşleşir.
| | **paywall_name** | String | İşlemin kaynaklandığı paywall'ın adı. | | **paywall_revision** | String | İşlemin kaynaklandığı paywall'ın revizyonu. Varsayılan değer 1'dir. | | **price_local** | Float | Apple/Google kesintisi öncesinde işlem için tahsil edilen tutar, yerel para birimi cinsinden. Ücretsiz denemeler için hiçbir şey tahsil edilmediğinden `null`'dır. | | **price_usd** | Float | Apple/Google kesintisi öncesinde işlem için tahsil edilen tutar, USD cinsinden. Ücretsiz denemeler için hiçbir şey tahsil edilmediğinden `null`'dır. | | **profile_country** | String | Adapty tarafından profil IP'sine göre belirlenir. | | **profile_event_id** | UUID | Tekilleştirme için kullanılabilecek benzersiz etkinlik ID'si. | | **profile_has_access_level** | Boolean | Profilin etkin bir access level'a sahip olup olmadığını belirten boolean değer. | | **profile_id** | UUID | Adapty tarafından oluşturulan profil ID'si. Etkinliğin kök düzeyindekiyle aynıdır. | | **profile_ip_address** | String | Profil IP'si (IPv4 veya IPv6 olabilir; mevcut olduğunda IPv4 tercih edilir). [Uygulama ayarlarında](https://app.adapty.io/settings/general) **Collect users' IP addresses** devre dışıysa `null`. | | **profile_total_revenue_usd** | Float | İadeler düşüldükten sonra profile ait toplam gelir. | | **promotional_offer_id** | String | Kullanılan [promosyon teklifinin](offers) Adapty ID'si. Bu ID'yi kontrol panelinde teklif oluştururken siz belirlersiniz. | | **purchase_date** | ISO 8601 date | Ürünün satın alındığı tarih ve saat. | | **rate_after_first_year** | Boolean | Aboneliğin bir yıllık kesintisiz yenilemenin ardından indirimli komisyon oranına (genellikle %15) hak kazanıp kazanmadığını gösteren boolean değer. Komisyon oranları programa uygunluk ve ülkeye göre değişir. Ayrıntılar için bkz. [Mağaza komisyonu ve vergiler](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue). | | **store** | String | Ürünün satın alındığı mağaza. Standart değerler: **app_store**, **play_store**, **stripe**, **paddle**.Apple App Store, Google Play Store veya Stripe'taki ürün ID'si.
Erişim gerçek bir mağaza işlemi olmadan sağlandıysa `vendor_product_id` şunlardan biri olacaktır:
Yenilenen abonelikler için bu, yenileme zincirini birbirine bağlayan orijinal işlem ID'sidir. Orijinal işlem zincirdeki ilkidir; sonraki işlemler bunun uzantısıdır.
Uzantı yoksa `original_transaction_id`, store_transaction_id ile aynıdır.
Orijinal satın almanın işlem tanımlayıcısı. | | **paywall_name** | String | İşlemin gerçekleştiği paywall'un adı. | | **paywall_revision** | String | İşlemin gerçekleştiği paywall'un revizyonu. Varsayılan değer 1'dir. | | **profile_country** | String | Adapty tarafından profil IP'sine göre belirlenir. | | **profile_event_id** | UUID | Tekilleştirme için kullanılabilecek benzersiz olay ID'si. | | **profile_has_access_level** | Boolean | Profilin aktif bir access level'a sahip olup olmadığını gösteren Boolean değer. | | **profile_id** | UUID | Adapty dahili kullanıcı profili ID'si. | | **profile_ip_address** | String | Profil IP'si (IPv4 veya IPv6 olabilir; mevcut olduğunda IPv4 tercih edilir). [Uygulama ayarlarında](https://app.adapty.io/settings/general) **Collect users' IP addresses** devre dışıysa `null`. | | **profile_total_revenue_usd** | Float | Profil için iadeler dahil toplam gelir. | | **purchase_date** | ISO 8601 date | Ürünün satın alındığı tarih ve saat. | | **renewed_at** | ISO 8601 date | Erişimin yenileneceği tarih ve saat. | | **starts_at** | ISO 8601 date | Access level'ın başladığı tarih ve saat. | | **store** | String | Ürünün satın alındığı mağaza. Standart değerler: **app_store**, **play_store**, **stripe**, **paddle**.Mağazadaki (Apple/Google/Stripe) ürün ID'si.
Gerçek bir mağaza işlemi olmadan erişim sağlandıysa `vendor_product_id` şunlardan biri olur:
1. **Endpoint'inizi kurarsınız:** 1. Sunucunuzun **Content-Type** başlığı `application/json` olarak ayarlanmış Adapty isteklerini işleyebildiğinden emin olun. 2. Sunucunuzu Adapty'nin doğrulama isteğini alacak ve herhangi bir `2xx` durum koduyla JSON gövdesiyle yanıt verecek şekilde yapılandırın. 3. Bağlantı doğrulandıktan sonra [abonelik olaylarını](#subscription-events) işleyin. 2. **Webhook entegrasyonunu yapılandırıp etkinleştirirsiniz** [Adapty Kontrol Paneli](#configure-webhook-integration-in-the-adapty-dashboard)'nden. Ayrıca [Adapty olaylarını özel olay adlarıyla eşleştirebilirsiniz](#configure-webhook-integration-in-the-adapty-dashboard). Üretime geçmeden önce **Sandbox ortamında** test etmenizi öneririz. 3. **Adapty sunucunuza bir doğrulama isteği gönderir.** 4. **Sunucunuz** `2XX` durum kodu ve JSON gövdesiyle yanıt verir. 5. **Adapty geçerli bir yanıt aldığında abonelik olaylarını göndermeye başlar.** ## Adapty isteklerini işlemek için sunucunuzu kurma \{#set-up-your-server-to-process-adapty-requests\} Adapty, webhook endpoint'inize 2 tür istek gönderir: 1. [Doğrulama isteği](#verification-request): Bağlantının doğru kurulduğunu doğrulamak için gönderilen ilk istek. Bu istek herhangi bir olay içermez ve Adapty Kontrol Paneli'nin Webhook entegrasyonunda **Save** düğmesine tıkladığınız anda gönderilir. Endpoint'inizin doğrulama isteğini başarıyla aldığını onaylamak için doğrulama yanıtıyla cevap vermeniz gerekir. 2. [Abonelik olayı](#subscription-events): Adapty sunucusunun bir olay oluşturulduğunda gönderdiği standart istek. Sunucunuzun belirli bir yanıt vermesi gerekmez; Adapty sunucusunun ihtiyacı olan tek şey, mesajı başarıyla alması durumunda standart 200 kodlu bir HTTP yanıtıdır. ### Doğrulama isteği \{#verification-request\} Adapty Kontrol Paneli'nde webhook entegrasyonunu etkinleştirdikten sonra Adapty, gövde olarak boş bir JSON nesnesi `{}` içeren bir POST doğrulama isteği gönderir. Endpoint'inizin **Content-Type header**'ını `application/json` olarak ayarlayın; yani sunucunuzun endpoint'i, gelen webhook isteğinin yükünün JSON formatında olmasını beklemelidir. Sunucunuz 2xx durum koduyla yanıt vermeli ve örneğin şu şekilde geçerli bir JSON yanıtı göndermelidir: ```json title="Json" {} ``` Adapty doğrulama yanıtını doğru formatta ve 2xx durum koduyla aldığında, Adapty webhook entegrasyonunuz tam olarak yapılandırılmış olur. ### Abonelik olayları \{#subscription-events\} Abonelik olayları, **Content-Type** başlığı `application/json` olarak ayarlanmış şekilde gönderilir ve JSON formatında olay verisi içerir. Olası olay türleri ve istek yapıları için [Webhook olay türleri ve alanları](webhook-event-types-and-fields) sayfasına bakın. ## Adapty Kontrol Paneli'nde webhook entegrasyonunu yapılandırma \{#configure-webhook-integration-in-the-adapty-dashboard\} Adapty'de, Apple veya Stripe sandbox ortamından ya da Google test hesabından gelen test olayları ile üretim olayları için ayrı akışlar yapılandırabilirsiniz. :::tip Adapty, her ortam (production ve sandbox) için tek bir webhook URL'sini destekler. Olayları birden fazla servise iletmek istiyorsanız, webhook'u kendi backend'inize yönlendirin ve oradan dağıtım yapın. ::: Üretim olayları için, geri çağrıların gönderileceği URL'yi belirten **Production endpoint URL** alanını kullanın. Ayrıca **Authorization header value for production endpoint** alanını da yapılandırın; bu başlık, sunucunuzun Adapty olaylarını doğrulaması için kullanılır. **Authorization header value for production endpoint** alanında belirtilen değerin, herhangi bir değişiklik veya ekleme yapılmadan `Authorization` başlığı olarak aynen kullanılacağını unutmayın. Test olayları için **Sandbox endpoint URL** ve **Authorization header value for sandbox endpoint** alanlarını kullanın. Webhook entegrasyonunu kurmak için: 1. Adapty Kontrol Paneli'nde [Integrations -> Webhook](https://app.adapty.io/integrations/customwebhook) sayfasını açın.
2. Entegrasyonu başlatmak için geçiş düğmesini açın.
4. Entegrasyon alanlarını doldurun:
| Alan | Açıklama |
| ------------------------------------------------------ | ------------------------------------------------------------ |
| **Production endpoint URL** | Adapty'nin üretimdeki olaylar için HTTP POST istekleri göndermek üzere kullandığı URL. |
| **Authorization header value for production endpoint** | Sunucunuzun üretimdeki Adapty isteklerini doğrulamak için kullanacağı başlık. Bu alanda belirtilen değerin, herhangi bir değişiklik veya ekleme yapılmadan `Authorization` başlığı olarak aynen kullanılacağını unutmayın.
Zorunlu olmamakla birlikte, güvenliği artırmak için kullanılması önemle tavsiye edilir.
| Sandbox ortamındaki test ihtiyaçlarınız için iki ek alan daha mevcuttur: | Test alanı | Açıklama | | --------------------------------------------------- | ------------------------------------------------------------ | | **Sandbox endpoint URL** | Adapty'nin sandbox ortamındaki olaylar için HTTP POST istekleri göndermek üzere kullandığı URL. | | **Authorization header value for sandbox endpoint** |Sunucunuzun sandbox ortamında test sırasında Adapty isteklerini doğrulamak için kullanacağı başlık. Bu alanda belirtilen değerin, herhangi bir değişiklik veya ekleme yapılmadan `Authorization` başlığı olarak aynen kullanılacağını unutmayın.
Zorunlu olmamakla birlikte, güvenliği artırmak için kullanılması önemle tavsiye edilir.
| 4. (İsteğe bağlı) Almak istediğiniz event'leri seçin ve isimlerini eşleştirin. Farklı durumlarda hangi event'lerin tetiklendiğini görmek için [Event akışları](event-flows) sayfasına bakın. Event ID'leriniz Adapty'de kullanılanlardan farklıysa, kendi sisteminizdeki ID'leri olduğu gibi bırakın ve [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) sayfasının **Events names** bölümündeki varsayılan Adapty event ID'lerini sizinkilerle değiştirin. Etkinlik ID'si herhangi bir string olabilir; yalnızca webhook işleme sunucunuzdaki etkinlik ID'sinin Adapty Kontrol Paneli'ne girdiğinizle eşleştiğinden emin olun. Etkinleştirilmiş etkinlikler için etkinlik ID'sini boş bırakamazsınız.
5. Ek alanlar ve seçenekler zorunlu değildir; ihtiyacınıza göre kullanın:
| Ayar | Açıklama |
| :--------------------------------- | :----------------------------------------------------------- |
| **Send Trial Price** | Etkinleştirildiğinde, Adapty **Trial Started** olayı için `price_local` ve `price_usd` alanlarına abonelik fiyatını ekler. |
| **Exclude Historical Events** | Kullanıcının Adapty SDK ile uygulamayı yüklemesinden önce gerçekleşen olayları hariç tutmayı seçin. Bu, olayların tekrarlanmasını önler ve doğru raporlamayı sağlar. Örneğin, bir kullanıcı 10 Ocak'ta aylık abonelik başlattıysa ve 6 Mart'ta Adapty SDK ile uygulamayı güncellediyse, Adapty 6 Mart öncesindeki olayları atlayıp sonraki olayları saklar. |
| **Send user attributes** | Dil tercihleri gibi kullanıcıya özgü nitelikleri göndermek için bu seçeneği etkinleştirin. Bu nitelikler `user_attributes` alanında görünecektir. Daha fazla bilgi için [Olay alanları](webhook-event-types-and-fields#event-fields) bölümüne bakın. |
| **Send attribution** | Attribution bilgilerini (örn. AppsFlyer verileri) `attributions` alanına eklemek için bu seçeneği açın. Ayrıntılar için [Attribution verisi](webhook-event-types-and-fields#attributions) bölümüne bakın. |
| **Send Play Store purchase token** | Gerektiğinde satın alma yeniden doğrulaması için gereken Play Store token'ını almak üzere bu seçeneği açın. Etkinleştirildiğinde olaya `play_store_purchase_token` parametresi eklenir. İçeriği hakkında ayrıntılar için [Play Store purchase token](webhook-event-types-and-fields#play-store-purchase-token) bölümüne bakın. |
6. Değişiklikleri onaylamak için **Save** düğmesine tıklamayı unutmayın.
**Save** düğmesine tıkladığınız anda Adapty bir doğrulama isteği gönderir ve sunucunuzun doğrulama yanıtını bekler.
### Gönderilecek olayları seçme ve olay adlarını eşleştirme \{#choose-events-to-send-and-map-event-names\}
Yanındaki geçiş düğmesini etkinleştirerek sunucunuzda almak istediğiniz olayları seçin. Olay adlarınız Adapty'dekilerden farklıysa ve kendi adlarınızı korumak istiyorsanız, [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) sayfasının **Events names** bölümünde varsayılan Adapty olay adlarını kendinizinkilerle değiştirerek eşleştirme yapabilirsiniz.
Olay adı herhangi bir dize olabilir. Etkinleştirilmiş olaylar için alanları boş bırakamazsınız. Adapty olay adını yanlışlıkla sildiyseniz, adı her zaman [Üçüncü taraf entegrasyonlarına gönderilecek olaylar](events) konusundan kopyalayabilirsiniz.
## Webhook olaylarını işleme \{#handle-webhook-events\}
Webhook'lar genellikle olay gerçekleştikten sonra 5 ila 60 saniye içinde iletilir. Ancak iptal olayları, kullanıcı aboneliğini iptal ettikten sonra teslim edilmesi 2 saate kadar sürebilir.
Sunucunuzun yanıt durum kodu 200-404 aralığının dışındaysa Adapty, üstel geri çekilme (exponential backoff) yöntemiyle yeniden deneme yapar. İlk yeniden deneme, ilk başarısızlıktan yaklaşık **1 dakika** sonra gerçekleşir ve her sonraki denemede bu süre iki katına çıkar; toplamda 24 saat boyunca 9 yeniden denemeye kadar uzanır. Webhook'unuzu, yanıt vermeden önce Adapty'den gelen olay gövdesini yalnızca temel düzeyde doğrulayacak şekilde ayarlamanızı öneririz. Sunucunuz olayı işleyemiyorsa ve Adapty'nin yeniden denemesini istemiyorsanız 200-404 aralığında bir durum kodu kullanın. Ayrıca zaman alan görevleri asenkron olarak ele alın ve Adapty'ye hızlıca yanıt verin. Adapty 10 saniye içinde yanıt almazsa denemeyi başarısız sayar ve yeniden dener.
---
# File: test-webhook
---
---
title: "Webhook entegrasyonunu test etme"
description: "Abonelik etkinliği takibini otomatikleştirmek için Adapty'de webhook entegrasyonlarını test edin."
---
Entegrasyonunuzu kurduktan sonra test etme zamanı gelmiş demektir. Hem sandbox hem de production entegrasyonunuzu test edebilirsiniz. Sandbox ile başlamanızı ve üzerinde maksimum doğrulama yapmanızı öneririz:
- Etkinlikler gönderiliyor ve başarıyla iletiliyor.
- Geçmiş etkinlikler, **Trial started** etkinliği için abonelik fiyatı, attribution, kullanıcı öznitelikleri ve Google Play Store satın alma token'ının bir etkinlikle birlikte gönderilip gönderilmeyeceğine ilişkin seçenekleri doğru yapılandırdınız.
- Etkinlik adlarını doğru eşleştirdiniz ve sunucunuz bunları işleyebiliyor.
## Nasıl test edilir \{#how-to-test\}
Bir entegrasyonu test etmeye başlamadan önce aşağıdakileri tamamladığınızdan emin olun:
1. Webhook entegrasyonunu [Webhook entegrasyonunu kurma](set-up-webhook-integration) konusunda anlatıldığı şekilde yapılandırın.
2. [Apple App Store'da uygulama içi satın almaları test etme](test-purchases-in-sandbox) ve [Google Play Store'da uygulama içi satın almaları test etme](testing-on-android) konularında anlatıldığı şekilde ortamı kurun. Test uygulamanızı production ortamında değil, sandbox ortamında derlediğinizden emin olun.
3. Webhook'a göndermeyi seçtiğiniz bir etkinliği tetikleyecek bir satın alma yapın / deneme başlatın / iade isteyin. Örneğin **Subscription started** etkinliğini almak için yeni bir abonelik satın alın.
## Sonucun doğrulanması \{#validation-of-the-result\}
### Başarılı etkinlik gönderme sonucu \{#successful-sending-events-result\}
Entegrasyon başarılı olduğunda, etkinlik entegrasyonun **Last sent events** bölümünde görünür ve **Success** durumunu alır.
### Başarısız etkinlik gönderme sonucu \{#unsuccessful-sending-events-result\}
| Sorun | Çözüm |
|-----|--------|
| Etkinlik görünmedi | Satın alma gerçekleşmediğinden etkinlik oluşturulmadı. Çözüm için [Test satın almalarında sorun giderme](troubleshooting-test-purchases) konusuna bakın. |
| Etkinlik göründü ancak **Sending failed** durumunda | Teslim edilebilirliği HTTP durum koduna göre belirliyoruz; **200-399 aralığı dışındaki** her şeyi başarısız olarak kabul ediyoruz.
Sorun hakkında daha fazla bilgi edinmek için aşağıda gösterildiği gibi başarısız etkinliğinizin **Sending failed** durumunun üzerine gelin.
|
---
# File: handle-integration-errors
---
---
title: "Entegrasyon hatalarını yönetme"
description: "Entegrasyon hatalarını yönetme"
---
Attribution, mesajlaşma veya analitik entegrasyonlarını kullanırken bazı yaygın hatalarla karşılaşabilirsiniz. Sorun giderme durumları için bu kılavuza bakın.
## Veri tutarsızlığı \{#data-discrepancy\}
**Neden**: Bu, tüm kullanıcılarınızın Adapty SDK'sına sahip uygulama sürümünü kullanmamasından kaynaklanabilir.
**Çözüm**: Veri tutarlılığını sağlamak için kullanıcılarınızı Adapty SDK'sını içeren uygulama sürümüne güncellemeye zorlayabilirsiniz.
## Ağ hataları \{#network-errors\}
**Neden**: Büyük olasılıkla Adapty sunucusu ile entegrasyon sunucusu arasında internet bağlantısı kesilmiştir.
**Çözüm**: Bu sorunlar genellikle uzun sürmez ve yalnızca az sayıda etkinliği etkiler.
## Entegrasyon sunucusu etkinliği işleyemedi \{#integration-server-failed-to-process-the-event\}
**Neden**: Entegrasyon hatalı yapılandırılmış.
**Çözüm**: Dokümantasyonumuzdaki ilgili entegrasyon makalesine bakın. Adapty kontrol panelinde, üçüncü taraf araç tarafında ve uygulama kodunuzda tüm kurulum adımlarını tamamladığınızdan emin olun.
## Eksik entegrasyon verisi \{#missing-integration-data\}
**Neden**: Profilde entegrasyona özgü bir ID eksik. Bu, entegrasyonun uygulama kodunda düzgün yapılandırılmamasından kaynaklanabilir.
**Çözüm**: Dokümantasyonumuzdaki ilgili entegrasyon makalesine bakın. Kod parçacıklarındaki yöntemleri uygulama kodunuza eklediğinizden ve bu yöntemlerin kullanıcı profillerinizle gerçekten etkileşime girdiğinden emin olun.
## Eksik entegrasyon kimlik bilgileri \{#missing-integration-credentials\}
**Neden**: Bazı entegrasyon kimlik bilgileri eksik veya hatalı.
**Çözüm**: Adapty kontrol panelinde ilgili entegrasyonun tüm kimlik bilgilerini kontrol edin. Sorun, sürüm veya ortam uyumsuzluğundan kaynaklanıyor olabilir.
## Etkinliğin süresi doldu \{#the-event-has-expired\}
**Neden**: Entegrasyon ayarlarında **Exclude historical events** seçeneği etkinleştirilmiş ve etkinliğin oluşturulma tarihi, sistemimizdeki profil oluşturma tarihinden önce.
Bu durum, yıllar önce başlayan bir işlem zinciri, yakın zamanda oluşturulmuş bir profil için makbuz doğrulaması aracılığıyla Adapty'ye geldiğinde yaşanabilir.
**Çözüm**: Yeni etkinliklerde bunun yaşanmadığından emin olun. Geçmiş etkinlikleri entegrasyona göndermek istiyorsanız **Exclude historical events** seçeneğini devre dışı bırakın.
## Devre dışı/desteklenmeyen etkinlik türü \{#disabledunsupported-event-type\}
**Neden**: Etkinlik bu entegrasyon tarafından desteklenmiyor ya da entegrasyonu kurarken devre dışı bırakmış olabilirsiniz. Örneğin, `access_level_updated` etkinlikleri çoğu entegrasyon tarafından desteklenmez.
**Çözüm**: Entegrasyon dokümantasyonundan bu etkinlik türünün desteklenip desteklenmediğini kontrol edin. Destekleniyorsa Adapty kontrol panelinde entegrasyon ayarlarında bu etkinlik türünün etkinleştirildiğinden emin olun.
---
# File: manage-adapty-with-ai
---
---
title: "Adapty'yi AI ajanları ve kodlama araçlarıyla yönetin"
description: "Adapty'yi AI ile kullanmanın tüm yolları — bir kodlama ajanıyla SDK'yı entegre edin, bir LLM ile analitik verilerini çekin ve Adapty dokümanlarını AI aracınıza besleyin."
---
Adapty, AI kodlama araçları ve ajanlarıyla birlikte çalışır. SDK'yı entegre etmek, analitik verileriniz hakkında soru sormak veya editörünüzden çıkmadan Adapty dokümanlarına bakmak için bunları kullanabilirsiniz. Bu sayfa mevcut seçenekleri ve her aracın kime hitap ettiğini listeler.
## Adapty SDK'yı AI ile entegre edin \{#integrate-the-adapty-sdk-with-ai\}
Adapty SDK'yı bir AI kodlama aracıyla uygulamanıza eklemenin iki yolu var. Her ikisi de Cursor, Claude ve diğer AI asistanlarıyla çalışır.
### Skill tabanlı entegrasyon \{#skill-based-integration\}
Adapty SDK entegrasyon skill'i, tek bir komutla tüm entegrasyonu AI kodlama aracınızdan çalıştırır. Rehberli ve otomatik bir kurulum istediğinizde kullanın.
Platformunuzu seçin: [iOS](adapty-sdk-integration-skill) · [Android](adapty-sdk-integration-skill-android) · [React Native](adapty-sdk-integration-skill-react-native) · [Flutter](adapty-sdk-integration-skill-flutter) · [Unity](adapty-sdk-integration-skill-unity) · [Kotlin Multiplatform](adapty-sdk-integration-skill-kmp) · [Capacitor](adapty-sdk-integration-skill-capacitor)
### Adım adım entegrasyon \{#step-by-step-integration\}
AI aracınızı entegrasyonun her aşamasında yönlendirin ve doğru dokümanları sırayla besleyin. Her adımı ilerledikçe gözden geçirmek istediğinizde kullanın.
Platformunuzu seçin: [iOS](adapty-cursor) · [Android](adapty-cursor-android) · [React Native](adapty-cursor-react-native) · [Flutter](adapty-cursor-flutter) · [Unity](adapty-cursor-unity) · [Kotlin Multiplatform](adapty-cursor-kmp) · [Capacitor](adapty-cursor-capacitor)
## Adapty'yi komut satırından yönetin \{#manage-adapty-from-the-command-line\}
[Adapty Developer CLI](developer-cli-quickstart), Adapty varlıklarınızı — uygulamalar, access level'lar, ürünler, paywall'lar ve placement'lar — kontrol panelini açmadan terminalden yönetmenizi sağlar. Komut satırı aracı olduğu için AI kodlama ajanınız onu doğrudan çalıştırabilir.
## Verileriniz hakkında soru sorun \{#ask-about-your-data\}
Gelirleriniz, elde tutma oranlarınız, LTV ve daha fazlası gibi metriklerinizi doğal dilde sorgulamak için bir AI kodlama ajanını Export Analytics API'sine yönlendirin. MCP sunucusuna gerek yok.
[Analitik verileriniz hakkında AI'a sorun](export-analytics-with-ai)
## AI aracınıza Adapty dokümanlarını verin \{#give-your-ai-tool-the-adapty-docs\}
### Düz metin dokümanlar \{#plain-text-docs\}
Her Adapty dokümanı Markdown olarak mevcuttur — sayfa URL'sine `.md` ekleyin veya başlığın altındaki **Copy for LLM** seçeneğine tıklayın. Daha geniş bağlam için aracınıza [`llms.txt`](https://adapty.io/docs/tr/llms.txt) dizinini veya [`ios-llms.txt`](https://adapty.io/docs/tr/ios-llms.txt) gibi platforma özgü bir alt kümeyi verin.
### Context7 \{#context7\}
[Context7](https://context7.com/adaptyteam/adapty-docs), Adapty dokümanlarını AI aracınıza sunan bir MCP sunucusudur; ancak yalnızca kod parçacıklarını dizinler — tam metni değil. Hızlı kod örnekleri için kullanın; kapsamlı rehberlik için yukarıdaki düz metin dokümanları aracınıza verin. Context7, Cursor, Claude Code, Windsurf ve diğer MCP uyumlu araçlarla çalışır.
---
# File: export-analytics-with-ai
---
---
title: "Analitik verileriniz hakkında YZ'ye sorun"
description: "Export Analytics API'yi kullanarak düz dille bir YZ kodlama ajanı aracılığıyla Adapty analizlerinizi sorgulayın."
---
Adapty analitiğiniz hakkında düz dille bir yapay zeka kodlama ajanına soru sorun — gelir, dönüşümler, elde tutma, LTV — ve sayıları sizin için çeksin. [Export Analytics API](https://adapty.io/docs/tr/export-analytics-api.md)'ye API çağrısı yapabilen bir araç yönlendirin; metriklerinizi isteğe bağlı olarak sorgulasın.
## Ne hakkında soru sorabilirsiniz \{#what-you-can-ask-about\}
Export Analytics API, Adapty kontrol paneli grafiklerinde gördüğünüz metriklerin aynısını döndürür. Her metriğin kendine ait bir işlemi vardır:
| Metrik | Kapsadığı alan | İşlem |
| --- | --- | --- |
| Gelir, MRR, ARR, ARPU | Dönem, ülke veya kampanyaya göre gruplandırılmış, zaman içinde kazanılan para | [retrieveAnalyticsData](https://adapty.io/docs/tr/api-export-analytics/operations/retrieveAnalyticsData.md) |
| Kohort tutma | Belirli bir kohorttan abonelerin ne kadar süre ödeme yaptığı | [retrieveCohortData](https://adapty.io/docs/tr/api-export-analytics/operations/retrieveCohortData.md) |
| Dönüşüm oranları | Kaç kullanıcının bir adımdan veya kanaldan bir sonrakine geçtiği | [retrieveConversionData](https://adapty.io/docs/tr/api-export-analytics/operations/retrieveConversionData.md) |
| Kayıp ve huni | Kullanıcıların nerede ayrıldığı ve abonelikten ne kadar hızlı çıktığı | [retrieveFunnelData](https://adapty.io/docs/tr/api-export-analytics/operations/retrieveFunnelData.md) |
| Yaşam boyu değer (LTV) | Zaman içinde kullanıcı segmenti başına ortalama gelir | [retrieveLTVData](https://adapty.io/docs/tr/api-export-analytics/operations/retrieveLTVData.md) |
| Elde tutma | Belirli sayıda gün sonra hâlâ aktif olan kullanıcıların oranı | [retrieveRetentionData](https://adapty.io/docs/tr/api-export-analytics/operations/retrieveRetentionData.md) |
API referansının tam parametre ve filtre listesi için [API referansına](https://adapty.io/docs/tr/api-export-analytics.md) bakın.
## Başlamadan önce \{#before-you-start\}
Üç şeye ihtiyacınız var:
- **Veri içeren bir Adapty hesabı**: API, kontrol panelinizin grafiklerindeki metriklerin aynısını döndürür; bu nedenle uygulamanızın zaten analitik verileri toplaması gerekir.
- **Gizli bir API anahtarı**: [App settings → General](https://app.adapty.io/settings/general) sayfasındaki **Secret key** alanında bulabilirsiniz. Anahtarlar uygulamaya özgüdür; her uygulama için ayrı bir anahtar kullanın. Ajanınızın sohbete yapıştırmanıza gerek kalmadan okuyabilmesi için anahtarı bir ortam değişkeninde saklayın (örneğin `ADAPTY_SECRET_KEY`).
- **API çağrısı yapabilen bir yapay zeka aracı**: Örneğin Claude Code, Cursor veya fetch aracına sahip Claude Desktop. claude.ai veya ChatGPT gibi sıradan sohbet araçları API'yi doğrudan çağıramaz.
## Aracınıza API Spesifikasyonunu Tanıtın \{#give-your-agent-the-api-spec\}
[OpenAPI spesifikasyonu](https://adapty.io/docs/tr/api-specs/export-analytics-api.yaml), her endpoint'i, kimlik doğrulama başlığını, istek gövdesini ve örnek yanıtları açıklar. Aracınız bu spesifikasyona sahip olduğunda, siz hiç kod yazmadan doğru istekleri oluşturabilir.
Spesifikasyonu URL ile aracınıza tanıtın:
- **URL'yi yapıştırın**: Aracınız URL'leri getirebiliyorsa, `https://adapty.io/docs/tr/api-specs/export-analytics-api.yaml` adresini verin ve spec'i okumasını isteyin.
- **Bir fetch aracı kullanın**: Aracınızda URL'leri getiren bir araç varsa (örneğin, bir MCP fetch sunucusu), aynı URL'yi gösterin.
Spec, temel URL'yi `https://api-admin.adapty.io` olarak ayarlar; dolayısıyla anahtarınız ortamda olduğunda aracınızın ihtiyacı olan her şey hazır olur.
## Verileriniz Hakkında Soru Sorun \{#ask-about-your-data\}
Spec yüklenmiş ve anahtarınız bir ortam değişkeninde tanımlıyken, istediğiniz metriği düz dille anlatın.
Örnek komutlar:
```
What was my MRR at the end of each month this year, and how does it compare to last year?
Show my trial-to-paid conversion rate for the last 90 days, broken down by product.
Which countries drive the most revenue from my yearly subscription? Top 10.
How is week-1 retention trending for subscribers who started in the last 6 months?
What's the refund rate on my annual plan since launch, by month?
Compare LTV for paid-campaign users vs. organic over the last year, and export it as CSV.
```
Agent, isteğinizi doğru işleme eşler, anahtarı ortam değişkeninden okur ve veriyi döndürür. Yanıtlar varsayılan olarak JSON formatındadır. Elektronik tabloya hazır bir dosya istediğinizde CSV isteyin — agent, istek gövdesinde `format` değerini `csv` olarak ayarlar.
:::warning
Gizli anahtarınızı ortam değişkeninde saklayın — sohbete yapıştırmayın ya da bir kurallar dosyasına kaydetmeyin. Anahtarlar uygulamaya özel olduğundan, sızma durumunda **Settings → General** bölümünden anahtarınızı yenileyin. Bkz. [API anahtarlarını yenileme](https://adapty.io/docs/tr/export-analytics-api-authorization.md).
:::
## Tekrarlayan kullanım için bir kez ayarlayın \{#set-up-once-for-repeated-use\}
Her oturumda tekrar ayarlama yapmamak için spec ve key'i ajanınızın yeniden kullanabileceği bir yere kaydedin:
- **Spec linkini kaydedin**: Spec URL'sini ajanınızın kurallar veya bellek dosyasına ekleyin (örneğin bir `CLAUDE.md` ya da Cursor kurallar dosyası), böylece her oturumda otomatik yüklenir.
- **Anahtarı ortam değişkenlerinizde saklayın**: `ADAPTY_SECRET_KEY`'i shell profilinizde veya aracın gizli deposunda tutun, böylece bir daha yapıştırmanıza gerek kalmaz.
- **Yeniden kullanılabilir prompt'ları kaydedin veya özel bir beceri oluşturun**: Sık kullandığınız soruları kayıtlı prompt olarak tutun ya da bunları özel bir beceri veya slash komutuyla sarmalayın; böylece ajanınız raporları isteğe bağlı çalıştırır.
## Sınırlamalar \{#limits\}
Bu kısıtlamaları aklınızda bulundurun:
- **Hız sınırı**: API, API anahtarı başına saniyede 2 istek yapılmasına izin verir. Bu sınırı aşmanız durumunda `429 Too Many Requests` hatası döner. Aracınıza `429` alındığında bekleyip tekrar denemesini söyleyin.
- **Uygulamaya özel anahtarlar**: Her anahtar yalnızca bir uygulama için çalışır. Birden fazla uygulamadan veri çekmek için her biri için ilgili anahtarı sağlayın.
- **Çıktı formatı**: Yanıtlar varsayılan olarak JSON formatındadır. CSV dışa aktarımı için istek gövdesinde `format` değerini `csv` olarak ayarlayın.
Kimlik doğrulama ve istek kurallarının tamamı için [Yetkilendirme ve istek formatı](https://adapty.io/docs/tr/export-analytics-api-authorization.md) sayfasına bakın.
---
# File: handle-webhooks-with-ai
---
---
title: "Adapty abonelik etkinliklerini webhook'larla yönetin"
description: "Adapty abonelik etkinliklerini sunucunuzda webhook'larla alın ve yönetin — uç nokta kurulumu, kimlik doğrulama, yük ve test tek sayfada."
---
Webhook'lar, sunucunuzun Adapty abonelik olaylarını gerçek zamanlı olarak almasını sağlar — satın almalar, yenilemeler, iptaller, ödeme sorunları ve iadeler — böylece erişim izni verebilir, backend'inizi senkronize edebilir veya iş akışlarını tetikleyebilirsiniz. Bu kılavuz, uç noktadan doğrulanmış ve test edilmiş bir entegrasyona kadar tüm süreci tek sayfada anlatır ve bir AI kodlama ajanının sizin teknoloji yığınınız için handler'ı nasıl yazacağını gösterir.
:::tip
Bir AI kodlama ajanı mı kullanıyorsunuz? Başlığın altındaki **Copy for LLM** butonuna tıklayın ve bu sayfanın tamamını ajanınıza yapıştırın — kurulum, payload ve handler mantığı için ihtiyaç duyduğu her şey orada.
:::
## Adapty webhook'ları nasıl çalışır \{#how-adapty-webhooks-work\}
- **Tek yönlü ve gerçek zamanlı**: Adapty, bir olay gerçekleştiğinde sunucunuza HTTP `POST` isteği gönderir — herhangi bir polling gerekmez.
- **İki tür istek**: Entegrasyonu kaydettiğinizde gönderilen tek seferlik bir doğrulama isteği ve süregelen abonelik olayları.
- **Ortam başına bir URL**: Production ve sandbox için ayrı bir endpoint yapılandırırsınız.
- **Her isteği onaylamanız gerekir**: Hızlıca `2xx` durum koduyla yanıt verin; başarısız olması durumunda Adapty isteği yeniden dener.
## Uç noktanızı oluşturun \{#build-your-endpoint\}
İki istek türünü işleyen, herkese açık bir HTTPS uç noktası oluşturun:
- **Doğrulama isteği**: Entegrasyonu kaydettiğinizde bir kez gönderilir. JSON gövdesi boştur (`{}`). `2xx` durum kodu ve bir JSON gövdesiyle yanıt verin.
- **Abonelik olayları**: Olayı gövdede taşıyan süregelen `POST` istekleri. 10 saniye içinde `200` ile yanıt verin, ağır işlemleri ise asenkron olarak gerçekleştirin.
Gizli bir dize seçin ve bunu bir ortam değişkeni olarak saklayın (örneğin, `ADAPTY_WEBHOOK_SECRET`). Her istekte, `Authorization` başlığının bu değerle eşleştiğini doğrulayın; eşleşmiyorsa isteği reddedin — aynı gizli diziyi bir sonraki adımda kontrol paneline gireceksiniz.
```javascript title="webhook.js"
const app = express();
app.use(express.json());
const WEBHOOK_SECRET = process.env.ADAPTY_WEBHOOK_SECRET;
app.post("/adapty/webhook", (req, res) => {
// 1. Verify the shared secret Adapty echoes back.
if (req.get("Authorization") !== WEBHOOK_SECRET) {
return res.sendStatus(401);
}
// 2. Acknowledge fast, then process asynchronously.
res.status(200).json({});
// 3. The verification request has an empty body — nothing to handle.
const event = req.body;
if (!event.event_type) return;
switch (event.event_type) {
case "subscription_started":
case "subscription_renewed":
case "trial_converted":
// Grant or extend access.
break;
case "subscription_expired":
case "subscription_refunded":
// Revoke access.
break;
default:
break;
}
});
app.listen(3000);
```
Entegrasyonu yapılandırmadan önce endpoint'i herkese açık bir HTTPS URL'sine deploy edin — Adapty, kaydettiğiniz anda doğrulama isteğini gönderir.
### Temel olaylar ve payload \{#key-events-and-the-payload\}
Her olay aynı zarfı paylaşır. Alanlar olay türüne, mağazaya ve etkinleştirdiğiniz seçeneklere göre değişir. İşte kısaltılmış bir `subscription_started` olayı:
```json title="Example event"
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": "UserIdInYourSystem",
"event_type": "subscription_started",
"event_datetime": "2024-11-15T10:45:36.181000+0000",
"event_properties": {
"store": "play_store",
"currency": "USD",
"price_usd": 4.99,
"vendor_product_id": "onemonth_no_trial",
"transaction_id": "0000000000000000",
"original_transaction_id": "0000000000000000",
"subscription_expires_at": "2024-12-15T10:45:36.181000+0000",
"profile_event_id": "00000000-0000-0000-0000-000000000000"
},
"event_api_version": 1
}
```
En sık karşılaşacağınız olaylar:
| Etkinlik türü | Ne zaman tetiklenir |
| --- | --- |
| `subscription_started` | Bir kullanıcı ücretli abonelik başlattığında |
| `subscription_renewed` | Bir abonelik yenilenip başarıyla faturalandığında |
| `subscription_renewal_cancelled` | Bir kullanıcı otomatik yenilemeyi kapattığında (erişim sona erme tarihine kadar devam eder) |
| `subscription_expired` | Yenilenmeyen bir abonelik sona erip erişim bittiğinde |
| `trial_started` | Bir kullanıcı ücretsiz deneme başlattığında |
| `trial_converted` | Deneme süresi ücretli aboneliğe dönüştüğünde |
| `billing_issue_detected` | Yenileme ödemesi başarısız olduğunda |
| `subscription_refunded` | Bir abonelik satın alımı iade edildiğinde |
Tam etkinlik listesi ve her alan için bkz. [Webhook etkinlik türleri ve alanları](https://adapty.io/docs/tr/webhook-event-types-and-fields.md).
:::warning
Etkinlikleri `event_datetime` alanına göre sıralamayın — bu, etkinliğin iş zamanıdır; etkinlikler sıra dışı gelebilir ya da aynı zaman damgasını paylaşabilir. Kendi alım zamanınıza göre sıralayın ve `profile_event_id` ya da işlem kimliklerini kullanarak tekrar kayıtları temizleyin.
:::
## Adapty'de webhook'u yapılandırma \{#configure-the-webhook-in-adapty\}
1. Adapty Kontrol Paneli'nde [Integrations → Webhook](https://app.adapty.io/integrations/customwebhook) bölümünü açın.
2. Entegrasyonu etkinleştirin.
3. **Production endpoint URL** alanına dağıttığınız endpoint'in HTTPS URL'sini girin.
4. **Authorization header value for production endpoint** alanına, endpoint'inizin doğruladığı gizli anahtarı girin. Adapty bu değeri her istekte `Authorization` başlığıyla geri gönderir. Zorunlu değildir ancak kesinlikle önerilir.
5. Önce sandbox ortamında test etmek istiyorsanız **Sandbox endpoint URL** ve ilgili **Authorization header value** alanlarını da doldurun.
6. **Save** düğmesine tıklayın. Adapty hemen endpoint'inize doğrulama isteği gönderir; endpoint'iniz kurulumu tamamlamak için `2xx` yanıtı döner.
Hangi etkinliklerin gönderileceğini seçmek, etkinlik adlarını eşleştirmek veya isteğe bağlı alanları (deneme fiyatı, geçmiş etkinlikler, attribution, kullanıcı nitelikleri, Play Store token) etkinleştirmek için bkz. [Webhook entegrasyonunu ayarlama](https://adapty.io/docs/tr/set-up-webhook-integration.md).
## AI kodlama aracınızla oluşturun \{#build-it-with-your-ai-coding-agent\}
AI kodlama aracınıza bu kılavuzu ve referans dokümanları Markdown olarak verin (herhangi bir sayfa URL'sine `.md` ekleyin), kullandığınız teknolojiyi belirtin ve handler'ı oluşturmasını sağlayın:
- [Webhook olay türleri ve alanları](https://adapty.io/docs/tr/webhook-event-types-and-fields.md)
- [Webhook entegrasyonunu kurma](https://adapty.io/docs/tr/set-up-webhook-integration.md)
Örnek prompt:
```
Read these Adapty webhook docs, then write a webhook handler for my Express app:
verify the Authorization header against ADAPTY_WEBHOOK_SECRET, answer the
verification request, acknowledge events with 200, and grant or revoke access
based on event_type.
```
The agent writes the handler code, but it can't deploy your endpoint or configure the dashboard — host the endpoint yourself and set the URL and secret in **Integrations → Webhook**.
## Webhook'unuzu test edin \{#test-your-webhook\}
Üretime geçmeden önce sandbox ortamında test edin:
1. Yukarıda açıklandığı gibi sandbox endpoint'ini ve secret'ı ayarlayın.
2. Sandbox uygulamanızda bir satın alma yapın, deneme başlatın veya olay tetiklemek için iade isteyin.
3. Entegrasyonun **Last sent events** bölümünü açın. Başarıyla iletilen bir olay **Success** durumunu gösterir.
Bir olay **Sending failed** gösteriyorsa, sunucunuz 200–399 aralığı dışında bir durum kodu döndürmüş demektir — ayrıntılar için durumun üzerine gelin. Tam test adımları için bkz. [Webhook entegrasyonunu test etme](https://adapty.io/docs/tr/test-webhook.md).
## Sınırlamalar \{#limits\}
- **10 saniye içinde yanıt verin**: Adapty zamanında yanıt alamazsa denemeyi başarısız sayar ve yeniden dener.
- **Yeniden denemeler**: Durum kodunuz 200–404 aralığının dışındaysa Adapty üstel geri çekilme ile yeniden dener — 24 saat içinde en fazla 9 deneme.
- **İptal gecikmesi**: İptal olaylarının ulaşması 2 saate kadar sürebilir.
- **Ortam başına tek URL**: Olayları birden fazla servise iletmek için webhook'u kendi backend'inize yönlendirin ve oradan dağıtın.
---
# File: server-side-api-with-ai
---
---
title: "Backend'inizden abonelik erişimini kontrol edin ve izin verin"
description: "Bir kullanıcının aktif bir aboneliğe sahip olup olmadığını kontrol etmek ve erişimi manuel olarak vermek için Adapty sunucu tarafı API'sini kullanın; bir AI kodlama ajanının yardımıyla."
---
Arka ucunuzdan, bir kullanıcının aktif aboneliğinin olup olmadığını kontrol etmek ve erişimi manuel olarak vermek için Adapty sunucu tarafı API'sini kullanın. Bu kılavuz en yaygın iki çağrıyı — `getProfile` ve `grantAccessLevel` — ele alır ve bir AI kodlama ajanının sizin için entegrasyonu nasıl yazabileceğini gösterir.
:::tip
Bir AI kodlama ajanı mı kullanıyorsunuz? Başlığın altındaki **Copy for LLM** seçeneğine tıklayın ve bu sayfanın tamamını ajanınıza yapıştırın — ihtiyaç duyduğu çağrılar, alanlar ve dikkat edilmesi gereken noktalar orada mevcut.
:::
## Başlamadan önce \{#before-you-start\}
- **Gizli API anahtarı**: [App settings → General](https://app.adapty.io/settings/general) sayfasında, **Secret key** alanında bulabilirsiniz. Anahtarlar uygulamaya özeldir. Bir ortam değişkeninde saklayın (örneğin `ADAPTY_SECRET_KEY`) ve `Authorization: Api-Key {key}` olarak gönderin.
- **Temel URL**: Tüm istekler `https://api.adapty.io` adresine gider.
- **Kullanıcıyı tanımlamanın bir yolu**: `adapty-customer-user-id` (kendi kullanıcı kimliğiniz — yalnızca uygulamada kullanıcıları tanımlıyorsanız çalışır) veya `adapty-profile-id` (Adapty profil kimliği) gönderin. İkisi birbirinin yerine kullanılabilir; birini seçin.
## Abonelik durumunu kontrol etme \{#check-a-subscription\}
Durumu kontrol etmek için `GET` yöntemiyle `getProfile` çağrısı yapın ve kullanıcı tanımlayıcısını header olarak geçirin — istek gövdesi gerekmez.
```javascript title="check-access.js"
const res = await fetch("https://api.adapty.io/api/v2/server-side-api/profile/", {
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
},
});
const { data } = await res.json();
function hasActiveAccess(profile, accessLevelId = "premium") {
const level = profile.access_levels?.find(a => a.access_level_id === accessLevelId);
if (!level) return false;
if (level.is_in_grace_period) return true;
if (!level.expires_at) return true; // lifetime / non-expiring
return new Date(level.expires_at) > new Date(); // not expired yet
}
if (hasActiveAccess(data)) {
// unlock premium features
}
```
SDK profilinin aksine, sunucu tarafı yanıtında **`is_active` alanı bulunmaz**. Durumu `access_levels[].expires_at` alanından kendiniz türetmeniz gerekir: `null` değeri süresiz erişim anlamına gelir, gelecekteki bir tarih aktif olduğunu, geçmişteki bir tarih ise sona erdiğini gösterir. `is_in_grace_period` durumunu hâlâ aktif olarak değerlendirin. Profil ve access level alanlarının tamamı için [getProfile](https://adapty.io/docs/tr/api-adapty/operations/getProfile.md) sayfasına bakın.
## Erişimi manuel olarak ver \{#grant-access-manually\}
Satın alma olmaksızın ücretli özelliklerin kilidini açmak için — promosyon kodları, yatırımcı veya beta erişimi, destek talepleri — `grantAccessLevel` metodunu `POST` ile çağırın.
```javascript title="grant-access.js"
await fetch("https://api.adapty.io/api/v2/server-side-api/purchase/profile/grant/access-level/", {
method: "POST",
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
"Content-Type": "application/json",
},
body: JSON.stringify({ access_level_id: "premium" }), // geçici erişim için "expires_at" ekleyin
});
```
- **Access level'ın kontrol panelinizde zaten mevcut olması gerekir** (**Access levels**) — `access_level_id` yeni bir isim değil, mevcut access level'ın tanımlayıcısıdır.
- **Manuel olarak verilen erişimler analitikte görünmez.** Yalnızca webhook entegrasyonunuza ve Event Feed'e iletilir; bu nedenle gelir ve dönüşüm grafikleri bunları yansıtmaz.
İstek ve yanıt ayrıntıları için [grantAccessLevel](https://adapty.io/docs/tr/api-adapty/operations/grantAccessLevel.md) sayfasına bakın.
## AI kodlama ajanınızla geliştirin \{#build-it-with-your-ai-coding-agent\}
AI kodlama ajanınıza bu kılavuzu ve API spesifikasyonunu Markdown olarak verin (herhangi bir sayfa URL'sine `.md` ekleyin), kullandığınız stack'i belirtin ve çağrıları yazdırmasına izin verin:
- [OpenAPI spec](https://adapty.io/docs/tr/api-specs/adapty-api.yaml)
- [getProfile](https://adapty.io/docs/tr/api-adapty/operations/getProfile.md)
- [grantAccessLevel](https://adapty.io/docs/tr/api-adapty/operations/grantAccessLevel.md)
Örnek prompt:
```
Using the Adapty server-side API spec, write backend functions to check whether a
user has an active "premium" access level (GET /profile/, derive status from
expires_at — there's no is_active field) and to grant it (grantAccessLevel).
Authenticate with ADAPTY_SECRET_KEY and identify users by adapty-customer-user-id.
```
The agent writes the code, but it can't run your backend or set your keys — you provide the secret key and the user identifiers.
## Sınırlar \{#limits\}
- **Hız sınırı**: Uygulama başına dakikada en fazla 40.000 istek.
- **Uygulamaya özel anahtarlar**: Her anahtar yalnızca bir uygulama için geçerlidir; her uygulama için doğru anahtarı kullanın.
- **Bir tanımlayıcı zorunludur**: Her istek `adapty-customer-user-id` veya `adapty-profile-id` içermelidir.
---
# File: test-purchases-in-sandbox
---
---
title: "Sandbox testi"
description: "İşlemlerin sorunsuz gerçekleştiğinden emin olmak için sandbox ortamında satın almaları test edin."
---
Adapty Kontrol Paneli'nde ve mobil uygulamanızda her şeyi yapılandırdıktan sonra uygulama içi satın alma testlerini yapmaya hazırsınız.
**Not:** Test araçlarının hiçbiri, kullanıcılardan ürün satın alma testi sırasında ücret almaz. App Store, test ortamlarında gerçekleştirilen satın alma veya iade işlemleri için e-posta göndermez.
:::note
**Sandbox işlemleri tüm analitik grafiklerden hariç tutulur.** Yine de bireysel profil sayfalarında ve etkinlik akışında görünürler.
:::
:::info
Uygulama içi satın alma testine devam etmek için şunlardan emin olun:
- Mağaza entegrasyonu, ürün ekleme ve Adapty SDK entegrasyonuna ilişkin [hızlı başlangıç](quickstart) kılavuzlarını tamamladınız.
- Ürününüz App Store Connect'te [**Ready to submit**](InvalidProductIdentifiers#step-2-check-products) olarak işaretlenmiş.
:::
## Sandbox testi \{#sandbox-testing\}
2. Test kullanıcısının bilgilerini girin. Test etmeyi planladığınız **Country or Region** seçeneğini mutlaka belirtin; bu seçenek, ilgili bölgedeki ürün erişilebilirliğini ve satın alma para birimini etkiler.
:::tip
- Gmail veya iCloud kullanıyorsanız, mevcut e-posta adresinizi [artı işareti alt adresleme](https://www.wikihow.com/Use-Plus-Addressing-in-Gmail) yöntemiyle yeniden kullanabilirsiniz.
- Var olmayan rastgele bir e-posta adresi de kullanabilirsiniz; ancak test cihazında oturum açarken iki faktörlü kimlik doğrulamayı (2FA) reddettiğinizden emin olun.
:::
3. **Create**'e tıklayın.
### Adım 2. Geliştirici modunu etkinleştir \{#step-2-enable-the-developer-mode\}
:::note
Test cihazınızda Geliştirici modu **zaten etkinse** veya **Mac cihazınız yoksa** bu adımı atlayın.
:::
Xcode yüklü bir Mac ve test cihazı kablosuna ihtiyacınız olacak:
1. Mac'inizde Xcode'u açın. TestFlight ile uygulama içi satın almaları test edecekseniz yalnızca Xcode'un yüklü olması yeterlidir; uygulamanın orada açık olmasına gerek yoktur.
2. Test cihazınızı kablo ile Mac'e bağlayın.
3. Test cihazınızda **Settings > Privacy & Security > Developer Mode** yoluna gidin ve **Developer Mode**'u açın.
### Adım 3. Uygulamayı TestFlight'tan indirin \{#step-3-download-the-app-from-testflight\}
:::info
Bu adım yalnızca TestFlight ile test yapıyorsanız geçerlidir. Uygulamayı Xcode'da derliyorsanız bu adımı atlayın.
:::
Uygulamanızı TestFlight'a gönderme hakkında ayrıntılı bilgi için [Apple belgelerine](https://developer.apple.com/documentation/StoreKit/testing-in-app-purchases-with-sandbox#Prepare-for-sandbox-testing) bakın.
TestFlight uygulamasını indirmeden önce test cihazınızda üretim Apple Hesabınızla oturum açtığınızdan emin olun. Ardından test etmek istediğiniz uygulamayı TestFlight'tan indirin.
:::danger
Uygulamayı indirdikten sonra açmayın. Doğrudan sonraki adımlara geçin.
Yanlışlıkla açtıysanız, test cihazınızdan kaldırıp tekrar indirin. Aksi takdirde satın alma geçmişiniz temiz olmayabilir ve uygulama içi satın alma testleri hatalara yol açabilir.
:::
### Adım 4. Sandbox test hesabına geçin \{#step-4-switch-to-sandbox-test-account\}
4. **Sandbox Apple Account** bölümüne gidin ve **Sign In** düğmesine dokunun.
5. Sandbox Apple Account bilgilerinizle giriş yapın.
### Adım 5. Satın alma geçmişini temizle \{#step-5-clear-purchase-history\}
Yeni bir Sandbox test hesabı oluşturup bu hesaba geçiş yaptıysanız, bu adımı atlayabilirsiniz; çünkü bu adım yalnızca aynı Sandbox test hesabıyla tekrarlanan testler için geçerlidir.
1. Test cihazınızda **Settings > Developer > Sandbox Apple Account** bölümüne gidin.
2. Açılan menüden **Manage** seçeneğini belirleyin.
3. **Account Settings** bölümüne gidip **Clear Purchase History** öğesine dokunun.
:::danger
Bu adım, aynı Sandbox test hesabını kullanarak her test tekrarladığınızda gereklidir. Bu durumda, satın alma geçmişi önbelleğini test cihazında temizlemek için [Sandbox test hesabınızdan çıkış yapmanız](#step-4-switch-to-sandbox-test-account) ve ardından tekrar giriş yapmanız gerekecektir.
:::
### Adım 6. Xcode'da derleyin ve çalıştırın \{#step-6-build-in-xcode-and-run\}
:::info
Bu adım yalnızca Xcode derlemesiyle test ediyorsanız geçerlidir. TestFlight kullanıyorsanız bu adımı atlayın.
:::
1. Test cihazınızı Mac'inize bağlayın.
2. Xcode'u açın.
3. Uygulamayı bağlı cihazda derleyip çalıştırmak için araç çubuğundaki **Run** düğmesine tıklayın ya da **Product > Run** yolunu izleyin.
Derleme başarılı olursa Xcode, uygulamayı cihazınızda başlatır ve hata ayıklama alanında bir hata ayıklama oturumu açar.
Uygulamanız artık cihazda test edilmeye hazır.
### Adım 7. Test satın alması yapın \{#step-7-make-test-purchase\}
Uygulamayı açın ve bir paywall üzerinden test satın alması gerçekleştirin.
İşlem tamamlandıktan sonra, sonuçlarınızı kontrol etmek için [test satın almalarını doğrulama](validate-test-purchases) makalesine gidin.
### Adım 8. Test etmeye devam edin \{#step-8-keep-testing\}
Artık test ortamınız tamamen hazır. Tekrar test etmek istiyorsanız, [sandbox hesabının satın alma geçmişini temizleyin](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings/).
## Test sorunları \{#testing-issues\}
Aşağıda bir uygulamayı test ederken karşılaşabileceğiniz yaygın sorunlar listelenmiştir.
### TestFlight sorunları \{#testflight-issues\}
**Sandbox test hesabı kullanmadan TestFlight kullanırsanız** satın alma geçmişinizi temizleyemezsiniz; bu durum çeşitli sorunlara ve hatalı test sonuçlarına yol açar.
Yanlışlıkla [Sandbox test hesabına geçmeyi](#step-4-switch-to-sandbox-test-account) unutup uygulamayı bir kez bile açtıysanız, TestFlight satın alma geçmişinizi üretim Apple hesabınıza bağlar ve beklenmedik sorunlara neden olur.
Düzeltmek için şu adımları izleyin:
1. Uygulamayı test cihazından kaldırın.
2. [Sandbox testi](#sandbox-testing) adımlarını takip edin.
:::note
Yalnızca uygulamayı yeniden yüklemek yeterli değildir; aynı zamanda Sandbox test hesabına geçmeniz, satın alma geçmişini temizlemeniz ve uygulamayı Sandbox test hesabıyla başlatmanız gerekir.
:::
### Paylaşılan access level sorunları \{#shared-access-levels-issues\}
Aynı Sandbox test hesabıyla tekrar test yaparsanız, test kullanıcısı için [paylaşılan access level'larla](sharing-paid-access-between-user-accounts) beklenmedik davranışlarla karşılaşabilirsiniz.
Kullanıcının devralınan bir access level'a sahip olup olmadığını kontrol etmek için Adapty Kontrol Paneli'nden [Profiles & Segments](https://app.adapty.io/profiles/users) sayfasına gidin ve kullanıcının profilini açın.
Kullanıcının miras alınan bir access level'ı varsa, doğru test sonuçları elde etmek için şu adımları izleyin:
1. Üst profili silin.
2. Uygulamayı test cihazından kaldırın.
3. [Uygulamayı TestFlight'tan indirin](#step-3-download-the-app-from-testflight).
4. [Sandbox test hesabına geçin](#step-4-switch-to-sandbox-test-account).
5. [Satın alma geçmişini temizleyin](#step-5-clear-purchase-history).
6. [Uygulamayı açın ve test satın alımınızı yapın](#step-6-make-test-purchase).
:::note
Satın alma geçmişini temizlemek, mağaza tarafındaki satın almayı sıfırlar. Üst profili silmek yalnızca Adapty tarafındaki kaydı kaldırır. Yeniden kullanılan bir hesabın neden erişimi koruduğunu ve hangi sıfırlama işlemlerinin gerçekten işe yaradığını öğrenmek için bkz. [Bir test kullanıcısının aboneliğini sıfırlama](#resetting-a-testers-subscription).
:::
### TestFlight'ta uygulamayı güncelleme \{#updating-app-in-testflight\}
TestFlight uygulaması güncellendiyse:
1. Uygulamayı test cihazından kaldırın.
2. [Uygulamayı TestFlight'tan indirin](#step-3-download-the-app-from-testflight).
3. [Sandbox test hesabına geçin](#step-4-switch-to-sandbox-test-account).
4. [Satın alma geçmişini temizleyin](#step-5-clear-purchase-history).
5. [Uygulamayı açın ve test satın alımınızı gerçekleştirin](#step-6-make-test-purchase).
## Test kullanıcısının aboneliğini sıfırlama \{#resetting-a-testers-subscription\}
Sandbox ortamında bir satın alma, Adapty profiline değil **Apple sandbox hesabına** aittir. Profilde yaptığınız işlemler (profili silmek veya access level düzenlemek), satın almayı mağaza hesabından kaldırmaz. Sonraki yeniden yükleme veya senkronizasyonda SDK aynı işlemi yeniden profille ilişkilendirir ve test kullanıcısı erişimini geri kazanır.
Aşağıdaki tablo, her sıfırlama işleminin neleri değiştirdiğini ve test kullanıcısının ardından ne gördüğünü göstermektedir.
| Eylem | Adapty profili | Apple sandbox hesabı | Test sonrası erişim |
| :-------------------------------------------------------------------------------- | :------------------------------------------------------ | :--------------------- | :------------------------------------------------------------------------------------------------- |
| Adapty Kontrol Paneli'nde profili sil | Silindi | Değişmedi | **Geri döner** — yeniden yüklemede, yeni bir profil aynı işlem zincirine yeniden bağlanır |
| [Profil silme API'si](api-adapty/operations/deleteProfile) aracılığıyla profili sil | Silindi | Değişmedi | **Geri döner** — Kontrol Paneli'nden silmekle aynı sonuç |
| **Add access level** ile geçmiş bir sona erme tarihi ekle | Sonraki senkronizasyonda geçersiz kılınır | Değişmedi | Sonraki yenilemede **geri döner** — canlı abonelik ileriki bir sona erme tarihi uygular |
| [Erişim seviyesini iptal etme API'si](api-adapty/operations/revokeAccessLevel) çağrısı yap | Şu an sona erer, `access_level_updated` (`is_active=false`) tetiklenir | Değişmedi | Sonraki yenilemede veya yeniden yüklemede **geri döner** — güvenilir bir sandbox sıfırlaması değildir |
| Sandbox hesabındaki aboneliği iptal et | Doğrudan değişiklik yok | Abonelik iptal edildi | Yenilemeler durur, mevcut dönem sona erdiğinde erişim biter ve test kullanıcısı ürünü yeniden satın alabilir |
| Yeni bir Apple sandbox hesabıyla giriş yap | Yeni profil | Yeni, boş hesap | **Temiz** — tekrar test için önerilir |
### Bir test kullanıcısını temiz duruma sıfırlama \{#reset-a-tester-to-a-clean-state\}
Tekrarlayan satın alma akışı testleri için profili sıfırlamak yerine her test için yeni bir Apple sandbox hesabı kullanın. Hesabı oluşturmak için [1. Adım'ı](#step-1-create-sandbox-test-account-in-app-store-connect), cihazda hesaba geçmek için ise [4. Adım'ı](#step-4-switch-to-sandbox-test-account) takip edin. Mevcut bir sandbox hesabını yeniden kullanıyorsanız önce [satın alma geçmişini temizleyin](#step-5-clear-purchase-history) — Adapty profilini silmek bunu temizlemez.
### Mevcut bir test kullanıcısının erişimini kaldırma \{#remove-access-from-an-existing-tester\}
Bir test kullanıcısının erişimini kaldırmak için bitiş tarihini geriye almayın ya da Revoke access level API'ını çağırmayın. Sandbox ortamında abonelik her birkaç dakikada bir otomatik yenilenir. Her yenileme, aynı işlem zincirinde ilerleyen bir bitiş tarihi ayarlar; bu nedenle erişim kendiliğinden geri gelir. Revoke access level API bir `access_level_updated` (`is_active=false`) olayı tetikler, ancak bir sonraki yenileme bunu geçersiz kılar.
Erişimi gerçekten durdurmak için aboneliği mağaza tarafında iptal etmeniz gerekir. Test cihazında **Settings > Developer > Sandbox Apple Account** yolunu izleyin, **Manage** seçeneğine tıklayın ve aboneliği iptal edin. Yenilemeler durur ve mevcut dönem sona erdiğinde erişim de biter.
### Profili silmek neden erişimi geri getiriyor \{#why-deleting-the-profile-brings-access-back\}
Bir test kullanıcısı uygulamayı yeniden yüklediğinde, Adapty sandbox hesabının satın alma geçmişini alır ve yeni yüklemeyi mevcut satın almayla ilişkilendirir. Satın alma, sildiğiniz profile değil, mağaza hesabına bağlıdır.
- **Anonim profiller**: `customer_user_id` olmadan yapılan bir yeniden yükleme, [ücretli erişim paylaşımı](sharing-paid-access-between-user-accounts) ayarınızdan bağımsız olarak her zaman mağaza hesabının access level'ını devralır.
- **Tanımlı profiller**: Erişimin yeni bir `customer_user_id`'ye aktarılıp aktarılmayacağı, ücretli erişim paylaşımı ayarınıza bağlıdır.
Adapty'nin bu profilleri nasıl bir zincire bağladığını öğrenmek için bkz. [Profiller nasıl çalışır](how-profiles-work#parent-and-inheritor-profiles).
## Abonelikleri test etme \{#test-subscriptions\}
Sandbox test hesabı kullanarak uygulamayı test ederken, sandbox ortamında her test kullanıcısı için abonelik yenileme hızını ayarlayabilirsiniz. Abonelik yenileme hızlarını düzenleme hakkında daha fazla bilgi için [Apple'ın resmi belgelerine](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings) bakın.
Varsayılan olarak, abonelikler aşağıdaki programa göre durmadan önce 12 kez yenilenir:
| Abonelik süresi | 1 hafta | 1 ay | 2 ay | 3 ay | 6 ay | 1 yıl |
| :----------------------------- | :--------- | :--------- | :--------- | :--------- | :--------- | :--------- |
| Abonelik yenileme hızı | 3 dakika | 5 dakika | 10 dakika | 15 dakika | 30 dakika | 1 saat |
| Fatura Yeniden Deneme süresi | 10 dakika | 10 dakika | 10 dakika | 10 dakika | 10 dakika | 10 dakika |
| Fatura Ek Süre uzunluğu | 3 dakika | 5 dakika | 5 dakika | 5 dakika | 5 dakika | 5 dakika |
:::note
Test işlemlerinin [Olay akışı](validate-test-purchases)'nda görünmesi 10 dakikaya kadar sürebileceğini unutmayın.
:::
Yenileme, ödeme yeniden denemesi ve ek süre gibi durumların uygulamanız ve backend'iniz tarafından doğru işlendiğini doğrulamak için sandbox'ı kullanın; üretim yenileme zamanlamasını tahmin etmek için değil. Yukarıdaki hızlandırılmış ve sınırlı zamanlama, üretim ortamıyla örtüşmez. Backend testleri için işlemleri sunucunuzda yeniden oynatmak istiyorsanız [Set transaction API](api-adapty/operations/setTransaction)'yi kullanabilirsiniz.
## Teklifleri test etme \{#test-offers\}
Teklifleri test etmek için, uygunluk kontrolünün doğru çalışması amacıyla tüm kullanıcı makbuzlarının silinmesi gerekir.
Teklifleri test etmenin en güvenilir yolu, tamamen yeni bir [Sandbox test hesabı](#step-1-create-sandbox-test-account-in-app-store-connect) kullanmaktır. Aynı Sandbox test hesabıyla tekrarlanan testler beklenmedik davranışlara yol açabilir.
:::danger
Aynı Sandbox test hesabıyla tekrar test yapıyorsanız, uygunlukla ilgili sorunları önlemek için [satın alma geçmişini temizlediğinizden](#step-5-clear-purchase-history) emin olun.
:::
---
# File: local-sk-files
---
---
title: "Xcode'da StoreKit testi"
description: "İşlemlerin sorunsuz gerçekleştiğini doğrulamak için sandbox ortamında satın almaları test edin."
---
Xcode'da StoreKit testi, sandbox hesabı oluşturmadan uygulama içi satın almaları yerel olarak test etmenizi sağlar.
Bu tür bir test için şunları yapmanız gerekir:
1. [Adapty'de bir ürün oluşturun](quickstart-products) ve ona bir **App Store product ID** atayın.
2. Xcode'da yerel bir [StoreKit yapılandırma dosyası](https://developer.apple.com/documentation/xcode/setting-up-storekit-testing-in-xcode) oluşturun ve içine bir ürün ekleyin. Ürün ID'si, Adapty'deki **App Store product ID** ile aynı olmalıdır.
3. StoreKit yapılandırma dosyasını derleme şemanıza ekleyin ve uygulamayı derleyin. Emülatörde veya cihazınızda başlatın.
## Xcode'da StoreKit testini kullanmalı mıyım? \{#should-i-use-storekit-testing-in-xcode\}
Bu test yöntemi, derlemeleri hızlıca test etmek veya Xcode özelliklerini kullanarak farklı satın alma senaryolarını denemek isteyen uygulama geliştiricileri için en kullanışlı seçenektir.
Ancak bu testin yerel olduğunu unutmayın; yapılan değişiklikler Adapty Kontrol Paneli'nde görünmez. Uygulamanızı üretim ortamında yayınlamadan önce, [sandbox ortamını](test-purchases-in-sandbox) kullanarak [profiller ile çalışmayı](ios-quickstart-identify) test etmenizi öneririz.
StoreKit testini **kullanmalısınız** eğer:
- Satın alma mantığını test etmek istiyorsanız
- Xcode araçlarıyla farklı satın alma senaryolarını yeniden oluşturmak istiyorsanız (ör. iptal edilen ödeme veya iade)
- Emülatörde test etmek istiyorsanız
StoreKit testini **kullanmamalısınız** eğer:
- Profil ile ilgili mantığı test etmek istiyorsanız
- Uygulamadaki işlemlerinizin Adapty Kontrol Paneli'nde görünüp görünmediğini kontrol etmek istiyorsanız
- Uygulamanızı geliştirme ekibi dışındaki kişilerle test için paylaşmak istiyorsanız
## 1. Adım. StoreKit yapılandırma dosyası oluşturun \{#step-1-create-a-storekit-configuration-file\}
Xcode'da StoreKit yapılandırma dosyası oluşturmak için:
1. **File > New > File from template** seçeneğine tıklayın. Ardından **StoreKit Configuration File**'ı seçin ve **Next**'e tıklayın.
2. Bir isim verin. Ardından, ürünlerin App Store Connect'te olup olmadığına göre:
- **Sync this file with an app in App Store Connect** seçeneğini seçin: Tüm App Store Connect ürünlerini içeren ve yerel olarak test edebileceğiniz bir yapılandırma dosyası oluşturmak için.
- **Sync this file with an app in App Store Connect** seçeneğini seçmeyin: Ürünleri manuel olarak ekleyeceğiniz boş bir yapılandırma dosyası oluşturmak için.
**Next**'e tıklayın.
3. Uygulamanızı hedef olarak eklemeyin, devam edin. App Store Connect'ten senkronize edilmiş ürünlerle çalışıyorsanız [2. Adım](#step-2-add-the-configuration-file-to-the-build-scheme)'a geçin.
4. Ürünleriniz App Store Connect'ten senkronize edilmemişse sol alttaki **+** simgesine tıklayın ve bir ürün türü seçin.
5. Bir abonelik grubu adı girin ve **Next**'e tıklayın.
6. Bir referans adı girin. **Product ID** alanına Adapty'deki ürününüzün **App Store product ID**'sini girin.
7. Yapılandırma dosyasında fiyatlandırma, teklif ve diğer ürün ayarlarını yapılandırın. Ya da daha fazla ürün ekleyin.
## 2. Adım. Yapılandırma dosyasını derleme şemasına ekleyin \{#step-2-add-the-configuration-file-to-the-build-scheme\}
Uygulamayı bu yapılandırma dosyasıyla derlemek için dosyayı bir derleme şemasına eklemeniz gerekir. Test ve üretim şemalarını ayırmak en iyi uygulamadır, bu nedenle test için yeni bir şema oluşturmanızı öneririz:
1. Üstteki uygulama adınıza tıklayın ve **New scheme**'i seçin.
2. Şema için bir isim girin ve **OK**'a tıklayın.
3. Uygulama adına tekrar tıklayın ve **Edit scheme**'i seçin. **StoreKit configuration** bölümünde, derleme sırasında kullanılacak yerel yapılandırma dosyanızı seçin.
## 3. Adım. Derle ve test et \{#step-3-build--test\}
Artık App Store arka ucuna bağlanmadan uygulamayı derleyip uygulama içi satın almaları test edebilirsiniz. Yerel olarak ürün satın alabilir ve access level'lara erişebilirsiniz. Bu değişiklikler Adapty Kontrol Paneli'ne yansımaz, ancak ücretli özelliklerin kilidini yerel olarak açmayı yine de test edebilirsiniz.
Xcode'da StoreKit testi ile kullanılabilen diğer özellikler hakkında [daha fazla bilgi edinin](https://developer.apple.com/documentation/xcode/testing-in-app-purchases-with-storekit-transaction-manager-in-code).
---
# File: testing-on-android
---
---
title: "Google Play Store'da uygulama içi satın almaları test edin"
description: "Adapty kullanarak Android'de abonelik satın almalarını test edin."
---
Android uygulamanızdaki uygulama içi satın almaları (IAP) halka açık bir sürüm yayınlamadan önce test etmek kritik bir adımdır. Sandbox testi, kullanıcılarınızdan gerçek para almadan IAP'leri güvenli ve verimli biçimde test etmenin en iyi yoludur. Bu kılavuzda, Android için Google Play Store'da IAP'lerin sandbox ortamında nasıl test edileceğini adım adım anlatacağız.
:::note
**Sandbox işlemleri tüm analitik grafiklerden hariç tutulur.** Yine de bireysel profil sayfalarında ve etkinlik akışında görünürler.
:::
## Test ortamı \{#testing-environment\}
Android uygulamanızın en iyi performansı göstermesi için emülatör yerine gerçek bir cihazda test etmenizi öneririz. Emülatörlerde başarılı testler yapsak da Google, gerçek cihaz kullanımını tavsiye ediyor.
Emülatör kullanmaya karar verirseniz, Google Play'in kurulu olduğundan emin olun. Bu, uygulamanızın düzgün çalıştığını doğrulamanıza yardımcı olur.
## 1. Uygulama testi için test hesabı oluşturun \{#set-up-test-account-for-app-testing\}
Geliştirmenin sonraki aşamalarında testleri kolaylaştırmak için uygulama içi satın alma testlerinde kullanacağınız bir test kullanıcısı oluşturmanız gerekiyor. Bu kullanıcı, Android test cihazınızda ilk oturum açacağınız hesap olacak.
Android cihazlarda birincil hesabın yalnızca fabrika sıfırlamasıyla değiştirilebildiğini unutmayın; bu işlem tüm verilerinizi siler. Bu nedenle, fabrika sıfırlamasına gerek kalmamak için test kullanıcı hesabınızı baştan doğru şekilde ayarlamanız önemlidir.
:::important
Test hesabını nasıl oluşturacağınız, kullandığınız cihaza bağlıdır:
- Yalnızca test amacıyla kullandığınız bir cihazınız varsa, **ayrı bir test hesabı (yeni bir Gmail hesabı)** oluşturun.
- Böyle bir cihazınız yoksa, **kişisel hesabınızı** kullanıp geçici olarak **License testing** özelliğini etkinleştirebilirsiniz.
- Hiç Android cihazınız yoksa, **ayrı bir test hesabı oluşturup emülatörle kullanabilirsiniz**. Ancak bu yöntem, gerçek cihaza özgü sorunları yakalamanıza izin vermediğinden önerilmez.
:::
## 2. Lisans testini etkinleştir \{#enable-license-testing\}
Test kullanıcı hesabını oluşturduktan sonra, uygulamanız için lisans testini yapılandırmanız gerekecek. Bunun için şu adımları izleyin:
1. Google Play Console kenar çubuğunda **Settings** bölümüne gidin ve **Monetization** altındaki **License testing** seçeneğini seçin.
2. Mevcut bir lisans test kullanıcıları listesi seçin veya yeni bir tane oluşturun.
3. Test için kullanacağınız hesabı listeye ekleyin ve değişiklikleri kaydedin. Ekip üyelerinizin de uygulamayı test etmesi gerekiyorsa e-posta adreslerini listeye ekleyebilirsiniz; böylece tüm gruba erişim sağlanmış olur.
## 3. Kapalı iz oluşturun ve test hesabı ekleyin \{#3-create-closed-track-and-add-test-account-to-it\}
Teste başlamak için uygulamanızın imzalı bir sürümünü kapalı bir ize yayımlamanız gerekir:
1. Uygulamanızı açın ve menüden **Test and release > Testing > Closed testing** seçeneğine gidin. Ardından **Create track** butonuna tıklayın.
2. Kapalı test track adını girin ve **Create track** düğmesine tıklayın.
3. Track'e bir test kullanıcısı listesi ekleyin.
4. **How testers join your test** bölümünden bağlantıyı kopyalayın ve test hesabıyla oturum açılmış cihaza gönderin. Kullanıcıyı tester yapmak için bağlantıyı test cihazınızda açın.
:::warning
Başarılı bir test süreci için aşağıdakileri göz önünde bulundurun:
- Opt-in URL'sini açmak, Play hesabınızı test için işaretler. Bu adımı tamamlamazsanız ürünler yüklenmez.
- Geliştiriciler çoğu zaman test derlemeleri için farklı bir uygulama kimliği (application ID) kullanır. Google Play Hizmetleri, uygulama içi satın almaları bulmak için uygulama kimliğini kullandığından bu durum sorunlara yol açabilir.
- Test cihazında PIN yoksa, test kullanıcısının consumable ürünleri satın almasına izin verilirken aboneliklere izin verilmediği durumlar olabilir. Bu durum, anlaşılması güç bir "Something went wrong" mesajı olarak kendini gösterebilir. Test cihazında PIN bulunduğundan ve cihazın Google Play Store'a giriş yapmış olduğundan emin olun.
:::
## 4. İmzalı APK'yı kapalı kanala yükleyin \{#4-upload-a-signed-apk-to-the-closed-track\}
İmzalı bir APK oluşturun veya Android App Bundle kullanarak az önce oluşturduğunuz kapalı kanala imzalı APK'yı yükleyin. Sürümü yayına almanıza bile gerek yok. Sadece APK'yı yükleyin. Bu konuda daha fazla bilgiye [bu](https://support.google.com/googleplay/android-developer/answer/9859348?visit_id=638929100639477968-3849460621&rd=1) destek makalesinden ulaşabilirsiniz.
:::important
Uygulamanız yeniyse, ülkenizde veya bölgenizde kullanılabilir hale getirmeniz gerekebilir. Bunun için **Testing > Closed testing** bölümüne gidin, test track'inize tıklayın ve **Countries/regions** kısmından istediğiniz ülke ve bölgeleri ekleyin.
:::
## 5. Uygulama içi satın almaları test etme \{#5-test-in-app-purchases\}
APK'yı yükledikten sonra sürümün işlenmesi için birkaç dakika bekleyin. Ardından test cihazınızı açın ve Testers listesine eklediğiniz e-posta hesabıyla oturum açın. Artık üretim uygulamasında olduğu gibi uygulama içi satın almaları test edebilirsiniz.
## Daha fazlası \{#read-more\}
Android uygulamalarında uygulama içi satın almaları test etme hakkında daha fazla bilgi edinmek için şu kaynaklara göz atın:
- [Sandbox'ta yenileme süreleri](https://developer.android.com/google/play/billing/test#subs)
- [Tek seferlik satın almaları test etme](https://developer.android.com/google/play/billing/test#one-time)
---
# File: validate-test-purchases
---
---
title: "Test satın alımları doğrulama"
description: "Sorunsuz işlemler için Adapty'de test satın alımlarını doğrulayın."
---
Mobil uygulamanızı production'a almadan önce uygulama içi satın alımları kapsamlı şekilde test etmek kritik önem taşır. Ayrıntılı rehberlik için [Apple App Store'da uygulama içi satın alımları test etme](test-purchases-in-sandbox) ve [Google Play Store'da uygulama içi satın alımları test etme](testing-on-android) konularına bakabilirsiniz. Testlere başladıktan sonra test satın alımlarının başarılı olup olmadığını doğrulamanız gerekir.
Mobil cihazınızda her test satın alımı yaptığınızda, ilgili işlemi Adapty Kontrol Paneli'ndeki [**Event Feed**](https://app.adapty.io/event-feed) üzerinden kontrol edin. Satın alım **Event Feed**'de görünmüyorsa Adapty tarafından takip edilmiyor demektir.
## Test satın alımı başarılı \{#test-purchase-is-successful\}
Test satın alımı başarılıysa işlem eventi **Event Feed**'de görüntülenir:
İşlemler beklendiği gibi çalışıyorsa [Yayın kontrol listesi](release-checklist)'ne geçin ve ardından uygulamayı yayınlayın.
## Test satın alımı başarısız \{#test-purchase-is-not-successful\}
10 dakika içinde herhangi bir işlem eventi görmüyorsanız veya mobil uygulamada bir hatayla karşılaşıyorsanız olası çözümler için [Sorun Giderme](troubleshooting-test-purchases) ve hata işleme makalelerine bakın: [iOS için](ios-sdk-error-handling), [Android için](android-sdk-error-handling), [React Native için](react-native-handle-errors), [Flutter için](error-handling-on-flutter-react-native-unity), [Unity için](unity-handle-errors) ve [Kotlin Multiplatform](kmp-handle-errors).
---
# File: troubleshooting-test-purchases
---
---
title: "Test satın alımlarında sorun giderme"
description: "Adapty'de test satın alımlarında sorun giderin ve yaygın uygulama içi işlem sorunlarını çözün."
---
İşlem sorunlarıyla karşılaşırsanız, lütfen önce [yayın kontrol listesi](release-checklist)'nde belirtilen tüm adımları tamamladığınızdan emin olun. Tüm adımları tamamladıktan sonra hâlâ sorun yaşıyorsanız, çözmek için aşağıdaki yönergeleri izleyin:
## Mobil uygulamada hata döndürülüyor \{#an-error-is-returned-in-the-mobile-app\}
Platformunuza ait hata listesine bakın: [iOS için](ios-sdk-error-handling), [Android için](android-sdk-error-handling), [React Native için](react-native-troubleshoot-purchases), [Flutter](error-handling-on-flutter-react-native-unity) ve [Unity](unity-troubleshoot-purchases); ardından sorunu çözmek için önerilerimizi izleyin.
## Mobil uygulamada hata döndürülmediği hâlde işlem Event Feed'de görünmüyor \{#transaction-is-absent-from-the-event-feed-although-no-error-is-returned-in-the-mobile-app\}
Bu sorunu çözmek için aşağıdakileri kontrol edin:
1. **iOS için**: Simülatör yerine gerçek bir cihaz kullandığınızdan emin olun.
2. Uygulamanızın `Bundle ID`/`Package name` değerinin [**App settings**](https://app.adapty.io/settings/general) bölümündeki değerle eşleştiğinden emin olun.
3. Uygulamanızdaki `PUBLIC_SDK_KEY` değerinin Adapty Kontrol Paneli'ndeki **Public SDK key** ile eşleştiğinden emin olun: [**App settings** -> **General** sekmesi -> **API keys** bölümü](https://app.adapty.io/settings/general).
4. Sandbox hesabı kullandığınızdan emin olun; [yerel StoreKit yapılandırma dosyası](local-sk-files) kullanmıyor olmalısınız. Daha önce test için yerel StoreKit yapılandırma dosyası kullandıysanız, mevcut derlemenizde bunu kullanmadığınızdan emin olun.
## Test profilimde hiç etkinlik yok \{#no-event-is-present-in-my-testing-profile\}
Bu normal bir davranıştır. Adapty'de yeni bir kullanıcı profili kaydı otomatik olarak şu durumlarda oluşturulur:
- Bir kullanıcı uygulamanızı ilk kez çalıştırdığında
- Bir kullanıcı uygulamanızdan çıkış yaptığında
**Bu neden olur:** Tüm işlemler ve etkinlikler, ilk işlemi gerçekleştiren profile bağlıdır. Bu sayede işlem geçmişinin tamamı (denemeler, satın alımlar, yenilemeler) aynı profile bağlı kalır.
**Ne görürsünüz:** Etkinlik içermeyen yeni profil kayıtları ("orijinal olmayan profiller" olarak adlandırılır) görünebilir; ancak bu profiller access level bilgisini korur. `access_level_updated` etkinliklerini görebilirsiniz. Bu beklenen bir davranıştır.
**Test için:** Birden fazla profil oluşmaması adına, uygulamayı her yeniden yüklediğinizde yeni bir test hesabı (Sandbox Apple ID) oluşturun.
Daha fazla ayrıntı için [Profil oluşturma](how-profiles-work#profile-creation) bölümüne bakın.
Aşağıda orijinal olmayan bir profile örneği verilmiştir. **User history** bölümünde etkinlik olmadığına ve access level'ın mevcut olduğuna dikkat edin.
## Fiyatlar App Store Connect'te belirlenen gerçek fiyatları yansıtmıyor \{#prices-do-not-reflect-the-actual-prices-set-in-app-store-connect\}
Uygulama içi satın alımlar için sandbox ortamını kullanan Sandbox ve TestFlight'ta, fiyatların doğruluğuna odaklanmak yerine satın alma akışının doğru çalışıp çalışmadığını doğrulamak önemlidir. Apple'ın API'sinin, özellikle cihazlar veya hesaplar için farklı bölgeler yapılandırıldığında zaman zaman hatalı veriler sağlayabileceğini belirtmek gerekir. Fiyatlar doğrudan Store'dan geldiğinden ve Adapty arka ucu satın alma fiyatlarını hiçbir şekilde etkilemediğinden, Adapty üzerinden yapılan satın alma testlerinde fiyat tutarsızlıklarını görmezden gelebilirsiniz.
Bu nedenle, satın alma akışının amaçlandığı gibi çalıştığından emin olmak için fiyatların doğruluğundan ziyade akışın kendisini test etmeye öncelik verin.
## Event Feed'deki işlem zamanı hatalı \{#the-transaction-time-in-the-event-feed-is-incorrect\}
**Event Feed**, **App Settings** bölümünde ayarlanan saat dilimini kullanır. Etkinliklerin saat dilimini yerel saatinizle uyumlu hale getirmek için [**App settings** -> **General** sekmesi](https://app.adapty.io/settings/general) bölümünden **Reporting timezone** ayarını düzenleyin.
## Paywall'lar ve ürünler yüklenirken çok uzun sürüyor \{#paywalls-and-products-take-a-long-time-to-load\}
Bu sorun, test hesabınızın uzun bir işlem geçmişine sahip olması durumunda ortaya çıkabilir. [App Store Connect'te Sandbox Test Hesabı (Sandbox Apple ID) Oluşturma](test-purchases-in-sandbox#step-1-create-sandbox-test-account-in-app-store-connect) bölümünde açıklandığı gibi her seferinde yeni bir test hesabı oluşturmanızı kesinlikle öneririz.
Yeni bir hesap oluşturamıyorsanız, iOS cihazınızda aşağıdaki adımları izleyerek mevcut hesabınızdaki işlem geçmişini temizleyebilirsiniz:
1. **Settings** uygulamasını açın ve **App Store**'a dokunun.
2. **Sandbox Apple ID**'nize dokunun.
3. Açılan pencerede **Manage**'i seçin.
4. **Account Settings** sayfasında **Clear Purchase History**'ye dokunun.
Daha fazla ayrıntı için [Apple Developer belgelerine](https://developer.apple.com/documentation/storekit/testing-in-app-purchases-with-sandbox) bakın.
---
# File: test-devices
---
---
title: "Test cihazları"
description: "Verimli uygulama testi için Adapty'de test cihazlarını nasıl yöneteceğinizi öğrenin."
---
Test amacıyla cihazınızı bir test cihazı olarak tanımlayabilirsiniz; bu sayede önbelleğe alma devre dışı kalır ve yaptığınız değişiklikler anında yansıtılır.
:::note
Test cihazları belirli SDK sürümlerinden itibaren desteklenmektedir:
- iOS: 2.11.1
- Android: 2.11.3
- React Native: 2.11.1
Flutter ve Unity desteği daha sonra eklenecektir.
:::
## Cihazınızı test cihazı olarak işaretleyin \{#mark-your-device-as-test\}
1. Adapty Kontrol Paneli'nde [**App settings**](https://app.adapty.io/settings/general) bölümünü açın.
2. **General** sekmesinde **Test devices** bölümüne kadar aşağı kaydırın.
3. **Add test device** düğmesine tıklayın.
4. **Add test device** penceresinde şu bilgileri girin:
| Alan | Açıklama |
|:----------------------------------------------| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Test device name** | Başvurunuz için test cihazının/cihazlarının adı. |
| **ID used to identify this test device** | Test cihazını/cihazlarını tanımlamak için kullanmayı planladığınız tanımlayıcı türünü seçin. En iyi seçeneği belirlemek için aşağıdaki [Hangi tanımlayıcıyı kullanmalısınız](test-devices#which-identifier-you-should-use) bölümündeki önerilerimize bakın. |
| **ID value** | Tanımlayıcının değerini girin. |
5. Değişiklikleri kaydetmek için **Add test device** düğmesine tıklamayı unutmayın.
## Hangi tanımlayıcıyı kullanmalısınız \{#which-identifier-you-should-use\}
Bir cihazı tanımlamak için birden fazla tanımlayıcı kullanabilirsiniz. Şu seçenekleri öneriyoruz:
- Kullanıcılarınızı kendi sisteminizde tanımlamak için sizin belirlediğiniz benzersiz bir tanımlayıcı. Bu, kullanıcının e-postası, dahili kimliğiniz veya herhangi bir metin olabilir. Bu seçeneği kullanmak için
Özellikle aynı hesap için birden fazla cihaz kullanıyorsanız test cihazını tanımlamak için en iyi seçenektir. Bu hesaba sahip tüm cihazlar test cihazı olarak kabul edilir.
| | Adapty profile ID |Adapty'deki [kullanıcı profili](profiles-crm) için benzersiz bir tanımlayıcı.
iOS için Customer User ID veya IDFA, Android için Advertising ID kullanamıyorsanız bunu kullanın. Adapty Profile ID'nin uygulamayı yeniden yüklerseniz veya yeniden giriş yaparsanız değişebileceğini unutmayın.
| #### Customer User ID ve Adapty profile ID nasıl edinilir \{#how-to-obtain-customer-user-id-and-adapty-profile-id\} Her iki tanımlayıcı da Adapty Kontrol Paneli'ndeki **Profile** ayrıntılarından edinilebilir: 1. Kullanıcının profilini [**Adapty Profiles** -> **Event feed** sekmesinde](https://app.adapty.io/event-feed) bulun. :::note Tam profili bulmak için nadir bir işlem türü gerçekleştirin. Bu durumda işlem [**Event Feed**](https://app.adapty.io/event-feed) içinde göründüğünde kolayca tespit edebilirsiniz. ::: 2. Profil ayrıntılarındaki **Customer user ID** ve **Adapty ID** alan değerlerini kopyalayın:
### Apple tanımlayıcıları \{#apple-identifiers\}
| Tanımlayıcı | Kullanım |
|----------|-----|
| IDFA | Identifier for Advertisers (IDFA), Apple'ın bir kullanıcının cihazına atadığı benzersiz bir cihaz tanımlayıcısıdır.
Kendi kendine hiçbir zaman değişmediğinden (manuel olarak sıfırlayabilseniz de) iOS cihazlar için idealdir.
**Not**: iOS 14.5'in yayımlanmasıyla birlikte reklamverenler IDFA'ya erişmek için kullanıcı onayı istemek zorundadır. Uygulamanızda onay istediğinizden ve test cihazınızda onay verdiğinizden emin olun.
| | IDFV | Identifier for Vendors (IDFV), Apple'ın aynı yayıncıya/satıcıya ait tüm uygulamalar için tek bir cihazdaki her uygulamaya atadığı benzersiz bir alfanümerik tanımlayıcıdır. Uygulamayı yeniden yüklerseniz veya güncellerseniz değişebilir. | #### IDFA nasıl edinilir \{#how-to-obtain-the-idfa\} Apple, IDFA'yı varsayılan olarak sağlamaz. Adapty Kontrol Paneli'ndeki profil attribution bilgilerinden edinin: 1. Kullanıcının profilini [**Adapty Profiles** -> **Event feed** sekmesinde](https://app.adapty.io/event-feed) bulun. :::note Tam profili bulmak için nadir bir işlem türü gerçekleştirin. Bu durumda işlem [**Event Feed**](https://app.adapty.io/event-feed) içinde göründüğünde kolayca tespit edebilirsiniz. ::: 2. Profil ayrıntılarını açın ve **Attributes** bölümündeki **IDFA** alan değerini kopyalayın:
Alternatif olarak, [IDFA'nızı size gösterecek uygulamayı App Store'da bulabilirsiniz](https://www.apple.com/us/search/idfa?src=globalnav).
#### Identifier for Vendors (IDFV) nasıl edinilir \{#how-to-obtain-the-identifier-for-vendors-idfv\}
IDFV'yi edinmek için geliştiricinizdeki aşağıdaki yöntemi uygulamanız için kullanmasını ve alınan tanımlayıcıyı loglarınıza veya debug panelinize yansıtmasını isteyin.
```swift showLineNumbers title="Swift"
UIDevice.current.identifierForVendor
```
### Google tanımlayıcıları \{#google-identifiers\}
| Tanımlayıcı | Kullanım |
|----------|-----|
| Advertising ID | Advertising ID, Google'ın bir kullanıcının cihazına atadığı benzersiz bir cihaz tanımlayıcısıdır.
Kendi kendine hiçbir zaman değişmediğinden (manuel olarak sıfırlayabilseniz de) Android cihazlar için idealdir.
**Not**: Kullanmak için Android 12 veya üzerini kullanıyorsanız **Ads** ayarlarınızdaki **Opt out of Ads Personalization** seçeneğini kapatın.
| | Android ID | Android ID, uygulama imzalama anahtarı, kullanıcı ve cihazın her kombinasyonu için benzersiz bir tanımlayıcıdır. Android 8.0 ve üzeri sürümlerde kullanılabilir. | #### Advertising ID nasıl edinilir \{#how-to-obtain-advertising-id\} Cihazınızın reklam kimliğini bulmak için: 1. Android cihazınızda **Settings** uygulamasını açın. 2. **Google** seçeneğine tıklayın. 3. **Services** altında **Ads** seçeneğini seçin. Reklam kimliğiniz ekranın alt kısmında listelenecektir. #### Android ID nasıl edinilir \{#how-to-obtain-android-id\} Android ID'yi edinmek için geliştiricinizdeki [ANDROID_ID](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) değerini uygulamanız için aşağıdaki yöntemi kullanarak istemesini ve alınan tanımlayıcıyı loglarınıza veya debug panelinize yansıtmasını isteyin. ```kotlin showLineNumbers title="Kotlin/Java" android.provider.Settings.Secure.getString(contentResolver, android.provider.Settings.Secure.ANDROID_ID); ``` --- # File: release-checklist --- --- title: "Yayın kontrol listesi" description: "Adapty'nin yayın kontrol listesini takip ederek uygulama güncelleme sürecinizin sorunsuz geçmesini sağlayın." --- Adapty'yi tercih ettiğiniz için çok mutluyuz! Umarız entegrasyon süreci sorunsuz geçmiştir. Bu kılavuz, uygulamanızı mağazalarda yayınlamaya hazırlamak ve monetizasyon akışının düzgün çalıştığından emin olmak için izlemeniz gereken adımları açıklar. ## Başlamadan önce gerekenler \{#pre-flight-essentials\} Doğrulamaya başlamadan önce şunlara ihtiyacınız var: - Sandbox hesabı olan gerçek bir cihaz - Adapty Kontrol Paneli'ne erişim - App Store Connect / Google Play Console'a erişim :::note Sandbox satın almaları simülatörlerde çalışabilse de ödeme diyalogları ve biyometrik doğrulama gibi tüm akışları test etmek için gerçek cihaz gereklidir. ::: ## Genel doğrulamalar \{#universal-validations\} - [ ] **Mağaza bağlantısı**: Adapty'yi App Store ve/veya Google Play'e bağladığınızdan emin olun: - [ ] [App Store](initial_ios) - [ ] [Google Play](initial-android) - [ ] **Abonelik olay iletimi**: Sunucu bildirimlerinin yapılandırıldığını doğrulayın: - [ ] [App Store sunucu bildirimleri](enable-app-store-server-notifications) - [ ] [Gerçek zamanlı geliştirici bildirimleri (RTDN)](enable-real-time-developer-notifications-rtdn) - [ ] **Profil tanımlama**: Kullanıcı tanımlama mantığını doğrulayın ve satın almaların doğru profile eşlendiğinden emin olun: - [ ] [Uygulama kodunuzdaki tanımlama mantığının kullanım senaryonuzla uyuştuğunu kontrol edin](ios-quickstart-identify) - [ ] [Kullanıcı profilleri arasında ücretli erişim paylaşımı için üst/mirasçı mantığını anladığınızdan emin olun](sharing-paid-access-between-user-accounts) - [ ] **Teklifler**: Uygulamanızda App Store promosyon teklifleri kullanıyorsanız, [Uygulama içi satın alma anahtarını](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers) hem ana alana hem de **App Store promotional offers** bölümüne eklediğinizden emin olun. - [ ] **Veri toplama**: Gizlilik uyumluluğunu sağlayın: - [ ] GDPR veya CCPA gibi gizlilik düzenlemelerine uymak zorundaysanız ya da uygulamanız çocuklara yönelikse, [IDFA ve IP toplama ile paylaşımını etkinleştirip etkinleştirmeyeceğinizi](sdk-installation-ios#data-policies) belirleyin. - [ ] Uygulamanız AppTrackingTransparency kullanıyorsa, [yetkilendirme durumunu Adapty'ye gönderdiğinizden](ios-deal-with-att) emin olun. - [ ] **Gizlilik etiketleri**: Adapty'nin topladığı veriler ve inceleme için hangi işaretleri ayarlamanız gerektiği hakkında [daha fazla bilgi edinin](apple-app-privacy). ## Satın alma doğrulamaları \{#purchase-validations\} :::tip Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada! ::: Yayına geçmeden önce, uygulamanızdaki satın almaların düzgün çalıştığından ve paywallınızın mağaza incelemesine hazır olduğundan emin olun. Uygulama içi satın almaları doğrulama yönteminiz, bunları nasıl uyguladığınıza bağlıdır: - Adapty Paywall Builder'da oluşturulmuş bir paywall gösteriyorsunuz - Kendi paywallınızı uyguladınız ve satın almaları yönetmek için içinde `makePurchase` metodunu kullanıyorsunuz - Adapty'yi gözlemci modunda kullanıyorsunuz (Adapty Paywall Builder veya özel paywallınızla)
2. Üst menü çubuğundan **Product** > **Archive** seçeneğini seçin.
3. Arşivleme işleminin tamamlanmasını bekleyin. **Organizer** penceresi otomatik olarak açılır. Arşivinizi seçin ve **Distribute App** düğmesine tıklayın.
4. Dağıtım yöntemi olarak **App Store Connect**'i seçin. Yüklemeyi tamamlamak için adımları takip edin.
:::note
Uygulama simgesi veya başlatma ekranı gibi gerekli öğeler eksikse yükleme başarısız olabilir. Ayrıntılar için Xcode hata günlüğünü kontrol edin.
:::
### Adım 2. Build'i App Store Connect'te kontrol edin \{#step-2-check-the-build-in-app-store-connect\}
1. [App Store Connect](https://appstoreconnect.apple.com)'e gidin ve uygulamanızı açın.
2. **Build** bölümüne gidin. Az önce yüklediğiniz build'in orada göründüğünden emin olun.
:::note
Yüklemeden sonra build'in App Store Connect'te görünmesi birkaç dakika sürebilir.
:::
## Uygulamanızı ve ürünlerinizi incelemeye gönderin \{#submit-your-app-and-products-for-review\}
Build **Build** bölümünde göründükten sonra, uygulama içi aboneliklerinizi ekleyin ve uygulamayı Apple incelemesine gönderin.
### Adım 1. Ürünleri gönderime ekleyin \{#step-1-attach-products-to-the-submission\}
Her aboneliğin, onu ekleyebilmek için App Store Connect'te **Ready to Submit** durumunda olması gerekir. Bir abonelik hâlâ taslak durumdaysa veya meta verisi eksikse listede görünmez.
1. Aynı sayfada **In-App Purchases and Subscriptions** bölümüne gidin.
2. **Select in-app purchases or subscriptions** seçeneğine tıklayın.
3. Bu gönderime dahil etmek istediğiniz tüm ürünleri seçin ve **Done**'a tıklayın.
### Adım 2. İnceleme için gönderin \{#step-2-submit-for-review\}
1. Sayfadaki tüm zorunlu alanları doldurun (açıklama, ekran görüntüleri, anahtar kelimeler vb.).
2. **App Store Version Release** bölümünde, onaylandıktan sonra uygulamanızı otomatik, manuel veya belirli bir tarihte yayınlamak isteyip istemediğinizi seçin.
3. **Add for Review**'a, ardından **Submit to App Review**'a tıklayın.
Apple uygulamaları genellikle 1–2 gün içinde inceler, ancak inceleme süreleri değişkenlik gösterebilir.
## Uygulamanızı canlı ortamda doğrulayın \{#verify-your-app-in-production\}
Apple uygulamanızı onayladıktan sonra:
1. Gerçek bir satın alma yapın (ya da ilk kullanıcının satın almasını bekleyin).
2. Adapty Kontrol Paneli'nde [**Event Feed**](https://app.adapty.io/event-feed)'i açın ve üretim ortamı işlem olaylarının göründüğünü doğrulayın.
3. Abonelik olaylarının (yenilemeler, iptaller) doğru aktığını kontrol edin — bunlar [App Store sunucu bildirimlerinin](enable-app-store-server-notifications) yapılandırılmış olmasına bağlıdır.
Üretim ortamı olayları görünmüyorsa, [App Store bağlantı yapılandırmanızı](app-store-connection-configuration) doğrulayın.
## Sonraki adımlar \{#next-steps\}
Uygulamanız yayında. Abonelik gelirinizi artırmaya başlayın:
- **[A/B testi](ab-tests)**: En iyi dönüşümü sağlayan paywall'ı bulmak için farklı seçenekler deneyin.
- **[Analitik](charts)**: MRR, churn ve dönüşüm gibi abonelik metriklerini takip edin.
- **Entegrasyonlar**: Abonelik olaylarını [analitik](analytics-integration) ve [attribution](attribution-integration) platformlarına gönderin.
---
# File: general
---
---
title: "Uygulama ayarları"
description: "Adapty'deki genel ayarları ve yapılandırmaları keşfedin."
---
Uygulamanızın davranışını, görünümünü ve gelir paylaşımını yönetmek için App Settings sayfasının General sekmesine gidebilirsiniz. Burada uygulamanızın adını ve simgesini özelleştirebilir, Adapty SDK ve API anahtarlarınızı yönetebilir, Small Business Program durumunuzu belirleyebilir ve uygulamanızın analitik ve grafikleri için saat dilimini seçebilirsiniz.
## 1. Uygulama ayrıntıları \{#1-app-details\}
Adapty arayüzünde uygulamanızı temsil edecek benzersiz bir ad ve simge seçin. Uygulama adı ve simgesinin App Store veya Google Play'deki ad ve simgeyi etkilemeyeceğini unutmayın. Ayrıca uygulamanızın amacını ve içeriğini doğru yansıtan bir App Category seçtiğinizden emin olun. Bu, kullanıcıların uygulamanızı bulmasına ve uygun uygulama mağazası kategorilerinde görünmesine yardımcı olur.
## 2\. Small Business Program Üyeliği ve İndirimli Hizmet Ücreti \{#2-member-of-small-business-program-and-reduced-service-fee\}
Organizasyonunuz Apple'ın [Small Business Program](app-store-small-business-program) programına veya Google'ın [Reduced Service Fee programına](google-reduced-service-fee) kayıtlıysa uygulamalarınız indirimli mağaza komisyonuna tabi olur.
Uygulamanız indirimli komisyon programına kayıtlıysa bunu Adapty'e bildirin. Doğru hesaplamalar için bu programların durumunu "Reduced Store Fee" bölümünde belirtin.
İndirimli ücret ayarı yalnızca gelecekteki işlemler için geçerlidir. Yürürlüğe girmeden **önce** durumunuzu güncelleyin; Adapty komisyon oranını buna göre ayarlayacaktır.
:::warning
* İndirimli ücret programındaki katılımınızı uzatıyorsanız **ek bir uygunluk dönemi ekleyin**.
* Program üyeliğinizi kaybediyorsanız mevcut uygunluk döneminin **bitiş tarihini değiştirin**.
:::
Bu konuyu derinlemesine ele alan makaleler:
* [App Store Small Business Program](app-store-small-business-program)
* [Google Reduced Service Fee](google-reduced-service-fee)
## 3\. Raporlama saat dilimi \{#3-reporting-timezone\}
Bulunduğunuz konuma veya uygulamanızın analitik ve grafiklerinin en alakalı olduğu yere karşılık gelen saat dilimini seçin. Tutarlılık sağlamak için App Store Connect veya Google Play Console hesabınızla aynı saat dilimini kullanmanızı öneririz. Bu saat dilimi ayarının, UTC saat dilimini kullanan Adapty sistemindeki üçüncü taraf entegrasyonları etkilemediğini unutmayın.
Saat dilimi ayarlarına, App Settings sayfasının General sekmesindeki Reported timezone bölümünden ulaşabilirsiniz. İlgili kutuyu işaretleyerek Adapty hesabınızdaki tüm uygulamalar için aynı saat dilimini de ayarlayabilirsiniz.
## 4\. Analitik için yükleme tanımı \{#4-installs-definition-for-analytics\}
Analitikte yeni bir yükleme olayı olarak neyin tanımlanacağını seçin:
| Temel | Açıklama |
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Yeni device_id'ler | (Önerilen) Uygulamanın mağazadan bir cihaza her yüklenmesi yeni bir yükleme olarak sayılır. Bu hem ilk yüklemeleri hem de yeniden yüklemeleri kapsar.
Yüklemeler cihaz kimliği başına sayılır ve kullanıcı kimlik doğrulamasından etkilenmez. Profil oluşturma (SDK etkinleştirmede veya çıkış yapıldığında), oturum açma veya uygulama güncelleme ek yükleme olayı oluşturmaz.
Örneğin, aynı uygulama 5 farklı cihaza yüklendiyse analitikte 5 yükleme görürsünüz.
| | Yeni customer_user_id'ler |Bu seçenek, Adapty'de
Oturum açmış kullanıcılar için yalnızca bir customer user ID ile ilişkilendirilen ilk yükleme yükleme olarak sayılır. Ek cihazlardaki yüklemeler yeni yükleme olarak sayılmaz.
Anonim kullanıcılar (oturum açmamış kullanıcılar) analitikte sayılmaz.
Uygulamayı yeniden yüklemek veya tekrar oturum açmak ek yükleme oluşturmaz.
Uygulama mağazaları ve attribution platformları (App Store Connect, Google Play Console ve AppsFlyer gibi) yüklemeleri cihaz bazlı olarak sayar. Adapty'de yüklemeleri customer user ID'ye göre sayarsanız bu harici hizmetlerden farklı sayılar elde edebilirsiniz.
⚠️ Adapty'de kullanıcıları tanımlamıyorsanız bu seçenek etkinleştirildiğinde hiçbir yükleme sayılmaz.
| | Adapty'deki yeni profiller | (Eski) Her uygulama yüklemesi, yeniden yükleme ve çıkış sırasında oluşturulan anonim profiller yeni yükleme olarak sayılır. | Bu seçeneğin yalnızca [**Analytics**](https://app.adapty.io/analytics) sayfasını etkilediğini ve görünümü ayrıca yapılandırabileceğiniz [**Overview**](https://app.adapty.io/overview) sayfasını etkilemediğini unutmayın. ## 5. App Store fiyat artışı mantığı \{#5-app-store-price-increase-logic\} Adapty analizleri ile App Store Connect sonuçları arasındaki tutarsızlıkları önlemek ve doğru verileri korumak için, App Store Connect'te fiyat artışlarıyla ilgili yapılandırmaları ayarlarken uygun seçeneği belirlemek önemlidir. Adapty'de abonelik fiyat artışlarına uygulanacak mantığı şu şekilde seçebilirsiniz:
- **Mevcut kullanıcılar için abonelik fiyatı korunur:** Bu seçeneği işaretlediğinizde, App Store Connect'te fiyat değişikliği yapılsa bile mevcut aboneleriniz için geçerli fiyat korunur. Yani mevcut aboneler orijinal abonelik fiyatından ücretlendirilmeye devam eder.
- **App Store Connect'te abonelik fiyatı değiştiğinde mevcut aboneler için de değişir:** Bu seçeneği seçerseniz App Store Connect'te yapılan fiyat değişiklikleri mevcut abonelere de uygulanır. Yani mevcut aboneler, App Store Connect'teki güncellenen fiyatlandırmayı yansıtan yeni fiyattan ücretlendirilir.
:::warning
Seçilen seçeneğin yalnızca Adapty'deki analitiği değil, entegrasyonları ve genel işlem yönetimi davranışını da etkilediğini göz önünde bulundurun.
:::
Mevcut aboneler için abonelik fiyatlarını yönetme yaklaşımınızla örtüşen seçeneği belirlediğinizden emin olun. Bu, Adapty analitiği ile App Store Connect'ten elde edilen sonuçlar arasında doğru veri ve senkronizasyonun korunmasına yardımcı olur.
## 6. Kullanıcı hesapları arasında ücretli erişim paylaşımı \{#6-sharing-paid-access-between-user-accounts\}
:::link
Ana makale: [Kullanıcı hesapları arasında ücretli erişim paylaşımı](sharing-paid-access-between-user-accounts)
:::
**Sharing paid access between user accounts** ayarı, birden fazla [kullanıcı profili](identifying-users) aynı satın almaya erişmeye çalıştığında Adapty'nin ne yapacağını belirler. [Sandbox ortamı](test-purchases-in-sandbox) için ayrı bir erişim paylaşımı ayarı belirtebilirsiniz.
**Etkin (varsayılan)**
Kimliği belirlenmiş kullanıcılar ([Müşteri Kullanıcı Kimliği](identifying-users#set-customer-user-id-on-configuration) atanmış olanlar), cihazları aynı Apple/Google ID ile oturum açmışsa Adapty tarafından sağlanan aynı [access level](access-level)'ı paylaşabilir. Bu, kullanıcının uygulamayı yeniden yükleyip farklı bir e-posta ile giriş yapması durumunda bile önceki satın alımına erişimini korumasını sağlar. Bu seçenekte birden fazla kimliği belirlenmiş kullanıcı aynı access level'ı paylaşabilir.
Access level paylaşılıyor olsa da tüm geçmiş ve gelecekteki işlemler; deneme süreleri, abonelik satın alımları, yenilemeler ve daha fazlası dahil olmak üzere tutarlı bir analitik ve eksiksiz bir işlem geçmişi sağlamak amacıyla orijinal Müşteri Kullanıcı Kimliği'nde olay olarak kaydedilir ve aynı profile bağlı kalır.
**Erişimi yeni kullanıcıya aktar**
Kimliği belirlenmiş kullanıcılar, farklı bir [Müşteri Kullanıcı Kimliği](identifying-users#set-customer-user-id-on-configuration) ile giriş yapsalar veya uygulamayı yeniden yükleseler bile, cihazları aynı Apple/Google ID ile oturum açık olduğu sürece Adapty tarafından sağlanan [access level](access-level)'a erişmeye devam edebilir.
Önceki seçenekten farklı olarak Adapty, satın alımı kimliği belirlenmiş kullanıcılar arasında aktarır. Bu sayede satın alınan içeriğe erişim sağlanır; ancak aynı anda yalnızca bir kullanıcı erişime sahip olabilir. Örneğin, KullanıcıA bir abonelik satın alır ve KullanıcıB aynı cihazda oturum açarak işlemleri geri yüklerse KullanıcıB aboneliğe erişim kazanırken KullanıcıA'nın erişimi iptal edilir.
Kullanıcılardan biri (yeni veya eski) kimliği belirlenmemişse, access level yine de Adapty'deki bu profiller arasında paylaşılmaya devam eder.
Access level aktarılıyor olsa da tüm geçmiş ve gelecekteki işlemler; deneme süreleri, abonelik satın alımları, yenilemeler ve daha fazlası dahil olmak üzere tutarlı bir analitik ve eksiksiz bir işlem geçmişi sağlamak amacıyla orijinal Müşteri Kullanıcı Kimliği'nde olay olarak kaydedilir ve aynı profile bağlı kalır.
**Erişimi yeni kullanıcıya aktar** seçeneğine geçtikten sonra, access level'lar profiller arasında hemen aktarılmaz. Belirli bir access level için aktarım süreci; abonelik yenilemesi, geri yükleme veya işlem doğrulama gibi mağazadan bir olay alındığında tetiklenir.
**Devre Dışı**
Bir access level alan ilk kimliği belirlenmiş kullanıcı profili, bu erişimi kalıcı olarak elinde tutar. İş mantığınızın satın alımların tek bir Müşteri Kullanıcı Kimliği'ne bağlı olmasını gerektirdiği durumlarda en uygun seçenektir.
Anonim kullanıcılar arasında access level paylaşımının devam ettiğini unutmayın.
Bir satın alımı "ayırmak" için [kullanıcının profilini silebilirsiniz](https://adapty.io/docs/tr/api-adapty/operations/deleteProfile). Silme işleminin ardından access level, ister anonim ister kimliği belirlenmiş olsun, ilk talep eden kullanıcı profiline açık hale gelir.
Paylaşımı devre dışı bırakmak yalnızca yeni kullanıcıları etkiler. Kullanıcılar arasında zaten paylaşılmakta olan abonelikler, bu seçenek devre dışı bırakıldıktan sonra da paylaşılmaya devam eder.
:::warning
Apple ve Google, uygulama içi satın alımların kullanıcılar arasında paylaşılmasını veya aktarılmasını zorunlu kılar; çünkü satın alımı belirli bir kullanıcıyla ilişkilendirmek için Apple/Google ID'ye güvenirler. Paylaşım olmadan, sonraki yeniden yüklemelerde satın alımların geri yüklenmesi çalışmayabilir.
Paylaşımı devre dışı bırakmak, kullanıcıların giriş yaptıktan sonra erişimi yeniden kazanamamasına neden olabilir.
Paylaşımı yalnızca kullanıcılarınızın satın alma yapmadan önce **giriş yapmasının zorunlu olduğu** durumlarda devre dışı bırakmanızı öneririz. Aksi takdirde, kimliği belirlenmiş bir kullanıcı abonelik satın alıp başka bir hesaba giriş yaparak erişimini kalıcı olarak kaybedebilir.
:::
### Hangi ayarı seçmeliyim? \{#which-setting-should-i-choose\}
| Uygulamam... | Seçilecek seçenek |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| Giriş sistemi yok ve yalnızca Adapty'nin anonim profil ID'lerini kullanıyor. | Access level'lar her üç seçenekte de anonim profil ID'leri arasında her zaman paylaşıldığından varsayılan seçeneği kullanın. |
| İsteğe bağlı giriş sistemine sahip ve müşterilerin hesap oluşturmadan önce satın alım yapmasına izin veriyor. | Hesapsız satın alım yapan müşterilerin işlemlerini daha sonra geri yükleyebilmesini sağlamak için **Erişimi yeni kullanıcıya aktar** seçeneğini belirleyin. |
| Satın alım öncesinde hesap oluşturmayı zorunlu kılıyor ancak satın alımların birden fazla Müşteri Kullanıcı Kimliği'ne bağlanmasına izin veriyor. | Aynı anda yalnızca bir Müşteri Kullanıcı Kimliği'nin erişime sahip olmasını sağlarken kullanıcıların ücretli erişimlerini kaybetmeden farklı bir Müşteri Kullanıcı Kimliği ile giriş yapabilmesine olanak tanımak için **Erişimi yeni kullanıcıya aktar** seçeneğini belirleyin. |
| Satın alım öncesinde hesap oluşturmayı zorunlu kılıyor ve satın alımları tek bir Müşteri Kullanıcı Kimliği'ne bağlayan katı kurallara sahip. | İşlemlerin hesaplar arasında hiçbir zaman aktarılmamasını sağlamak için **Devre Dışı** seçeneğini belirleyin. |
## 7. SDK ve API anahtarları \{#7-sdk-and-api-keys\}
Adapty SDK'larını uygulamanıza entegre etmek için Public SDK anahtarını, Adapty'nin Server API'sine erişmek için ise Secret Key'i kullanın. Gerektiğinde yeni anahtarlar oluşturabilir veya mevcut olanları iptal edebilirsiniz. Developer CLI için token oluşturmak üzere **Settings → Developer API** bölümüne gidin. Bkz. [Authentication](developer-cli-authentication).
## 8. Test cihazları \{#8-test-devices\}
Test için kullanılacak cihazları belirterek paywall veya placement değişikliklerinde önbellek gecikmelerini atlayıp anında güncellemeler almalarını sağlayın. Daha fazla bilgi için bkz. [Testing devices](test-devices).
## 9. Placement'lar arası varyant sürekliliği \{#9-cross-placement-variation-stickiness\}
Bir test tamamlandıktan sonra kullanıcının testteki varyantlarla ne kadar süre daha sunulmaya devam edeceğini tanımlayın. Bu, analitik doğruluğunu ve kullanıcı deneyimini etkiler; zira kullanıcıya daha önce gördüğünden farklı bir teklif sunmak satın alma kararını etkileyebilir.
Maksimum ve varsayılan süreklililik süresi 90 gündür.
:::warning
Şunları göz önünde bulundurun:
- Bu ayarı değiştirmek, daha önce bir varyasyon almış tüm kullanıcıları etkiler. Bu kullanıcılar bir placement gördüklerinde anında yeni bir paywalle uygun hale gelir; bu da çalışan A/B testlerinizin sonuçlarını bozabilir.
- Bir kullanıcı için süreklililik süresi dolduysa, o kullanıcıya yeni bir paywall veya A/B testi sunulabilir. Ancak bu durumda bile söz konusu kullanıcı bir daha hiçbir placement'lar arası testin parçası olamaz.
:::
## 10. Uygulamayı Sil \{#delete-the-app\}
Artık ihtiyacınız kalmayan bir uygulamayı Adapty'den silebilirsiniz.
:::warning
Bu işlemin geri alınamaz olduğunu ve uygulamayı ya da verilerini geri yükleyemeyeceğinizi lütfen unutmayın.
:::
---
# File: ios-settings
---
---
title: "Apple App Store kimlik bilgileri"
description: "Sorunsuz abonelik yönetimi için Adapty'de iOS ayarlarını yapılandırın."
---
App Store kimlik bilgilerini yapılandırmak ve Adapty iOS SDK'nın sorunsuz çalışmasını sağlamak için Adapty Kontrol Paneli'ndeki App Settings sayfasında yer alan [iOS SDK](https://app.adapty.io/settings/ios-sdk) sekmesine gidin. Ardından aşağıdaki parametreleri yapılandırın:
| Alan | Açıklama |
|----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Bundle ID** | [Uygulama bundle ID'niz](app-store-connection-configuration#step-1-provide-bundle-id-and-apple-app-id). |
| **In-app purchase API (StoreKit 2)** | Uygulama içi satın alma işlem geçmişi isteklerinin güvenli kimlik doğrulaması ve doğrulamasını etkinleştirmek için [anahtarlar](app-store-connection-configuration#step-2-provide-issuer-id-and-key-id). |
| **App Store Server Notifications** | Kullanıcıların abonelik durumu değişikliklerini izlemek ve yanıtlamak amacıyla App Store'dan [sunucudan sunucuya bildirimler](enable-app-store-server-notifications) almayı etkinleştirmek için kullanılan URL. |
| **App Store Promotional Offers** | Adapty'de belirli ürünler için [Promosyon teklifleri](generate-in-app-purchase-key) oluşturmaya yönelik abonelik anahtarları. |
| **Apple app ID** | App Store'daki uygulama ID'niz. Bulmak için App Store Connect'te uygulama sayfanızı açın, sol menüden **App Information** sayfasına gidin ve **Apple ID**'yi kopyalayın. |
| **App Store Connect shared secret (LEGACY)** | **Adapty SDK v2.9.0 öncesi için eski anahtar**
Uygulamanızda makbuz doğrulaması ve sahteciliği önlemek için kullanılan [bir anahtar](app-store-connection-configuration#step-5-enter-app-store-shared-secret).
| --- # File: google-play-store-connection-configuration --- --- title: "Google Play Store entegrasyonunu yapılandırma" description: "Sorunsuz uygulama içi satın alma işlemleri için Adapty'de Google Play Store bağlantısını yapılandırın." --- Bu bölüm, Google Play üzerinden satılan mobil uygulamanızı Adapty ile entegre etme sürecini açıklamaktadır. Play Store'daki uygulama yapılandırma verilerinizi Adapty Kontrol Paneli'ne girmeniz gerekecek. Bu adım, satın almaları doğrulamak ve Adapty içinde Play Store'dan abonelik güncellemeleri almak için kritik öneme sahiptir. Bu işlemi ilk onboarding sırasında tamamlayabilir ya da daha sonra Adapty Kontrol Paneli'nin **App Settings** bölümünden değişiklik yapabilirsiniz. :::danger Yapılandırma değişikliği, yalnızca Adapty paywall'larını entegre ettiğiniz mobil uygulamanızı yayınlamadan önce kabul edilebilir. Yayın sonrasında yapılan değişiklik entegrasyonu bozar ve paywall'lar mobil uygulamanızda gösterilmeyi durdurur. ::: ## Adım 1. Paket adını girin \{#step-1-provide-package-name\} Paket adı, uygulamanızın Google Play Store'daki benzersiz tanımlayıcısıdır. Bu, abonelik işleme gibi Adapty'nin temel işlevleri için gereklidir. 1. [Google Play Developer Console](https://play.google.com/console/u/0/developers)'u açın. 2. ID'sine ihtiyaç duyduğunuz uygulamayı seçin. **Dashboard** penceresi açılır.
3. Uygulama adının altındaki ürün ID'sini bulun ve kopyalayın.
4. Adapty üst menüsünden [**App settings**](https://app.adapty.io/settings/android-sdk)'i açın.
5. **App settings** penceresinin **Android SDK** sekmesine, kopyaladığınız **Package name** değerini yapıştırın.
## Adım 2. Hesap anahtarı dosyasını yükleyin \{#step-2-upload-the-account-key-file\}
1. [Servis hesabı anahtar dosyası oluşturma](create-service-account) adımında oluşturduğunuz JSON formatındaki servis hesabı özel anahtar dosyasını **Service account key file** alanına yükleyin.
Değişiklikleri onaylamak için **Save** düğmesine tıklamayı unutmayın.
**Sıradaki adım**
- [Google Play Console'da Gerçek zamanlı geliştirici bildirimlerini (RTDN) etkinleştirme](enable-real-time-developer-notifications-rtdn)
---
# File: enable-real-time-developer-notifications-rtdn
---
---
title: "Google Play Console'da Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN) Etkinleştirme"
description: "Adapty için Google Play Console'da Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN) etkinleştirerek kritik olaylar hakkında bilgi sahibi olun ve veri doğruluğunu koruyun. İade ve diğer önemli olaylar için Play Store'dan anında güncelleme almak üzere RTDN'yi nasıl kuracağınızı öğrenin"
---
Gerçek zamanlı geliştirici bildirimlerini (RTDN) kurmak, veri doğruluğu açısından kritik öneme sahiptir; bu sayede Play Store'dan iade bilgileri ve diğer olaylar dahil güncellemeleri anında alabilirsiniz.
## Bildirimleri Etkinleştirme \{#enable-notifications\}
1. **Google Cloud Pub/Sub**'ın etkin olduğundan emin olun. [Bu bağlantıyı](https://console.cloud.google.com/flows/enableapi?apiid=pubsub) açın ve uygulama projenizi seçin. **Google Cloud Pub/Sub**'ı henüz etkinleştirmediyseniz burada etkinleştirmeniz gerekir.
2. Adapty üst menüsünden [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) sayfasına gidin ve **Google Play RTDN topic name** başlığının yanındaki **Enable Pub/Sub API** alanının içeriğini kopyalayın.
:::note **Enable Pub/Sub API** alanının içeriği yanlış bir formattaysa (doğru format `projects/...` ile başlar), yardım için [Enable Pub/Sub API alanındaki yanlış formatı düzeltme](enable-real-time-developer-notifications-rtdn#fixing-incorrect-format-in-enable-pubsub-api-field) bölümüne bakın. ::: 3. [Google Play Console](https://play.google.com/console/)'u açın, uygulamanızı seçin ve **Monetize with Play** -> **Monetization setup** bölümüne gidin. **Google Play Billing** bölümünde **Enable real-time notifications** onay kutusunu işaretleyin. 4. Adapty **App Settings**'de kopyaladığınız **Enable Pub/Sub API** alanının içeriğini **Topic name** alanına yapıştırın. 5. Google Play Console'da **Save changes**'e tıklayın.
## Bildirimleri Test Etme \{#test-notifications\}
Gerçek zamanlı geliştirici bildirimlerine başarıyla abone olup olmadığınızı kontrol etmek için:
1. Google Play Console ayarlarındaki değişiklikleri kaydedin.
2. Google Play Console'daki **Topic name** alanının altında **Send test notification**'a tıklayın.
3. Adapty'de [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) sayfasına gidin. Test bildirimi gönderildiyse, konu adının üzerinde durumunu göreceksiniz.
## Enable Pub/Sub API Alanındaki Yanlış Formatı Düzeltme \{#fixing-incorrect-format-in-enable-pubsub-api-field\}
**Enable Pub/Sub API** alanının içeriği yanlış bir formattaysa (doğru format `projects/...` ile başlar), sorunu gidermek için şu adımları izleyin:
### 1. API Etkinleştirme ve İzinleri Doğrulama \{#1-verify-api-enablement-and-permissions\}
Gerekli tüm API'lerin etkinleştirildiğinden ve izinlerin servis hesabına doğru şekilde verildiğinden emin olun. Bu adımları daha önce tamamlamış olsanız bile, hiçbir alt adımın atlanmadığından emin olmak için tekrar gözden geçirmeniz önemlidir. Aşağıdaki bölümlerdeki adımları tekrarlayın:
1. [Google Play Console'da Geliştirici API'lerini Etkinleştirme](enabling-of-devepoler-api)
2. [Google Cloud Console'da Servis Hesabı Oluşturma](create-service-account)
3. [Google Play Console'da Servis Hesabına İzin Verme](grant-permissions-to-service-account)
4. [Google Play Console'da Servis Hesabı Anahtar Dosyası Oluşturma](create-service-account-key-file)
5. [Google Play Store Entegrasyonunu Yapılandırma](google-play-store-connection-configuration)
### 2. Alan Politikalarını Düzenleme \{#2-adjust-domain-policies\}
**Domain restricted contacts** ve **Domain restricted sharing** politikalarını değiştirin:
1. [Google Cloud Console](https://console.cloud.google.com/)'u açın ve uygulamanızı yönetmek için servis hesabını oluşturduğunuz projeyi seçin.
2. **Quick Access** bölümünde **IAM & Admin**'i seçin.
3. Sol panelde **Organization Policies**'i seçin.
4. **Domain restricted contacts** politikasını bulun.
5. **Actions** sütunundaki üç nokta düğmesine tıklayın ve **Edit policy**'yi seçin.
6. Politika düzenleme penceresinde:
1. **Policy source** altında **Override parent's policy** radyo düğmesini seçin.
2. **Policy enforcement** altında **Replace** radyo düğmesini seçin.
3. **Rules** altında **ADD A RULE** düğmesine tıklayın.
4. **New rule** -> **Policy values** altında **Allow All**'u seçin.
5. **SET POLICY**'ye tıklayın.
7. **Domain restricted sharing** politikası için 4-6. adımları tekrarlayın.
Son olarak, **Google Play RTDN topic name** başlığının yanındaki **Enable Pub/Sub API** alanının içeriğini yeniden oluşturun. Alan artık doğru formatta olacaktır.
Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN) başarıyla etkinleştirdikten sonra güncellenen politikalar için **Policy source**'u **Inherit parent's policy** olarak geri aldığınızdan emin olun.
## Ham Olay Yönlendirme \{#raw-events-forwarding\}
Bazen Google'dan ham S2S olaylarını almaya devam etmek isteyebilirsiniz. Adapty kullanırken bunları almaya devam etmek için endpoint'inizi **URL for forwarding raw Google events** alanına eklemeniz yeterlidir; ham olayları Google'dan geldiği gibi ileteceğiz.
---
**Sırada ne var**
Adapty SDK'yı şu platformlar için kurun:
- [Android](sdk-installation-android)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: apple-search-ads
---
---
title: "Apple Ads"
description: "Abonelik dönüşümlerini optimize etmek için Apple Ads'i Adapty ile entegre edin."
---
:::important
**App settings** içindeki Apple Ads entegrasyonu yalnızca temel analitik ve SplitMetrics Acquire ile Asapty entegrasyonları için kullanılır.
[Adapty Ads Manager](adapty-ads-manager), ayrı bir bağlantı kullanır. Apple Ads hesabınızı [Adapty Ads Manager](adapty-ads-manager-get-started) üzerinden bağlayın.
:::
Adapty, Apple Ads'ten attribution verisi almanıza ve kampanya ile anahtar kelime segmentasyonuyla metriklerinizi analiz etmenize yardımcı olur. Adapty, Apple Ads için attribution verilerini SDK ve AdServices Framework aracılığıyla otomatik olarak toplar.
Apple Ads entegrasyonunu kurduktan sonra Adapty, Apple Ads'ten attribution verisi almaya başlar. Bu verilere profiller sayfasından kolayca erişip görüntüleyebilirsiniz.
## Entegrasyonu Kurma \{#set-up-integration\}
### Adapty'yi AdServices framework'üne bağlama \{#connect-adapty-to-the-adservices-framework\}
Apple Ads, [AdServices](https://developer.apple.com/documentation/adservices) aracılığıyla Adapty Kontrol Paneli'nde bazı yapılandırmalar gerektirir ve bunu uygulama tarafında da etkinleştirmeniz gerekir. AdServices framework'ü aracılığıyla Adapty üzerinden Apple Ads'i kurmak için şu adımları izleyin:
#### 1. Adım: Genel anahtarı edinin \{#step-1-obtain-public-key\}
Adapty Kontrol Paneli'nde [Settings -> Apple Ads](https://app.adapty.io/settings/apple-search-ads) sayfasına gidin.
Önceden oluşturulmuş genel anahtarı (Adapty sizin için bir anahtar çifti sağlar) bulun ve kopyalayın.
:::note
Apple Ads attribution için alternatif bir hizmet veya kendi çözümünüzü kullanıyorsanız, kendi özel anahtarınızı yükleyebilirsiniz.
:::
#### Adım 2: Apple Ads'de kullanıcı yönetimini yapılandırın \{#step-2-configure-user-management-on-apple-ads\}
[Apple Ads hesabınızda](https://ads.apple.com/app-store) **Settings > User Management** sayfasına gidin. Adapty'nin attribution verilerini çekebilmesi için başka bir Apple ID hesabını davet etmeniz ve bu hesaba API Account Manager erişimi vermeniz gerekir. Erişiminiz olan herhangi bir hesabı kullanabilir ya da bu amaç için yeni bir hesap oluşturabilirsiniz. Önemli olan nokta şudur: bu Apple ID ile Apple Ads'e giriş yapabilmeniz gerekir.
#### Adım 3: API kimlik bilgileri oluşturun \{#step-3-generate-api-credentials\}
Bir sonraki adım olarak, Apple Ads'e yeni eklenen hesapla giriş yapın. Apple Ads arayüzünde Settings -> API bölümüne gidin. Daha önce kopyaladığınız genel anahtarı ilgili alana yapıştırın. Yeni API kimlik bilgileri oluşturun.
#### Adım 4: Adapty'yi Apple Ads kimlik bilgileriyle yapılandırın \{#step-4-configure-adapty-with-apple-ads-credentials\}
Apple Ads ayarlarından Client ID, Team ID ve Key ID alanlarını kopyalayın. Adapty Kontrol Paneli'nde bu kimlik bilgilerini ilgili alanlara yapıştırın.
### Uygulamanızı AdServices ağına bağlama \{#connect-your-app-to-the-adservices-network\}
[AdServices framework kurulumunu](#connect-the-adservices-framework) tamamladıktan sonra Adapty, Apple Search Ad attribution verilerini otomatik olarak toplamaya başlar. Herhangi bir SDK kodu eklemenize gerek yoktur.
iOS uygulamaları için bu attribution verisi **her zaman** diğer kaynaklardan gelen verilere göre öncelikli olacaktır. Bu davranış istenmiyor ise aşağıdaki talimatları kullanarak ASA attribution'ı *devre dışı bırakın*.
## Entegrasyonu devre dışı bırakma \{#disable-integration\}
Apple Search Ads attribution'ını kapatmak için [**App Settings** -> **Apple Search Ads** sekmesini](https://app.adapty.io/settings/apple-search-ads) açın ve **Receive Apple Search Ads attribution** anahtarını kapatın.
:::warning
Bunu devre dışı bırakmanın ASA analizlerinin tamamen durmasına yol açacağını unutmayın. Sonuç olarak, ASA artık analizlerde kullanılmayacak ve entegrasyonlara gönderilmeyecektir. Ayrıca SplitMetrics Acquire ve Asapty, doğru çalışmak için ASA attribution'a bağlı olduklarından işlevlerini yitirecektir.
Bu değişiklikten önce alınan attribution verileri etkilenmeyecektir.
:::
## Kendi Anahtarlarınızı Yükleme \{#uploading-your-own-keys\}
:::note
İsteğe bağlı
Bu adımlar Apple Ads attribution için zorunlu değildir; yalnızca Asapty gibi diğer hizmetlerle veya kendi çözümünüzle çalışmak için gereklidir.
:::
ASA attribution için başka hizmetler ya da kendi çözümünüzü kullanıyorsanız kendi genel-özel anahtar çiftinizi kullanabilirsiniz.
### Adım 1 \{#step-1\}
Terminal'de özel anahtar oluşturun
```text showLineNumbers title="Text"
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
```
Adapty Settings -> Apple Ads bölümünden yükleyin (Upload private key butonu)
### Adım 2 \{#step-2\}
Terminal'de genel anahtar oluşturun
```text showLineNumbers title="Text"
openssl ec -in private-key.pem -pubout -out public-key.pem
```
Bu genel anahtarı, API Account Manager rolüne sahip hesabın Apple Ads ayarlarında kullanabilirsiniz. Böylece oluşturulan Client ID, Team ID ve Key ID değerlerini hem Adapty hem de diğer hizmetler için kullanabilirsiniz.
---
# File: account
---
---
title: "Hesap detayları ve Faturalandırma"
description: "Adapty hesabınızı yönetin ve daha iyi abonelik takibi için ayarları optimize edin."
---
**Account** sayfası; profilinizi, ekip üyelerinizi ve faturalandırmayı yönetmenizi sağlar.
Sayfada üç sekme bulunur:
- [Genel](#general-settings)
- [Abonelik ve Faturalandırma](#billing-info)
- [Üyeler](#members)
Hesap ayarlarınıza erişmek için sağ üst köşedeki **Account** seçeneğine tıklayın ya da [app.adapty.io/account](https://app.adapty.io/account) adresine gidin.
## Genel ayarlar \{#general-settings\}
General sekmesi; profilinizi, hesap ayarlarınızı, görüntüleme tercihlerinizi ve rapor yapılandırmanızı içerir.
- **Profile**: Adınızı, soyadınızı ve şirket adınızı girin. Şirket adı en fazla 256 karakter olabilir.
- **Account settings**: Kayıtlı e-posta adresinizi görüntüleyin ve şifrenizi değiştirin.
- **Date & Time formats**: Tarih ve saatlerin Adapty genelinde nasıl görüntüleneceğini seçin:
- **American format**: January 31, 2022 ve 12 saatlik format (AM/PM)
- **European format**: 31 January, 2022 ve 24 saatlik format (16:00)
- **Email reports**: Uygulamalarınızın biri veya tamamı için günlük, haftalık ya da aylık raporlar ayarlayın. Tüm uygulamalar için özet rapor alın ya da seçtiğiniz her uygulama için ayrıntılı rapor edinin.
## Abonelik & Faturalama \{#billing-info\}
**Subscription & Billing** sekmesi; ödeme bilgilerinizi ve özellik erişiminizi yönetmenizi sağlar:
- Ödeme bilgilerini ekleyin veya güncelleyin
- Faturalama bilgilerini inceleyin
- Ek ücretli özellikler satın alın
[Özellikler ve fiyatlandırma](https://adapty.io/pricing) hakkında daha fazla bilgi edinin.
## Üyeler \{#members\}
Ekip üyelerinizi hesap ayarlarınızdan yönetebilirsiniz. Ekip üyesi eklemek için e-posta adresleriyle davet gönderin ve bir rol atayın.
Ekip üyelerini ve erişim haklarını yönetme hakkında daha fazla bilgi için [buraya](members-settings) bakın.
---
# File: members-settings
---
---
title: "Üyeler"
description: "Adapty'nin kontrol panelinde üye ayarlarını ve izinlerini yönetin."
---
:::note
Bu sayfa, Adapty kontrol paneli üyeleri hakkındadır.
Uygulamanızın kullanıcılarına farklı access level'lar vermek istiyorsanız [Access Level](access-level) sayfasına göz atın.
:::
Adapty kontrol paneli üyelik sistemi, ekip üyelerine farklı düzeylerde erişim izni vermenizi ve her üye için uygulamaları belirlemenizi sağlar.
## Roller \{#roles\}
Adapty kontrol panelinde üyeler için aşağıdaki roller mevcuttur:
| Rol | Faturalandırmaya Erişim | Yeni üye ekleme | Her şeyi değiştirme | Tüm bölümlere erişim |
|-------------|------------------------|-----------------|---------------------|----------------------|
| Owner | ✅ | ✅ | ✅ | ✅ |
| Admin | ❌ | ✅ | ✅ | ✅ |
| Developer | ❌ | ❌ | ✅ | ❌ |
| Viewer | ❌ | ❌ | ❌ | ✅ |
| Support | ❌ | ❌ | ❌ | ❌ |
| ASA manager | ❌ | ❌ | ❌ | ❌ |
- **Owner:** Owner, Adapty hesabının özgün oluşturucusudur ve en yüksek düzeyde erişime ve kontrole sahiptir. Owner'lar Adapty faturalamasına tam erişime sahip olup ödeme bilgilerini ve abonelik planlarını yönetebilir. Bunun yanı sıra, yalnızca Owner'lar ve Admin'ler yeni üyeler için uygulama erişimini belirleyebilir. Her Adapty hesabı için yalnızca bir Owner olabilir.
- **Admin:** Admin rolüne sahip üyeler, seçilen uygulamalara tam erişime sahiptir. Paywall oluşturma ve değiştirme, A/B testi yapma, analitik inceleme ve söz konusu uygulamalardaki üyeleri yönetme gibi çeşitli yönetim görevlerini gerçekleştirebilirler.
- **Developer:** Developer rolüne sahip üyeler, analitik ve hesap üyeleri dışında tüm varlıklara tam erişime sahiptir. Herhangi bir faturalama ayarına erişemezler. Bu rol; paywall, A/B testi ve diğer yapıları kuran, Adapty'yi uygulamanıza entegre eden ancak finansal verilere erişmemesi gereken kişiler için tasarlanmıştır.
- **Viewer:** Viewer rolüne sahip üyeler, seçilen uygulamalara yalnızca okuma erişimine sahiptir. Bilgileri görüntüleyebilirler ancak paywall ve A/B testi oluşturup değiştiremez, diğer özellikleri düzenleyemez, yeni kullanıcı davet edemez, yeni uygulama oluşturamaz ve uygulama ayarlarını değiştiremezler.
- **Support:** Support rolüne sahip üyeler, seçilen uygulamalarda yalnızca kullanıcı profillerine erişebilir. Yeni üye ekleme veya Adapty'nin diğer bölümlerine erişme gibi işlemler gerçekleştiremezler. Bu rol, özellikle abonelikle ilgili soruları olan veya sorun giderme desteğine ihtiyaç duyan müşterilere yardımcı olması gereken destek ekipleri ya da bireyler için uygundur.
- **ASA manager:** ASA manager rolüne sahip üyeler yalnızca [Adapty Ads Manager](adapty-ads-manager) kontrol paneline erişebilir.
## Üye ekle \{#add-a-member\}
Adapty'de 256 takım üyesine kadar davet gönderebilirsiniz. Yeni üye eklemek ücretsizdir.
:::note
Yalnızca Adapty'de henüz kayıtlı olmayan e-posta adreslerini davet edebilirsiniz. Eğer iş arkadaşınızın bağımsız bir hesabı varsa, farklı bir e-posta adresi deneyin ya da mevcut hesabını silmesi için Adapty desteğiyle iletişime geçin.
:::
Takıma yeni üye eklemek için:
1. Sağ üstteki **Account** seçeneğine tıklayın ve **Members** sekmesini açın.
2. **Invite member** seçeneğine tıklayın.
3. Üyenin e-posta adresini girin.
4. Listeden bir [rol](#roles) seçin.
5. Erişim vermek istediğiniz uygulamaları seçin.
6. (İsteğe bağlı) Gelecekte eklenecek uygulamalara otomatik olarak erişim vermek için **Always allow access to new apps** seçeneğini etkinleştirin.
7. **Save** seçeneğine tıklayın.
## Hesap sahipliğini devretme \{#transfer-account-ownership\}
**Hesap sahipliğini** tümüyle devretmeniz gerekiyorsa destek ekibimizle [support@adapty.io](mailto:support@adapty.io) adresinden iletişime geçin.
**Uygulama sahipliğini** devretmeniz gerekiyorsa daha fazla bilgi için [ilgili kılavuzu](transfer-apps) inceleyin.
---
# File: set-up-app-store-connect
---
---
title: "App Store Connect'i Kurma"
description: "İlk kez uygulama geliştirenlere yönelik, Apple Developer Program'a kaydolma ve uygulama içi satın almalar için App Store Connect kurulumu rehberi."
---
**İlk iOS uygulamanızı geliştiriyorsanız**, Adapty'yi entegre etmeden önce Apple Developer hesabınızı ve App Store Connect'i kurmanız gerekir.
:::note
Zaten bir Apple Developer hesabınız ve App Store Connect'te kayıtlı bir uygulamanız varsa bu rehberi atlayıp doğrudan [App Store ile ilk entegrasyon](initial_ios) sayfasına geçebilirsiniz.
:::
## Adım 1. Apple Developer Program'a Kaydolun \{#step-1-enroll-in-apple-developer-program\}
App Store'da uygulama dağıtmak ve uygulama içi satın alma satmak için [Apple Developer Program](https://developer.apple.com/programs/)'a katılmanız gerekir.
### Kayıt türünü seçin \{#choose-enrollment-type\}
Apple iki farklı kayıt türü sunar:
| | Bireysel | Organizasyon |
|-----------------------------------|-----------------------|-----------------------------------|
| **Kimler için** | Bireysel geliştiriciler | Şirketler, ekipler, kar amacı gütmeyenler |
| **D-U-N-S Numarası gerekli mi** | Hayır | Evet |
| **Uygulamalar yayımlanır** | Kendi adınıza | Organizasyonunuzun adına |
| **Ekip yönetimi** | Mevcut değil | Mevcut |
:::tip
Bir organizasyon olarak kaydoluyorsanız **D-U-N-S Numarası**'na ihtiyacınız vardır. Bu, Dun & Bradstreet tarafından verilen benzersiz dokuz haneli bir iş tanımlayıcısıdır. [Organizasyonunuzun zaten bir numaraya sahip olup olmadığını kontrol edebilir](https://developer.apple.com/enroll/duns-lookup/) ya da yeni bir tane talep edebilirsiniz — bağlantı, arama sayfasının altında yer alır. D-U-N-S Numarası almanız 5 iş gününe kadar sürebilir.
:::
### Kaydolun \{#enroll\}
1. [Apple Developer Program kayıt sayfasına](https://developer.apple.com/programs/enroll/) gidin.
2. Apple ID'nizle giriş yapın. Hesabınız yoksa önce oluşturun.
3. Kayıt türünüze (bireysel veya organizasyon) göre adımları takip edin.
4. Yıllık ücreti ödeyin.
Apple kaydınızı işleme aldıktan sonra [App Store Connect](https://appstoreconnect.apple.com)'e erişim sağlarsınız. Kayıt işlemi genellikle 48 saate kadar sürer. Organizasyonlar için D-U-N-S doğrulaması gerekiyorsa daha uzun sürebilir.
## Adım 2. App Store Connect'te uygulamanızı kurun \{#step-2-set-up-your-app-in-app-store-connect\}
Uygulama içi satın alma satabilmek için App Store Connect'te ilk kurulumu tamamlamanız gerekir. Bu; sözleşmeleri imzalamayı, ödeme bilgilerini eklemeyi ve uygulamanızı kaydetmeyi kapsar.
### Paid Applications Sözleşmesini İmzalayın \{#sign-the-paid-applications-agreement\}
App Store'da satış yapabilmek için Apple, Paid Applications Sözleşmesi'ni imzalamanızı zorunlu kılar. Bu durum hem ücretli uygulamalar hem de ücretsiz uygulamalardaki uygulama içi satın almalar için geçerlidir.
1. [App Store Connect](https://appstoreconnect.apple.com/business)'teki **Business** sayfasına gidin.
2. **Paid Apps** sözleşmesini bulun ve **Review and Agree**'ye tıklayın.
3. Gerekli bilgileri tamamlayın:
- **Bankacılık bilgileri**: Apple'ın kazançlarınızı göndereceği bir banka hesabı ekleyin.
- **Vergi bilgileri**: Satış yapmak istediğiniz ülkeler için vergi formlarını doldurun.
- **İletişim bilgileri**: İletişim bilgilerinizi girin.
:::important
Sözleşmenin aktif hale gelebilmesi için üç bölümün de (bankacılık, vergi, iletişim) tamamlanması zorunludur. Sözleşme aktif olana kadar uygulama içi satın alma satamazsınız.
:::
### Bundle ID Oluşturun \{#create-a-bundle-id\}
Bundle ID, uygulamanızı Apple ekosisteminde benzersiz şekilde tanımlar. Uygulamanızı App Store Connect'e kaydetmek ve Adapty entegrasyonunu yapılandırmak için buna ihtiyaç duyarsınız.
1. [Apple Developer portalını](https://developer.apple.com/account) açın.
2. **Certificates, Identifiers & Profiles** → **Identifiers** bölümüne gidin.
3. Yeni bir tanımlayıcı kaydetmek için **+**'ya tıklayın.
4. **App IDs**'i seçin ve **Continue**'ye tıklayın.
5. Tür olarak **App**'i seçin ve **Continue**'ye tıklayın.
6. Alanları doldurun:
- **Description**: Bu Bundle ID'yi tanımanıza yardımcı olacak bir ad (örneğin, "My Subscription App").
- **Bundle ID**: **Explicit**'i seçin ve ters domain formatında benzersiz bir tanımlayıcı girin (örneğin, `com.yourcompany.yourapp`).
7. **Capabilities** bölümünde aşağı kaydırın ve **In-App Purchase**'ı işaretleyin.
8. **Continue**'ye, ardından **Register**'a tıklayın.
### Uygulamanızı App Store Connect'e kaydedin \{#register-your-app-in-app-store-connect\}
1. [App Store Connect](https://appstoreconnect.apple.com/apps)'teki **Apps** sayfasına gidin.
2. **+** → **New App**'e tıklayın.
3. Gerekli alanları doldurun:
- **Platforms**: **iOS**'u seçin.
- **Name**: App Store'da görünecek uygulama adınız.
- **Primary language**: Uygulama meta verilerinizin varsayılan dili.
- **Bundle ID**: Önceki adımda oluşturduğunuz Bundle ID'yi seçin.
- **SKU**: Uygulamanız için benzersiz bir tanımlayıcı (kullanıcılara görünmez). Örneğin, `my_subscription_app_2025`.
4. **Create**'e tıklayın.
Uygulamanız artık App Store Connect'e kayıtlıdır ve Adapty entegrasyonuna hazırdır.
## Sırada ne var \{#whats-next\}
- [App Store ile ilk entegrasyon](initial_ios): App Store uygulamanızı Adapty'ye bağlayın
- [SDK entegrasyonu](quickstart-sdk): Adapty SDK'yı uygulama kodunuza entegre edin
- [Sandbox testi](test-purchases-in-sandbox): Uygulama içi satın almalarınızı yayınlamadan önce test edin
- [iOS uygulamanızı App Store'a gönderin](submit-app-to-app-store): Derlemenizi yükleyin ve Apple incelemesi için gönderin
- [App Store Küçük İşletme Programı](app-store-small-business-program): App Store komisyonunuzu %30'dan %15'e düşürün
---
# File: app-store-products
---
---
title: "App Store'da Ürün"
description: "Adapty'nin abonelik araçlarını kullanarak App Store ürünlerini verimli şekilde yönetin."
---
Bu sayfa, App Store Connect'te ürün oluşturma konusunda rehberlik sağlar. Bu bilgiler doğrudan Adapty'nin işlevselliğiyle ilgili olmasa da, App Store Connect hesabınızda ürün oluştururken karşılaştığınız sorunlarda işinize yarayabilir.
Adapty'ye bağlanacak bir ürün oluşturmak için:
1. **App Store Connect**'i açın. Sol taraftaki menüden [**Monetization** → **Subscriptions**](https://appstoreconnect.apple.com/apps/6477523342/distribution/subscriptions) bölümüne gidin.
2. Henüz bir abonelik grubu oluşturmadıysanız, **Subscription Groups** başlığının altındaki **Create** düğmesine tıklayarak işlemi başlatın. App Store Connect'teki [Subscription Groups](https://developer.apple.com/help/app-store-connect/manage-subscriptions/offer-auto-renewable-subscriptions), ürünlerinizi kategorilere ayırır ve yönetir; kullanıcıların farklı teklifler arasında sorunsuz geçiş yapmasını sağlar. Bir aboneliği grup dışında oluşturmanın mümkün olmadığını unutmayın.
3. Açılan **Create Subscription Group** penceresinde, **Reference Name** alanına yeni bir abonelik grubu adı girin. Referans adı, uygulamanızdaki farklı abonelik gruplarını ayırt etmenize ve yönetmenize yardımcı olan, sizin belirlediğiniz bir etiket veya tanımlayıcıdır.
Referans adı kullanıcılara görünmez; yalnızca dahili kullanım ve organizasyon amacıyla tasarlanmıştır. App Store Connect arayüzünde abonelik gruplarını yönetirken belirli gruplara kolayca başvurmanızı sağlar. Özellikle birden fazla abonelik teklifiniz varsa ya da bunları uygulamanızın yapısına uygun bir şekilde kategorize etmek istiyorsanız bu özellik oldukça kullanışlıdır.
4. Abonelik grubunun oluşturulmasını onaylamak için **Create** düğmesine tıklayın.
5. Abonelik grubu oluşturulur ve açılır. Artık grup içinde abonelikler oluşturabilirsiniz. **Subscriptions** başlığının altındaki **Create** düğmesine tıklayın. Mevcut bir gruba yeni abonelik ekleyecekseniz, **Subscriptions** başlığının yanındaki **Plus** düğmesine tıklayın.
6. Açılan **Create Subscription** penceresinde, **Reference Name** alanına abonelik adını ve **Product ID** alanına aboneliğe ait benzersiz kodu girin.
Referans adı, App Store Connect içindeki uygulama içi aboneliğiniz için özel bir tanımlayıcı işlevi görür. App Store'da kullanıcılara görünmez. Oluşturmak istediğiniz aboneliği doğru şekilde tanımlayan, anlaşılır ve okunabilir bir açıklama kullanmanızı öneririz. Bu adın 64 karakteri geçmemesi gerektiğini unutmayın.
Product ID, geliştirme aşamasında ürününüze erişmek ve uygulama içi abonelikleri yönetmek üzere tasarlanmış bir servis olan Adapty ile senkronize etmek için gerekli olan benzersiz bir alfanümerik tanımlayıcıdır. Product ID'de yalnızca alfanümerik karakterlere, noktalara ve alt çizgilere izin verilir.
7. Aboneliğin oluşturulmasını onaylamak için **Create** düğmesine tıklayın.
8. Abonelik oluşturulur ve açılır. Şimdi **Subscription Duration** listesinden aboneliğin süresini seçin. Abonelik süresi abonelik adında belirtilmiş olsa bile **Subscription Duration** alanını doldurmayı unutmayın.
9. Sıra abonelik fiyatını belirlemeye geldi. Bunun için Subscription Prices başlığının altındaki **Add Subscription Price** düğmesine tıklayın. Bu düğmeyi bulmak için sayfayı aşağı kaydırmanız gerekebilir.
10. Açılan **Subscription Price** penceresinde, **Country or Region** listesinden temel ülkeyi ve **Price** listesinden temel para birimini seçin. Apple daha sonra bu temel fiyata ve güncel döviz kurlarına dayanarak tüm 175 ülke veya bölge için fiyatları otomatik olarak hesaplayacaktır.
11. **Next** düğmesine tıklayın. Açılan **Price by Country or Region** penceresinde tüm ülkeler için otomatik olarak yeniden hesaplanmış fiyatları göreceksiniz. İsterseniz bunları değiştirebilirsiniz.
12. Bölgesel fiyatları güncelledikten sonra pencerenin altındaki **Next** düğmesine tıklayarak devam edin.
13. Açılan **Confirm Subscription Price?** penceresinde nihai fiyatları dikkatlice inceleyin. Fiyatları düzeltmek için **Back** düğmesine tıklayarak **Price by Country or Region** penceresine geri dönebilir ve güncelleyebilirsiniz. Fiyatlardan memnunsanız **Confirm** düğmesine tıklayın.
14. **Confirm Subscription Price?** penceresini kapattıktan sonra abonelik penceresindeki **Save** düğmesine tıklamayı unutmayın. Bu adımı atlarsanız abonelik oluşturulmaz ve girdiğiniz tüm veriler kaybolur.
Şimdiye kadar anlatılan adımların Otomatik Yenilenebilir Abonelik yapılandırmasına odaklandığını belirtmek gerekir. Ancak diğer türde uygulama içi satın alma işlemleri kurmak istiyorsanız, kenar çubuğunda "Subscriptions" yerine **In-App Purchases** sekmesine tıklayabilirsiniz. Bu, çeşitli uygulama içi satın alma türlerini yönetip oluşturabileceğiniz bölüme yönlendirecektir.
### Ürünleri Adapty'ye Ekleyin \{#add-products-to-adapty\}
Uygulama içi satın alımlarınızı, aboneliklerinizi ve tekliflerinizi App Store Connect'e eklemeyi tamamladıktan sonra, bir sonraki adım [bu ürünleri Adapty'ye eklemektir](create-product).
---
# File: apple-app-privacy
---
---
title: "Apple Uygulama Gizliliği"
description: "Apple uygulama gizlilik politikalarını ve bunların abonelik uygulamanıza etkisini anlayın."
---
Apple, hem App Store Connect'teki **App Privacy** bölümünde hem de uygulama manifest dosyası olarak tüm yeni uygulamalar ve uygulama güncellemeleri için gizlilik bildirimi zorunlu kılmaktadır. Adapty, uygulamanızın üçüncü taraf bir bağımlılığı olduğundan, Adapty'yi kullanıcı verileriyle nasıl kullandığınızı bildirmeniz gerekir.
## Apple uygulama gizlilik manifest'i \{#apple-app-privacy-manifest\}
`PrivacyInfo.xcprivacy` adlı [gizlilik manifest dosyası](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests), uygulamanızın hangi özel verileri kullandığını ve neden kullandığını açıklar. Her uygulama sahibi olarak uygulamanız için bir manifest dosyası oluşturmanız gerekir. Ayrıca ek SDK'lar entegre ediyorsanız, [gizlilik manifest'i ve imza gerektiren SDK'lar](https://developer.apple.com/support/third-party-SDK-requirements/) listesinde yer alanların manifest dosyalarının dahil edildiğinden emin olun. Uygulamanızı derlediğinizde Xcode tüm bu manifest dosyalarını alıp tek bir dosyada birleştirir.
Adapty, [gizlilik manifest'i ve imza gerektiren SDK'lar](https://developer.apple.com/support/third-party-SDK-requirements/) listesinde yer almasa da kolaylık sağlaması açısından Adapty SDK'nın 2.10.2 ve üzeri sürümleri bu dosyayı içermektedir. Manifest'i edinmek için SDK'yı güncellediğinizden emin olun.
Adapty, uygulama gizlilik raporu olarak da bilinen manifest dosyasına herhangi bir veri eklenmesini zorunlu kılmasa da takip amacıyla Adapty'nin `customerUserId` özelliğini kullanıyorsanız bunu manifest dosyanızda şu şekilde belirtmeniz gerekmektedir:
1. Gizlilik bilgileri dosyanızdaki `NSPrivacyCollectedDataTypes` dizisine bir sözlük ekleyin.
2. Sözlüğe `NSPrivacyCollectedDataType`, `NSPrivacyCollectedDataTypeLinked` ve `NSPrivacyCollectedDataTypeTracking` anahtarlarını ekleyin.
3. `NSPrivacyCollectedDataTypes` sözlüğünüzdeki `NSPrivacyCollectedDataType` anahtarı için `NSPrivacyCollectedDataTypeUserID` dizesini ekleyin ([Manifest dosyasında bildirilecek veri kategorileri ve türleri listesi](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests#Describe-the-data-your-app-or-third-party-SDK-collects)ndeki `UserID` veri türünün tanımlayıcısıdır).
4. `NSPrivacyCollectedDataTypes` sözlüğünüzdeki `NSPrivacyCollectedDataTypeTracking` ve `NSPrivacyCollectedDataTypeLinked` anahtarları için `true` değerini ekleyin.
5. `NSPrivacyCollectedDataTypes` sözlüğünüzdeki `NSPrivacyCollectedDataTypePurposes` anahtarının değeri olarak `NSPrivacyCollectedDataTypePurposeProductPersonalization` dizesini kullanın.
Paywall'larınızı özel niteliklere sahip kitlelere hedefliyorsanız, kullandığınız özel nitelikleri ve bunların [manifest dosyasında bildirilecek veri kategorileri ve türleriyle](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests) eşleşip eşleşmediğini dikkatlice değerlendirin. Eşleşiyorsa her veri türü için yukarıdaki adımları tekrarlayın.
Topladığınız tüm veri türlerini ve kategorilerini bildirdikten sonra, [Apple dokümantasyonunda](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests#Create-your-apps-privacy-report) açıklandığı şekilde uygulamanızın gizlilik raporunu oluşturun.
## App Store Connect'te Apple uygulama gizlilik bildirimi \{#apple-app-privacy-disclosure-in-app-store-connect\}
1. [App Store Connect](https://appstoreconnect.apple.com/)'te uygulamanızı açın ve **App Privacy** bölümüne gidin. **Get Started** düğmesine tıklayın.
2. **Yes, we collect data from this app** seçeneğini seçin ve **Next** düğmesine tıklayın.
### Veri türleri \{#data-types\}
Aşağıdaki tablo, Apple'ın bildirmenizi zorunlu kıldığı veri türlerini ve Adapty'nin hangilerine ihtiyaç duyduğunu göstermektedir. **Bu yalnızca Adapty'yi kapsamaktadır.** Uygulamanız başka SDK'lar veya kendi kodunuz aracılığıyla ek veri topluyorsa bu veri türlerini de seçin.
✅ = Adapty tarafından zorunlu
👀 = Gerekli olabilir (ayrıntılar için aşağıya bakın)
❌ = Adapty tarafından zorunlu değil — uygulamanız bu veriyi başka yollarla topluyorsa seçin
| Veri türü | Zorunlu | Not |
|---------------------------------------------------------------------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Tanımlayıcılar | ✅ | Kullanıcıları customerUserId ile tanımlıyorsanız 'User ID' seçeneğini seçin.
Adapty IDFA topladığından 'Device ID' seçeneğini seçmeniz gerekir.
| | Satın Almalar | ✅ | Adapty, kullanıcılardan satın alma geçmişi toplar. | | Ad, telefon numarası veya e-posta adresi gibi İletişim Bilgileri | 👀 | **`updateProfile`** yöntemiyle ad, telefon numarası veya e-posta adresi gibi kişisel veriler iletiyorsanız zorunludur. | | Kullanım Verileri | 👀 | Amplitude, Mixpanel, AppMetrica veya Firebase gibi analiz SDK'ları kullanıyorsanız gerekebilir. | | Konum | ❌ | Adapty hassas konum verisi toplamaz. Uygulamanız topluyorsa seçin. | | Sağlık & Fitness | ❌ | Adapty sağlık veya fitness verisi toplamaz. Uygulamanız topluyorsa seçin. | | Hassas Bilgi | ❌ | Adapty hassas bilgi toplamaz. Uygulamanız topluyorsa seçin. | | Kullanıcı İçeriği | ❌ | Adapty kullanıcı içeriği toplamaz. Uygulamanız topluyorsa seçin. | | Tanılama | ❌ | Adapty tanılama verisi toplamaz. Uygulamanız topluyorsa seçin. | | Tarama Geçmişi | ❌ | Adapty tarama geçmişi toplamaz. Uygulamanız topluyorsa seçin. | | Arama Geçmişi | ❌ | Adapty arama geçmişi toplamaz. Uygulamanız topluyorsa seçin. | | Kişiler | ❌ | Adapty kişi listesi toplamaz. Uygulamanız topluyorsa seçin. | | Finansal Bilgi | ❌ | Adapty finansal bilgi toplamaz. Uygulamanız topluyorsa seçin. | ### Zorunlu veri türleri \{#required-data-types\} #### Satın Almalar \{#purchases\} Adapty kullanırken uygulamanızın **Satın Alma Geçmişi** topladığını bildirmeniz zorunludur.
#### Tanımlayıcılar \{#identifiers\}
Adapty kullanırken aşağıdaki tanımlayıcıları bildirmeniz zorunludur:
- **Device ID** — Adapty IDFA toplar.
- **User ID** — kullanıcıları **`customerUserId`** ile tanımlıyorsanız zorunludur.
### Veri kullanımı \{#data-usage\}
**Veri türlerini** kaydettikten sonra verilerin nasıl kullanıldığını belirtmeniz gerekir:
1. **Purchases** bloğunun içindeki **Set up purchase history** seçeneğine tıklayın.
2. Apple, satın alma geçmişi verilerinin nasıl kullanıldığını sorduğunda Adapty için aşağıdakileri seçin:
- **Analytics** — Adapty, satın alma geçmişini gelir analitiği, kohortlar ve metrikler için kullanır.
- **Product Personalization** — Adapty, satın alma verilerini kitle segmentasyonu ve paywall hedefleme için kullanır.
- **App Functionality** — Adapty, satın almaları doğrular, access level'ları yönetir ve abonelik durumunu takip eder.
Uygulamanız satın alma verilerini başka amaçlarla kullanıyorsa (örneğin Adapty entegrasyonları aracılığıyla satın alma olaylarını reklam platformlarına gönderiyorsanız) ek amaçları da seçin.
3. **Next** düğmesine tıklayın.
4. **Device ID** ve **User ID** (kullanılıyorsa) için:
1. **User/Device ID** bloğunun içindeki **Set up user/device ID** seçeneğine tıklayın.
2. Apple, tanımlayıcı verilerinin nasıl kullanıldığını sorduğunda Adapty için aşağıdakileri seçin:
- **App Functionality** — Adapty, kullanıcı profillerini yönetmek, satın almaları ilişkilendirmek ve access level'ları takip etmek için tanımlayıcıları kullanır.
Adapty entegrasyonları aracılığıyla attribution verilerini üçüncü taraf platformlara (AppsFlyer veya Adjust gibi) gönderiyorsanız **Third-Party Advertising** seçeneğini de seçin. Uygulamanız tanımlayıcıları başka amaçlarla kullanıyorsa ek amaçları da seçin.
5. **Next** düğmesine tıklayın.
---
# File: apple-family-sharing
---
---
title: "Apple Aile Paylaşımı"
description: "Paylaşılan abonelikleri desteklemek için Adapty'de Apple Aile Paylaşımı'nı etkinleştirin."
---
Apple'ın aile paylaşımı özelliği, uygulama içi satın alımların aile üyeleri arasında paylaşılmasını sağlar. Video akış hizmetleri ve çocuk uygulamaları gibi grup odaklı uygulamaların kullanıcılarına, Apple ID'lerini paylaşmak zorunda kalmadan abonelikleri bölüşmenin kolay bir yolunu sunar. Beş adede kadar aile üyesinin bir aboneliği kullanabilmesine olanak tanıyan [Aile Paylaşımı](https://developer.apple.com/documentation/storekit/supporting-family-sharing-in-your-app), uygulamanızda müşteri etkileşimini ve elde tutma oranını artırabilir.
Bu kılavuzda, abonelikleri Aile Paylaşımı'na nasıl dahil edeceğinizi ve Adapty'nin aile içinde paylaşılan satın almaları nasıl yönettiğini açıklayacağız.
Belirli bir ürün için Aile Paylaşımı'nı etkinleştirmeye başlamak için [App Store Connect](https://appstoreconnect.apple.com/)'e gidin. Aile Paylaşımı, hem yeni hem de mevcut uygulama içi satın almalar için varsayılan olarak kapalıdır; bu nedenle her uygulama içi satın alma için ayrı ayrı etkinleştirmeniz gerekir. Bunu kolayca yapmak için **uygulamanızın sayfasına** gidin, ilgili uygulama içi satın alma sayfasına geçin ve Aile Paylaşımı bölümündeki **Turn On** seçeneğini belirleyin.
Family Sharing'i bir ürün için etkinleştirdiğinizde, **bir daha kapatılamayacağını** unutmayın; çünkü bu, aboneliğini aile üyeleriyle paylaşmış olan kullanıcıların deneyimini olumsuz etkiler.
Ayrıca, yalnızca non-consumable ürünlerin ve aboneliklerin paylaşılabildiğini göz önünde bulundurun.
Görüntülenen modalda kurulum işlemini tamamlamak için **Confirm** düğmesine tıklayın. Bunu yaptıktan sonra, Aile Paylaşımı bölümünün "This subscription can be shared by everyone in a family group." mesajını gösterecek şekilde güncellenmesi gerekir. Bu, aboneliğin artık Aile Paylaşımı için etkinleştirildiğini ve beş adede kadar aile üyesiyle paylaşılabildiğini doğrular.
Adapty, Family Sharing desteğini fazladan bir çaba gerektirmeden kolayca sağlar. Tek yapmanız gereken [ürünlerinizi](app-store-products) App Store üzerinden yapılandırmak; App Store Connect'te **Family Sharing**'i **etkinleştirdiğinizde** bu özellik **Adapty**'de otomatik olarak kullanılabilir hale gelir ve webhook üzerinden bir event olarak alınır.
:::note
Family Sharing'in sandbox ortamında desteklenmediğini lütfen unutmayın.
:::
Göz önünde bulundurulabilecek bir nokta şu: kullanıcı bir abonelik satın alıp aile üyeleriyle paylaştığında, aboneliğin onlara ulaşması **bir saate kadar gecikebilir**. Apple bu gecikmeyi, kullanıcının fikrini değiştirip isterse paylaşımı geri alabilmesi için tasarladı. Ancak abonelik yenilendiğinde, aile üyelerine erişimin sağlanmasında herhangi bir gecikme yaşanmaz.
Bir kullanıcı Aile Paylaşımlı bir uygulama içi ürün satın aldığında, işlem makbuzunda normalde göründüğü gibi yer alır; ancak buna ek olarak `PURCHASED` değerine sahip `in_app_ownership_type` adında yeni bir alan eklenir. Bunun yanı sıra, tüm aile üyeleri için yeni bir işlem oluşturulur. Bu işlem, orijinal satın alma işlemine kıyasla farklı bir `web_order_line_item_id` ve `original_transaction_id` değerine sahip olur; ayrıca `FAMILY_SHARED` değerine sahip bir `in_app_ownership_type` alanı içerir.
Doğru gelir hesabı için Adapty analizlerinde yalnızca `in_app_ownership_type` değeri `PURCHASED` olan işlemler sayılır. `FAMILY_SHARED` işlemleri gelir ve dönüşüm metriklerinden hariç tutulur.
**Aile Paylaşımı işlemleri için gönderilen olaylar.**
`FAMILY_SHARED` işlemleri yalnızca **Access level updated** olayını tetikler. Ürün bazındaki abonelik olayları aile üyeleri için tetiklenmez.
| Olay | `FAMILY_SHARED` | `PURCHASED` |
| --- | --- | --- |
| **Access level updated** | Evet | Evet |
| **Subscription started** | Hayır | Evet |
| **Trial started** | Hayır | Evet |
| **Subscription renewed** | Hayır | Evet |
| **Subscription expired** | Hayır | Evet |
| **Subscription refunded** | Hayır | Evet |
| **Billing issue detected** | Hayır | Evet |
Downstream analitiğiniz **Subscription started** olayına dayanıyorsa, aile üyeleri bu olayda görünmez. Aktif aile üyelerini tespit etmek için **Access level updated** olayını kullanın.
Adapty'deki diğer aile üyelerini tespit etmek için event detaylarına bakabilirsiniz. Önce orijinal aile satın alma işlemini bulun. Ardından söz konusu işlemin event detaylarını inceleyerek aynı ürünü, satın alma tarihini ve bitiş tarihini arayın. Event detaylarını analiz ederek orijinal satın alma işlemiyle ilişkili diğer aile üyeliği işlemlerini tespit edebilirsiniz.
---
# File: app-store-small-business-program
---
---
title: "App Store Küçük İşletme Programı"
description: "Apple'ın Küçük İşletme Programı'nı, gelirleriniz üzerindeki etkisini ve Adapty'nin analizlerini anlayın"
---
:::link
Play Store'daki karşılık gelen program için bkz. [Google İndirimli Hizmet Ücreti](google-reduced-service-fee).
:::
1 milyon ABD Dolarına kadar yıllık App Store geliri elde eden kuruluşlar, Apple'ın [Küçük İşletme programına](https://developer.apple.com/app-store/small-business-program/) katılmaya hak kazanır. Programa kaydolursanız, standart %30 mağaza komisyon oranı **%15'e** indirilir.
Program üyeleri, doğru gelir hesaplamaları ve entegrasyon etkinliği işleme süreçlerinin sağlanması için **Adapty ayarlarını değiştirmelidir**.
---
title: "App Store Küçük İşletme Programı"
description: "Küçük İşletme Programı için Adapty'yi nasıl yapılandıracağınızı ve programa nasıl başvuracağınızı öğrenin."
metadataTitle: "App Store Küçük İşletme Programı | Adapty Dokümanları"
---
Bu makale şunları açıklar:
* [Uygulamanız Küçük İşletme Programı'na kayıtlıysa Adapty'yi nasıl yapılandırırsınız](#configure-adapty)
* [Mağaza komisyonunuzu düşürmek istiyorsanız programa nasıl başvurursunuz](#apply-for-the-program)
## Adapty'yi Yapılandırma \{#configure-adapty\}
Adapty, indirimli komisyon oranını [analizlerinize](analytics) ve [entegrasyon etkinliklerinize](analytics-integration) uygulayabilir. Bunu etkinleştirmek için Küçük İşletme Programı durumunuzu uygulama bazında belirtin.
:::warning
SBP durumunuzu Adapty'de **onay aldığınız anda** yapılandırın. Geç yapılan değişiklikler, iletilmiş webhook etkinliklerini yeniden yazamaz ([ayrıntılar](#retroactive-setting-changes)).
:::
1. [**App Settings** → **General**](https://app.adapty.io/account) sayfasını açın.
2. **Small Business Program** bölümünü bulun.
3. **Add period** düğmesine tıklayın.
4. Üyelik başlangıç tarihini seçin.
5. Bitiş tarihi seçin ya da bu durumu süresiz olarak uzatmak için **At the current moment** onay kutusunu etkinleştirin. İleride [uygunluğu kaybederseniz](#losing-eligibility) bitiş tarihini değiştirebilirsiniz.
6. **Apply** düğmesine tıklayın.
Kuruluşunuz programa uygun olmaya devam ederse üyelik bir sonraki takvim yılına aktarılır. Ancak üyelik durumu yalnızca **belirttiğiniz tarih aralığına** uygulanır.
* Yeni bir üyelik dönemi eklemek için **Add period** düğmesine tıklayın.
* Bu durumu süresiz olarak uzatmak için **At the current moment** onay kutusunu etkinleştirin.
Yapılandırmanızı doğrulamak için [Gelir grafiğini](revenue) açın ve **Proceeds after store commission** seçeneğini seçin. Görüntülenen gelirin indirimli komisyon oranını yansıttığını onaylayın.
## Programa Başvurun \{#apply-for-the-program\}
### Uygunluk gereksinimleri \{#eligibility-requirements\}
Apple, SBP uygunluğunu **yıllık gelirinize** göre belirler; bu, önceki takvim yılının mağaza komisyonu ve vergiler **düşüldükten sonraki** satışlarıdır.
Uygun olmak için kuruluşunuzun ve
2. **Create subscription** düğmesine tıklayın.
3. Açılan **Create subscription** penceresinde, **Product ID** alanına abonelik kimliğini ve **Name** alanına abonelik adını girin.
Ürün kimliği benzersiz olmalı, bir rakam veya küçük harfle başlamalı; alt çizgi (\_) ve nokta (.) karakterlerini de içerebilir. Geliştirme sürecinde ürününüze erişmek ve Adapty ile senkronize etmek için kullanılır. Bir Ürün Kimliği Google Play Console'da bir ürüne atandıktan sonra, ürün silinse bile başka uygulamalar için yeniden kullanılamaz.
Ürün kimliğinizi adlandırırken standart bir format takip etmeniz önerilir. Daha kısa bir yaklaşım kullanarak ürünü `
3. Abonelik detayları açıldıktan sonra **Base plans and offers** başlığının altındaki **Add base plan** düğmesine tıklayın. Bulmak için aşağı kaydırmanız gerekebilir.
4. Açılan **Add base plan** penceresinde, **Plan ID** alanına temel plan için benzersiz bir tanımlayıcı girin. Bir rakam veya küçük harfle başlamalı; rakamlar (0-9), küçük harfler (a-z) ve kısa çizgi (-) içerebilir. Gerekli alanları doldurun.
5. Bölgeye göre fiyatları belirtin.
6. Kurulumu tamamlamak için **Save** düğmesine tıklayın.
7. Temel planı etkin hale getirmek için **Activate** düğmesine tıklayın.
Adapty'de abonelik ürünlerinin yalnızca tek bir temel planı olabileceğini ve bu planın tutarlı bir süre ile yenileme türüne sahip olması gerektiğini unutmayın.
### Yedek ürünler \{#fallback-products\}
:::warning
Geriye dönük uyumsuz temel planlar için destek
Adapty SDK'larının eski sürümleri, Google Billing Library v5+ özelliklerini (özellikle abonelik başına birden fazla temel plan ve teklifler) desteklemez. Google Play Console'da **[backwards compatible](https://support.google.com/googleplay/android-developer/answer/12124625?hl=en#backwards_compatible)** olarak işaretlenen temel planlara yalnızca bu SDK sürümleriyle erişilebilir. Abonelik başına yalnızca bir temel plan geriye dönük uyumlu olarak işaretlenebilir.
:::
Adapty'deki gelişmiş Google abonelik yapılandırmalarından ve özelliklerinden tam olarak yararlanmak için geriye dönük uyumlu bir yedek ürün kurma imkânı sunuyoruz. Bu yedek ürün, yalnızca eski Adapty SDK sürümlerini kullanan uygulamalar için kullanılır. Google Play ürünleri oluştururken artık ürünün Play Console'da geriye dönük uyumlu olarak işaretlenip işaretlenmeyeceğini belirtme seçeneğiniz bulunmaktadır. Adapty bu bilgiyi, ürünün SDK'nın eski sürümleriyle (2.5 ve altı) satın alınıp alınamayacağını belirlemek için kullanır.
Örneğin, iki temel plan sunan `subscription.premium` adında bir aboneliğiniz olduğunu varsayalım: haftalık (geriye dönük uyumlu) ve aylık. Adapty'ye `subscription.premium:weekly` ürünü eklerseniz, geriye dönük uyumlu bir ürün belirtmeniz gerekmez. Ancak `subscription.premium:monthly` ürünü söz konusu olduğunda, geriye dönük uyumlu bir ürün belirtmeniz gerekir. Bunu yapmazsanız, Google 4. faturalandırma kütüphanesinde istemeden `subscription.premium:weekly` ürünü satın alınabilir. Bu senaryoyu çözmek için, temel planı da aylık olan ve geriye dönük uyumlu olarak işaretlenmiş ayrı bir ürün oluşturmanız gerekir. Bu sayede `subscription.premium:monthly` seçeneğini belirleyen kullanıcılar, doğru sıklıkta faturalandırılır.
## Adapty'ye ürün ekleme \{#add-products-to-adapty\}
App Store Connect'te uygulama içi satın almalarınızı, aboneliklerinizi ve tekliflerinizi eklemeyi tamamladıktan sonra, bir sonraki adım [bu ürünleri Adapty'ye eklemektir](create-product).
---
# File: google-play-data-safety
---
---
title: "Google Play Veri Güvenliği"
description: "Adapty'de Google Play Veri Güvenliği politikalarıyla uyumluluğu sağlayın."
---
Google Play'de bulunan Veri Güvenliği bölümü, uygulama geliştiricilerin uygulamaları tarafından toplanan veya paylaşılan veriler ile uygulamalarının kritik gizlilik ve güvenlik önlemleri hakkında kullanıcıları bilgilendirmeleri için basit bir yöntem sunar. Bu bilgiler, kullanıcıların hangi uygulamaları indirip kullanacakları konusunda daha bilinçli kararlar vermesini sağlar.
Aşağıda, Adapty'nin topladığı veriler hakkında Google Play'e gerekli bilgileri sağlamanıza yardımcı olacak kısa bir kılavuz bulunmaktadır.
## Veri Toplama ve Güvenlik \{#data-collection-and-security\}
**Uygulamanız gerekli kullanıcı verisi türlerinden herhangi birini topluyor veya paylaşıyor mu?**
Adapty kullanıcının satın alma geçmişini topladığından 'Evet'i seçin.
**Uygulamanız tarafından toplanan tüm kullanıcı verileri aktarım sırasında şifreleniyor mu?**
Adapty verileri aktarım sırasında şifrelediğinden 'Evet'i seçin.
**Kullanıcılara verilerinin silinmesini talep etmeleri için bir yol sunuyor musunuz?**
'Evet'i seçiyorsanız, müşterilerinizin veri silme talebinde bulunmak için destek ekibinizle iletişime geçebilmesini sağlayın. Müşteriyi doğrudan Adapty kontrol panelinden veya REST API aracılığıyla silebilirsiniz.
## Veri Türleri \{#data-types\}
Aşağıda Google'ın raporlama için gerektirdiği veri türlerinin listesi yer almakta olup Adapty'nin her bir veri türünü toplayıp toplamadığını belirttik.
| Veri Türü | Detaylar |
| :--------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Konum | Adapty tarafından toplanmaz |
| Sağlık ve Fitness | Adapty tarafından toplanmaz |
| Fotoğraflar ve Videolar | Adapty tarafından toplanmaz |
| Dosyalar ve Belgeler | Adapty tarafından toplanmaz |
| Takvim | Adapty tarafından toplanmaz |
| Kişiler | Adapty tarafından toplanmaz |
| Kullanıcı İçeriği | Adapty tarafından toplanmaz |
| Tarama Geçmişi | Adapty tarafından toplanmaz |
| Arama Geçmişi | Adapty tarafından toplanmaz |
| Uygulama Bilgisi ve Performansı | Adapty tarafından toplanmaz |
| Web Tarama | Adapty tarafından toplanmaz |
| İletişim Bilgileri | Adapty tarafından toplanmaz |
| Finansal Bilgiler | Adapty kullanıcıların satın alma geçmişini toplar |
| Kişisel Bilgiler ve Tanımlayıcılar | Adapty, Adapty SDK'ya açıkça iletmeniz durumunda Kullanıcı Kimliği ve ad, e-posta adresi, telefon numarası vb. dahil diğer tanımlayıcı iletişim bilgilerini toplar. |
| Cihaz ve Diğer Tanımlayıcılar | Adapty cihaz kimliğine ilişkin verileri toplar. |
## Veri Kullanımı ve İşleme \{#data-usage-and-handling\}
### Kullanıcı Kimlikleri \{#user-ids\}
**1. Bu veriler toplanıyor mu, paylaşılıyor mu, yoksa her ikisi de mi?**
Bu veriler Adapty tarafından toplanmaktadır. Adapty ile hizmet sağlayıcı sayılmayan üçüncü taraflar arasında kurulu entegrasyonlar kullanıyorsanız, buraya "Paylaşıldı" seçeneğini de eklemeniz gerekebilir.
**2. Bu veriler geçici olarak mı işleniyor?**
'Hayır'ı seçin.
**3. Bu veri toplama uygulamanız için zorunlu mu, yoksa kullanıcılar toplanıp toplanmayacağını seçebilir mi?**
Bu veri toplama zorunludur ve kapatılamaz.
**4. Bu kullanıcı verisi neden toplanıyor? / Bu kullanıcı verisi neden paylaşılıyor?**
'App functionality' ve 'Analytics' onay kutularını seçin.
### Finansal Bilgiler \{#financial-info\}
Adapty kullanıyorsanız, Google Play Console'daki Veri türleri bölümünde uygulamanızın 'Purchase history' bilgilerini topladığını bildirmeniz zorunludur.
### Cihaz veya Diğer Kimlikler \{#device-or-other-ids\}
## Sonraki Adımlar \{#next-steps\}
Veri güvenliği seçimlerinizi yaptıktan sonra Google, uygulamanızın gizlilik bölümünün önizlemesini gösterecektir. Daha önce belirtildiği gibi "Financial Info" ve "Device or other IDs" seçeneklerini işaretlediyseniz, gizlilik bilgileriniz aşağıdaki örneğe benzer şekilde görünecektir.
Uygulamanızı App Review için göndermeye hazırsanız, uygulamanızı göndermeye hazırlamayla ilgili daha fazla yönlendirme için [Yayın Kontrol Listesi](release-checklist) belgemize başvurun.
---
# File: google-reduced-service-fee
---
---
title: "Google İndirimli Hizmet Ücreti"
description: "Google'ın İndirimli Hizmet Ücreti'ni, gelirinize ve Adapty analizlerine etkisini anlayın"
---
:::link
App Store'daki karşılığı için bkz. [App Store Küçük İşletme Programı](app-store-small-business-program).
:::
Google Play'in [İndirimli Hizmet Ücreti programı](https://support.google.com/googleplay/android-developer/answer/112622?hl=en), yıllık kazancınızın ilk 1 milyon ABD Doları'na uygulanan komisyonu %30'dan **%15**'e düşürür. Aynı takvim yılı içinde 1 milyon ABD Doları'nı aşan kazançlar standart %30 oranında ücretlendirilir.
:::note
1 Ocak 2022'den itibaren Google, bu programdan bağımsız olarak tüm otomatik yenilenen aboneliklerden %15 komisyon almaktadır. İndirimli Hizmet Ücreti programı ağırlıklı olarak abonelik dışı uygulama içi satın alımları ve ücretli uygulamaları kapsamaktadır.
:::
Program üyelerinin doğru gelir hesaplamaları ve entegrasyon event işlemleri için **Adapty ayarlarını değiştirmeleri** gerekmektedir.
Bu makale şunları açıklar:
* [Uygulamanız İndirimli Hizmet Ücreti programına kayıtlıysa Adapty nasıl kurulur](#configure-adapty)
* [Mağaza komisyonunu azaltmak istiyorsanız programa nasıl kaydolunur](#enroll-in-the-program)
## Adapty'yi Yapılandırın \{#configure-adapty\}
Adapty, indirimli komisyon oranını [analitik](analytics) ve [entegrasyon etkinliklerinize](analytics-integration) uygulayabilir. Bunu etkinleştirmek için her uygulama için Azaltılmış Hizmet Ücreti durumunuzu belirtin.
:::warning
Adapty'deki Azaltılmış Hizmet Ücreti durumunuzu **kaydolur kaydolmaz** yapılandırın. Geç yapılan değişiklikler, daha önce iletilmiş webhook etkinliklerini yeniden yazamaz ([ayrıntılar](#retroactive-setting-changes)).
:::
1. [**App Settings** → **General**](https://app.adapty.io/account) sayfasını açın.
2. **Reduced Service Fee** bölümünü bulun.
3. **Add period** seçeneğine tıklayın.
4. Üyelik başlangıç tarihini seçin.
5. Bir bitiş tarihi seçin ya da bu durumu süresiz olarak uzatmak için **At the current moment** onay kutusunu etkinleştirin. [Yıllık kazancınız 1 milyon ABD dolarını aşarsa](#exceeding-the-threshold) bitiş tarihini güncelleyebilirsiniz.
6. **Apply** seçeneğine tıklayın.
Üyelik durumu yalnızca **belirttiğiniz tarih aralığı için** geçerlidir. Program her takvim yılının başında sıfırlanır.
* Yeni bir üyelik dönemi eklemek için **Add period** seçeneğine tıklayın.
* Bu durumu süresiz olarak uzatmak için **At the current moment** onay kutusunu etkinleştirin.
Yapılandırmanızı doğrulamak için [Gelir grafiğini](revenue) açın ve **Proceeds after store commission** seçeneğini belirleyin. Gösterilen gelirin indirimli komisyon oranını yansıtıp yansıtmadığını kontrol edin.
## Programa Kaydolma \{#enroll-in-the-program\}
### Uygunluk gereksinimleri \{#eligibility-requirements\}
Google, uygunluğu | Seçenek | Açıklama | | ------- | ------------------------------------------------------------ | | Opt-out | (varsayılan) Adapty kullanıcının onay durumunu bilmiyorsa onayın **verildiğini** varsayar ve Refund Saver iade ile ilgili verileri Apple ile **paylaşır**. | | Opt-in | Adapty kullanıcının onay durumunu bilmiyorsa onayın **verilmediğini** varsayar ve Refund Saver Apple ile **hiçbir veri paylaşmaz**. Bu, Apple'ın önerdiği yaklaşımdır. | ## SDK'da kullanıcı onayını güncelleme \{#update-user-consent-in-the-sdk\} Belirli bir kullanıcının onay verip vermediğini Adapty'ye bildirmek için `updateCollectingRefundDataConsent` metodunu kullanın. Değer, profil başına sunucu tarafında saklandığından yalnızca onay değiştiğinde bu metodu çağırmanız yeterlidir.
:::note Abonelik olaylarını takip etmek için Adapty'deki [Webhook](webhook) entegrasyonunu kullanın ya da mevcut servisinizle doğrudan entegre edin. ::: ::: ## Durum 1: Web ve mobil arasında aboneleri senkronize etme \{#case-1-sync-subscribers-between-web-and-mobile\} Stripe, ChargeBee veya başka web ödeme sağlayıcıları kullanıyorsanız, abonelerinizi kolayca senkronize edebilirsiniz. İşte nasıl yapacağınız: 1.
2. Onboarding'iniz için açıklayıcı bir isim girin ve **Proceed to build onboarding** düğmesine tıklayın.
3. Onboarding oluşturucuya yönlendirileceksiniz.
Onboarding'in verileri nasıl topladığını ve değişkenler ile quizler aracılığıyla nasıl kişiselleştirilebileceğini anlamak için inceleyebileceğiniz varsayılan bir demo şablon içerir. İhtiyacınız olmayan ekranları kaldırabilir ve [kendi onboarding deneyiminizi tasarlayabilirsiniz](design-onboarding).
4. Hazır olduğunuzda sağ üstteki **Preview** düğmesine tıklayın. Her şeyin beklendiği gibi çalıştığından emin olmak için onboarding akışını kendiniz tamamlayın.
5. Her şey düzgün çalışıyorsa sağ üstteki **Publish** düğmesine tıklayın. Adapty'ye geri dönmeden önce yayınlanmasını bekleyin; aksi takdirde ilerlemeniz kaybolur.
:::danger
**Publish** düğmesine tıklamazsanız SDK, oluşturduğunuz onboarding'i alamaz.
:::
Onboarding'iniz yayınlandıktan sonra **Back to Adapty** düğmesine tıklayın. Onboarding'iniz oluşturuldu; kullanmaya başlamak için bir placement'a ekleyebilirsiniz.
## Adım 2. Onboarding için placement oluşturma \{#step-2-create-a-placement-for-your-onboarding\}
1. Ana menüden **Placements** sayfasına gidin ve **Onboardings** sekmesine geçin. **Create placement** düğmesine tıklayın.
2. Placement adını ve kimliğini girin. Ardından **Run onboarding** düğmesine tıklayın ve tüm kullanıcılara gösterilecek onboarding'i seçin.
3. Belirli bir kullanıcı grubu için ayrı bir onboarding hazırladıysanız [daha fazla kitle ekleyin](audience) ve onlar için farklı bir onboarding seçin.
## Adım 3. Onboarding'i uygulamanıza entegre etme \{#step-3-integrate-the-onboarding-into-your-app\}
:::important
Onboardings; Adapty SDK v3.8.0 ve üzeri (iOS, Android, React Native, Flutter), v3.14.0 ve üzeri (Unity) veya v3.15.0 ve üzeri (Kotlin Multiplatform, Capacitor) kullanan uygulamalar için kullanılabilir.
:::
Onboarding'leri uygulamanızda görüntülemeye başlamak için Adapty SDK ile entegre edin:
- [iOS](ios-onboardings)
- [Android](android-onboardings)
- [React Native](react-native-onboardings)
- [Flutter](flutter-onboardings)
- [Unity](unity-onboardings)
- [Kotlin Multiplatform](kmp-onboardings)
- [Capacitor](capacitor-onboardings)
Hangi onboarding'in daha iyi çalıştığını anlamak için [A/B testleri](ab-tests) de çalıştırabilirsiniz.
---
# File: design-onboarding
---
---
title: "Onboarding tasarımı"
description: "Anlamlı onboardinglar oluşturun."
---
Kodsuz mobil uygulama onboarding builder'ı, kullanıcılarınıza en iyi onboarding deneyimini sunmanıza yardımcı olacak güçlü ve özelleştirilebilir bir araçtır. Harika sonuçlar elde etmek için geliştirici ya da tasarımcı olmanıza gerek yok.
## Onboarding ekranları \{#onboarding-screens\}
Onboarding flow'u, eklediğiniz ve tasarladığınız birkaç ekrandan oluşur.
Kullanıcılar, ekranlar arasında gezinmek için butona dokunur.
:::tip
Bazı kullanıcılarınızın biraz farklı bir flow'a ihtiyacı varsa (örneğin bir fitness uygulamasında, kullanıcının cinsiyetine göre farklı 'hedef' görselleri göstermek isteyebilirsiniz), ayrı onboarding'ler oluşturmanıza gerek yok.
Bunun yerine, bazı ekranları varsayılan olarak gizli yapabilir ve yalnızca belirli senaryolarda gösterilecek şekilde ayarlayabilirsiniz.
:::
## Onboarding öğeleri \{#onboarding-elements\}
Onboarding öğeleri sol tarafta, gösterildikleri sırayla listelenir. Yeni bir öğe eklemek için sağ üstteki **Add** butonuna tıklayın.
Ekleyebileceğiniz öğe grupları şunlardır:
- **Containers**: Container'lar esnek bir düzen oluşturmanıza olanak tanır. Örneğin iki sütunlu bir metin eklemek istiyorsanız **Columns** ekleyip ardından sol paneldeki **Columns** içine iki metin bloğu sürüklemeniz gerekir. Carousel eklemek için ise içindeki **Media** öğelerine resim eklemeniz gerekir.
- **Typography**: Önceden biçimlendirilmiş metin blokları ekleyin ve görünümlerini ihtiyacınıza göre düzenleyin.
- **Media & Display**: Resim ve videolara ek olarak, uygulamanızın değerini gösteren ve kullanıcıları teşvik eden animasyonlu grafikler ekleyebilirsiniz.
**Desteklenen video formatları** MP4 ve WebM'dir. **Maksimum medya dosyası boyutu** 15 MB'tır.
Desteklenmeyen animasyonlu bir öğe eklemek istiyorsanız (örneğin Lottie), bunu bir videoya dönüştürebilir (örneğin [bu araçla](https://www.lottielab.com/lottie/lottie-to-video)) ve video olarak yerleştirebilirsiniz.
- **Quiz**: Onboarding deneyimini kişiselleştirmek ve kullanıcılarınızı daha iyi tanımak için metin ve resim seçenekli kısa anketler oluşturun.
- **Inputs**: Kullanıcılarınızın verilerini toplayın.
- **Buttons**: Butonlar, kullanıcıların ekranlar arasında geçiş yapmasını, onboarding'i kapatmasını veya paywalla geçmesini sağlar. Kullanıcıların dikkatini çekmek ve kurulumu satın almaya dönüştürmek için parlak veya hareketli butonlar da ekleyebilirsiniz.
- **Loaders**: Animasyonlu yükleyiciler, süreç boyunca kullanıcıların ilgisini canlı tutar.
- **User engagement**: Referanslar, kullanıcı e-posta listeleri ve geri sayımlar ekleyin.
:::note
**Media & Display** grubu kapsamında, sağlanan özelleştirme seçenekleri yetmediğinde özel HTML kodu da ekleyebilirsiniz.
Ancak özel HTML öğeleri ne önceden yüklenir ne de önbelleğe alınır; bu nedenle **Raw HTML**'i yalnızca küçük ve hafif öğeler için kullanmanız önerilir.
:::
### Öğe kimliği ve eylem kimliği \{#element-id-and-action-id\}
Bir butonu özel eylemler için kullanmak istiyorsanız ona bir **action ID** atayın ve ardından kaynak kodunuzda bu kimliği kullanın. Eylem kimlikleri, aynı eylem kimliğine sahip farklı butonları aynı şekilde ele almanıza olanak tanır.
Belirli bir alandaki kullanıcı girişini işlemek istiyorsanız (örneğin yaş veya e-posta kaydetmek), alana bir **element ID** atayın ve ardından soruları yanıtlarla ilişkilendirmek için kaynak kodunuzda bu kimliği kullanın. Öğe kimlikleri onboarding'inizde yalnızca bir kez kullanılabilir.
## Özelleştirme seçenekleri \{#customization-options\}
Builder'da şu özelleştirme seçenekleri mevcuttur:
- **Styles** sekmesi: Öğenin görünümünü ayarlayın.
- **Element** sekmesi: Görünebilirlik, buton basma eylemleri veya öğenin görünümüyle ilgisi olmayan diğer özellikler gibi öğe niteliklerini ayarlayın.
- **Screen** sekmesi: Başlık veya ekran sayacı gösterimi gibi genel ekran yapılandırmasını ayarlayın.
## Ekranları ve öğeleri kopyalama \{#copy-screens-and-elements\}
Bir onboarding oluşturdunuz ve bazı bölümlerini yeniden kullanmak ya da küçük değişiklikler yapıp A/B testleri çalıştırmak istiyorsanız, bir onboarding'den diğerine bir veya birden fazla ekran kopyalayabilirsiniz.
Ekranları kopyalamak için onboarding builder'ı açın ve şunlardan birini yapın:
- Tek bir ekrana sağ tıklayın ve **Copy** seçeneğini seçin
- İstediğiniz ekranı seçin ve `Ctrl+C` (Windows) veya `⌘+C` (Mac) tuşlarına basın
Aynı onboarding içinde veya farklı onboardingler arasında tek tek öğeleri ya da metin bloklarını da kopyalayabilirsiniz.
## Web-to-app hunilerinden ekran kopyalama \{#copy-screens-from-web-to-app-funnels\}
[FunnelFox](https://funnelfox.com/)'ta oluşturulan web-to-app hunilerini kullanıyorsanız ve huni ekranlarını onboardinglerde kullanmak istiyorsanız, huni builder'ında ekranları kopyalayıp onboarding builder'ına yapıştırarak bunu hızlıca yapabilirsiniz:
1. FunnelFox huni builder'ında bir ekrana sağ tıklayın ve **Copy** seçeneğini seçin ya da ekranı seçin ve `Ctrl+C`/`⌘+C` tuşlarına basın.
2. Onboarding builder'ını açın.
3. Kopyalanan ekranı eklemek istediğiniz yere sağ tıklayın ve **Paste** seçeneğini seçin ya da seçili durumdayken `Ctrl+V`/`⌘+V` tuşlarına basın. Kopyalanan ekran, seçili ekranın altına eklenir.
---
# File: adapty-paywall-builder
---
---
title: "Adapty Paywall Builder (Legacy)"
description: "Görsel no-code builder ile paywall'lar ve onboarding flow'ları oluşturun."
---
:::warning
Paywall Builder tamamen işlevseldir, ancak Adapty artık bu ürüne yeni özellik eklemiyor veya güncelleme çıkarmıyor. Yeni projeler için cihazda yerel olarak çalışan tek ekranlı paywall'lar ve çok ekranlı onboarding flow'ları tasarlamak amacıyla kullanabileceğiniz görsel, kodsuz bir editör olan [Adapty Flow Builder](adapty-flow-builder)'ı değerlendirmenizi öneririz:
- **Her tür flow**: Tek ekranlı paywall'lar, paywall içeren çok adımlı onboarding'ler ve bunlar arasındaki her şeyi oluşturun.
- **Native rendering**: Flow'lar, web view kullanmadan Adapty SDK üzerinden render edilir.
- **Yeniden dağıtmadan güncelleme**: Metin, tasarım veya mantığı istediğiniz zaman değiştirin; güncellemeler uygulama sürümü çıkarmadan kullanıcılara ulaşır.
:::
Adapty **Paywall Builder**, özel paywalllar tasarlamak için görsel bir no-code araçtır. Bir şablondan başlayabilir, düzeni özelleştirebilir ve carousel, kart, ürün listesi ile footer gibi öğeler ekleyebilirsiniz. Builder ayrıca özel fontları, ürün etiketlerini ve yerelleştirmeyi de destekler.
Paywall Builder, Adapty SDK v3.0 veya sonrasını gerektirir. Paywallınızı tasarladıktan sonra [bir placement'a ekleyin](add-audience-paywall-ab-test) ve uygulamanızda gösterin:
- [iOS](ios-quickstart-paywalls)
- [Android](android-quickstart-paywalls)
- [React Native](react-native-quickstart-paywalls)
- [Flutter](flutter-quickstart-paywalls)
- [Unity](unity-quickstart-paywalls)
- [Capacitor](capacitor-quickstart-paywalls)
- [Kotlin Multiplatform](kmp-quickstart-paywalls)
---
# File: flutterflow
---
---
title: "FlutterFlow için Adapty Eklentisi"
description: "Gelişmiş abonelik yönetimi için FlutterFlow'u Adapty ile entegre edin."
---
Adapty, mobil uygulamaların büyümesine yardımcı olmak için tasarlanmış çok yönlü bir platformdur. Yeni başlıyor olsanız da binlerce kullanıcınız olsa da Adapty; uygulama içi satın almaları entegre etmek için harcayacağınız zamanı aylarca kısaltır ve paywall yönetimiyle abonelik gelirinizi iki katına çıkarmanızı sağlar.
FlutterFlow için Adapty eklentisi, tek satır kod yazmadan Adapty'nin tüm özelliklerinden yararlanmanızı sağlar. FlutterFlow'da paywall sayfaları tasarlayabilir, satın alma işlemlerini etkinleştirebilir; ardından hangi ürünlerin görüntüleneceğini, belirli kullanıcı gruplarını hedeflemeyi veya A/B testini uzaktan yönetebilirsiniz. Uygulamanızı yayınladıktan sonra ise kullanıcılarınızın satın almalarına ait ayrıntılı analizlere doğrudan kontrol panelimizden anında erişebilirsiniz.
Paywallınızdaki ürünleri güncellemek mi istiyorsunuz? Son derece kolay! Adapty Kontrol Paneli'nde birkaç tıklamayla değişiklik yapın; kullanıcılarınız yeni ürünleri hemen görsün — yeni bir uygulama sürümü yayınlamanıza gerek yok!
Adapty'nin sunduğu diğer özellikler:
- **Abonelikler ve Uygulama İçi Satın Almalar**: Adapty, sunucu tarafında makbuz doğrulamasını sizin için yönetir ve kullanıcılarınızı web dahil tüm platformlarda senkronize eder.
- **Paywall'lar için A/B Testi**: Abonelik ve tek seferlik tekliflerinizi optimize etmek amacıyla farklı fiyatları, süreleri, deneme dönemlerini ve görsel öğeleri test edin.
- **Güçlü analizler**: Uygulamanızın gelir modelini daha iyi anlamak ve iyileştirmek için ayrıntılı metriklere erişin.
- **Entegrasyonlar**: Adapty; Amplitude, AppsFlyer, Adjust, Branch, Mixpanel, Facebook Ads, AppMetrica, özel Webhook'lar ve daha fazlası gibi üçüncü taraf analiz araçlarıyla sorunsuz biçimde entegre olur.
---
# File: ff-getting-started
---
---
title: "Başlarken"
description: "Abonelik akışlarını kişiselleştirmek için Adapty Feature Flags'e başlayın."
---
Adapty ile mobil uygulama kullanıcılarınızın yolculuğunun farklı noktalarında (Onboarding, Ayarlar vb.) paywall'lar oluşturabilir ve A/B testleri çalıştırabilirsiniz. Bu noktalara [Placement](placements) denir. Uygulamanızdaki bir placement, aynı anda birden fazla paywall veya [A/B testi](ab-tests) yönetebilir; bunların her biri [Kitle](audience) olarak adlandırdığımız belirli bir kullanıcı grubu için hazırlanır. Üstelik yeni bir uygulama sürümü yayınlamadan, zaman içinde bir paywall'u başkasıyla değiştirerek denemeler yapabilirsiniz. Mobil uygulamaya sabit kodlanan tek şey placement ID'sidir.
Adapty kütüphanesi, paywall'ınızı Adapty Kontrol Paneli'ndeki en güncel ürünlerle senkronize tutar. [Ürün verilerini çeker](ff-action-flow), [bunları paywall'ınızda gösterir](ff-add-variables-to-paywalls), [satın alma işlemlerini yönetir](ff-make-purchase) ve kullanıcının ücretli içeriğe erişip erişemeyeceğini belirlemek için [access level durumunu kontrol eder](ff-check-subscription-status).
Başlamak için aşağıda gösterildiği gibi FlutterFlow projenize [Adapty kütüphanesini ekleyin](ff-getting-started#add-the-adapty-library-as-a-dependency) ve [başlatın](ff-getting-started#initiate-adapty-plugin).
:::warning
Başlamadan önce aşağıdaki kısıtlamalara dikkat edin:
- FlutterFlow için Adapty kütüphanesi web uygulamalarını desteklemez. Web uygulamalarını bu kütüphaneyle derlemeyin.
- FlutterFlow için Adapty kütüphanesi, Adapty paywall builder kullanılarak oluşturulan paywall'ları desteklemez. Adapty üzerinden satın alma işlemlerini etkinleştirmeden önce kendi paywall'ınızı FlutterFlow'da tasarlamanız gerekir.
:::
## Adapty kütüphanesini bağımlılık olarak ekleyin \{#add-the-adapty-library-as-a-dependency\}
1. [FlutterFlow Dashboard](https://app.flutterflow.io/dashboard)'unu açın, projenizi seçin ve sol menüden **Settings and Integrations**'a tıklayın. Sol taraftaki **Project setup** bölümünden **Project dependencies**'i seçin.
2. **FlutterFlow Libraries** bölümünde **Add Library**'e tıklayın ve `adapty-xtuel0` girin. **Add**'e tıklayın.
3. Şimdi SDK anahtarınızı kütüphaneyle ilişkilendirmeniz gerekiyor. Kütüphanenin yanındaki **View details**'e tıklayın.
4. Adapty Kontrol Paneli'ndeki [**App Settings** -> **General** sekmesinden](https://app.adapty.io/settings/general) **Public SDK key**'i kopyalayın.
5. Anahtarı FlutterFlow'daki **AdaptyApiKey** alanına yapıştırın.
Adapty FF kütüphanesi artık projenize bağımlılık olarak eklenecek. **Adapty** FF kütüphane penceresinde, projenize aktarılan tüm Adapty kaynaklarını bulabilirsiniz.
## Uygulama başlangıcında yeni aktivasyon eylemini çağırın \{#call-the-new-activation-action-at-application-launch\}
1. Sol menüden **Custom Code** bölümüne gidin ve `main.dart` dosyasını açın.
2. **+** işaretine tıklayın ve `activate (Adapty)` seçeneğini belirleyin.
3. **Save**'e tıklayın.
## Adapty eklentisini başlatın \{#initiate-adapty-plugin\}
Adapty Kontrol Paneli'nin uygulamanızı tanıyabilmesi için FlutterFlow'da özel bir anahtar girmeniz gerekir.
1. FlutterFlow projenizde sol menüden **Settings and Integrations > Permissions** bölümüne gidin.
2. Açılan **Permissions** penceresinde **Add Permission** düğmesine tıklayın.
3. **iOS Permission Key** ve **Android Permission Key** alanlarının her ikisine de `AdaptyPublicSdkKey` yapıştırın.
4. **Permission Message** için, Adapty Kontrol Paneli'ndeki [**App Settings** -> **General** sekmesinden](https://app.adapty.io/settings/general) **Public SDK key**'i kopyalayın. Her uygulamanın kendine ait bir SDK anahtarı vardır; dolayısıyla birden fazla uygulamanız varsa doğru anahtarı aldığınızdan emin olun.
Bu adımları tamamladıktan sonra FlutterFlow uygulamanızda paywall'ınızı çağırabilir ve üzerinden satın alma işlemlerini etkinleştirebilirsiniz.
## Sırada ne var? \{#whats-next\}
1. FlutterFlow'da Adapty paywall ürünlerini ve verilerini işlemek için [bir action flow oluşturun](ff-action-flow).
2. [Alınan verileri](ff-add-variables-to-paywalls) FlutterFlow'da tasarladığınız paywall'a eşleyin.
3. Tıklandığında Adapty üzerinden işlem gerçekleştirmek için paywall'ınızdaki [satın alma düğmesini ayarlayın](ff-make-purchase).
4. Son olarak, kullanıcıya ücretli içerik gösterilip gösterilmeyeceğini belirlemek için [abonelik durumu kontrollerini ekleyin](ff-check-subscription-status).
---
# File: ff-action-flow
---
---
title: "Adım 1. Paywall verilerini göstermek için akış oluşturun"
description: "Kullanıcı abonelik deneyimlerini kişiselleştirmek için Adapty'de özellik bayrağı eylem akışlarını ayarlayın."
---
:::important
FlutterFlow eklentisini kullanırken Adapty Paywall Builder'da oluşturulmuş paywallları kullanamazsınız. FlutterFlow'da kendi paywall sayfanızı oluşturmanız ve bunu Adapty'ye bağlamanız gerekir.
:::
Adapty kütüphanesini FlutterFlow projenize bağımlılık olarak ekledikten sonra, **Adapty paywall ve ürün verilerini alıp FlutterFlow'da tasarladığınız paywall'da görüntüleyen** akışı oluşturma zamanı geldi.
Önce Adapty'den paywall verilerini almamız gerekiyor. Adapty paywallını isteyerek başlayacağız, ardından buna bağlı ürünleri alacağız ve son olarak verilerin başarıyla alınıp alınmadığını kontrol edeceğiz. Başarılıysa paywall sayfasında ürün başlığını ve fiyatını göstereceğiz. Aksi hâlde bir hata mesajı görüntüleyeceğiz.
Devam etmeden önce aşağıdakileri yaptığınızdan emin olun:
1. Adapty Kontrol Paneli'nde [en az bir paywall oluşturup buna en az bir ürün eklemiş](create-paywall) olun.
2. Adapty Kontrol Paneli'nde [en az bir placement oluşturun](create-placement) ve [paywallınızı buna ekleyin](add-audience-paywall-ab-test).
Hadi başlayalım!
## Adım 1.1. Adapty paywallını isteyin \{#step-11-request-adapty-paywall\}
Belirtildiği gibi, FlutterFlow paywall'ınızda veri göstermek için önce bunu Adapty'den almamız gerekiyor. İlk adım, Adapty paywallının kendisini almaktır. İşte nasıl yapılacağı:
1. Paywall ekranınızı açın ve sağ bölmedeki **Actions** bölümüne geçin. Orada **Action Flow Editor**'ı açın.
2. **Select Action Trigger** penceresinde **On Page Load** seçeneğini seçin.
3. **Add Action**'a tıklayın. Ardından `getPaywall` özel eylemini arayın ve seçin.
4. **Set Actions Arguments** bölümünde, paywallı içeren Adapty Kontrol Paneli'nde [oluşturduğunuz placement'ın](create-placement) gerçek kimliğini girin. Bu örnekte `monthly`. Gerçek placement kimliğinizi kullandığınızdan emin olun!
5. Paywallınızı Adapty kontrol panelinde [yerelleştirdiyseniz](localizations-and-locale-codes), **locale** bağımsız değişkenini de ayarlayabilirsiniz.
6. **Action Output Variable Name** alanında yeni bir değişken oluşturun ve `getPaywallResult` olarak adlandırın. Bunu bir sonraki adımda Adapty paywallına başvurmak ve ürünlerini istemek için kullanacağız.
## Adım 1.2. Adapty paywall ürünlerini isteyin \{#step-12-request-adapty-paywall-products\}
Harika! Adapty paywallını aldık. Şimdi bu paywalla ilişkili ürünleri alalım:
1. Oluşturulan eylemin altındaki **+** simgesine tıklayın ve **Add Action**'ı seçin. Bu eylem Adapty paywall ürünlerini alacak. Bunun için `getPaywallProducts` eylemini arayın ve seçin.
2. **Set Actions Arguments** bölümünde, daha önce oluşturulan `getPaywallResult` değişkenini seçin.
3. Diğer alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: No further changes
4. **Confirm**'e tıklayın.
5. **Action Output Variable Name** alanında yeni bir değişken oluşturun ve `getPaywallProductsResult` olarak adlandırın. Bunu, FlutterFlow'da tasarladığınız paywallı Adapty paywall verileriyle eşleştirmek için kullanacağız.
## Adım 1.3. Paywallın başarıyla yüklenip yüklenmediğini kontrol edin \{#step-13-add-check-if-the-paywall-uploaded-successfully\}
Devam etmeden önce Adapty paywallının başarıyla alındığını doğrulayalım. Alındıysa paywallı ürün verileriyle güncelleyebiliriz. Alınmadıysa hatayı ele alacağız. Kontrolü şu şekilde ekleyebilirsiniz:
1. **+** simgesine tıklayın ve **Add Conditional**'a tıklayın.
2. **Action Output** bölümünde, daha önce oluşturulan eylem çıktı değişkenini seçin (örneğimizde `getPaywallResult`).
3. Adapty paywallının alındığını doğrulamak için bir değere sahip bir alanın varlığını kontrol edin. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Has Field
- **Field (AdaptyGetPaywallResult)**: value
4. Koşulu sonlandırmak için **Confirm**'e tıklayın.
## Adım 1.4. Paywall görüntülemesini kaydedin \{#step-14-log-the-paywall-review\}
Adapty analitiğinin paywall görüntülemesini takip etmesini sağlamak için bu olayı kaydetmemiz gerekiyor. Bu adım olmadan görüntüleme analitikte sayılmayacaktır. İşte nasıl yapılacağı:
1. **TRUE** etiketi altındaki **+** simgesine tıklayın ve **Add Action**'a tıklayın.
2. **Select Action** alanında **logShowPaywall** eylemini arayın ve seçin.
3. **Set Action Arguments** alanında **Value**'ya tıklayın ve oluşturduğumuz `getPaywallResult` değişkenini seçin. Bu değişken paywall verilerini içerir.
4. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structured Field
- **Select Field**: value
5. **Confirm**'e tıklayın.
## Adım 1.5. Paywall alınamazsa hata gösterin \{#step-15-show-error-if-paywall-not-received\}
Adapty paywallı alınamazsa [hatayı ele almanız](error-handling-on-flutter-react-native-unity#system-storekit-codes) gerekir. Bu örnekte sadece bir uyarı mesajı görüntüleyeceğiz.
1. **FALSE** etiketine bir **Informational Dialog** eylemi ekleyin.
2. **Title** alanına, iletişim kutusu başlığı olarak görmek istediğiniz metni ekleyin. Bu örnekte **Error**.
3. **Message** kutusunda **Value**'ya tıklayın.
4. Alanları aşağıdaki gibi doldurun:
- **Set Variable**: Oluşturduğumuz `getPaywallProductResult` değişkeni
- **Available Options**: Data Structure Field
- **Select Field**: error
- **Available Options**: Data Structure Field
- **Select Field**: errorMessage
5. **Confirm**'e tıklayın.
6. **FALSE** akışına bir **Terminate action** ekleyin.
7. Sağ üst köşedeki **Close**'a tıklayın.
Tebrikler! Ürün verilerini başarıyla aldınız. Şimdi bunu [FlutterFlow'da tasarladığınız paywalla eşleştirelim](ff-add-variables-to-paywalls).
---
# File: ff-add-variables-to-paywalls
---
---
title: "Adım 2. Paywall sayfasına veri ekleme"
description: "Adapty'de paywallara Feature Flag değişkenleri ekleyin."
---
[Gerekli tüm ürün verilerini aldıktan](ff-action-flow) sonra, bu verileri FlutterFlow'da tasarladığınız güzel paywalla eşleştirme zamanı. Bu örnekte ürün başlığını ve fiyatını eşleştireceğiz.
## Adım 2.1. Paywall sayfasına ürün başlığı ekleme \{#step-21-add-product-title-to-paywall-page\}
1. Paywall sayfanızdaki ürün metnine çift tıklayın. **Set from Variable** penceresinde `getPaywallProductResult` değişkenini arayın ve seçin.
2. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structured Field
- **Select Field**: localizedTitle
- **Default Variable Value**: null
- **UI Builder Display Value**: Herhangi bir şey; örnekte `product.title` kullanılmıştır.
3. Değişiklikleri kaydetmek için **Confirm**'e tıklayın.
## Adım 2.2. Paywall sayfasına fiyat metni ekleme \{#step-22-add-price-text-to-paywall-page\}
Fiyat metni için Adım 2.1'deki adımları aşağıda gösterildiği gibi tekrarlayın:
1. Paywall sayfanızdaki fiyat metnine çift tıklayın. **Set from Variable** penceresinde `getPaywallProductResult` değişkenini arayın ve seçin.
2. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structured Field
- **Select Field**: price
- **Default Variable Value**: null
- **UI Builder Display Value**: Herhangi bir şey; örnekte `product.price` kullanılmıştır.
3. Değişiklikleri kaydetmek için **Confirm** düğmesine tıklayın.
### Paywall sayfasına yerel para biriminde fiyat ekleme \{#add-price-in-local-currency-to-paywall-page\}
1. Paywall sayfanızdaki fiyata çift tıklayın. **Set from Variable** penceresinde `getPaywallProductResult` değişkenini arayın ve seçin.
2. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structured Field
- **Select Field**: price
- **Available Options**: Data Structured Field
- **Select Field**: amount
- **Available Options**: Decimal
- **Decimal Type**: Automatic
- **Default Variable Value**: null
- **UI Builder Display Value**: Herhangi bir şey; örnekte `price.amount` kullanılmıştır.
3. Değişiklikleri kaydetmek için **Confirm**'e tıklayın.
İşte bu kadar! Artık uygulamanızı başlattığınızda, Adapty paywallındaki ürün verileri doğrudan paywall sayfanızda görünecek!
Şimdi [kullanıcılarınızın bu ürünü satın almasına](ff-make-purchase) izin verme zamanı.
---
# File: ff-make-purchase
---
---
title: "Adım 3. Satın almayı etkinleştir"
description: "Adapty'nin Feature Flags sistemi ile nasıl satın alma yapacağınızı öğrenin."
---
Tebrikler! Ürün başlığı ve fiyat dahil olmak üzere [paywallınızı Adapty'den gelen ürün verilerini gösterecek şekilde](ff-add-variables-to-paywalls) başarıyla yapılandırdınız.
Şimdi son adıma geçelim – kullanıcıların paywall üzerinden satın alma yapmasını sağlamak.
## Adım 3.1. Kullanıcıların satın alma yapmasını etkinleştir \{#step-31-enable-users-to-make-purchases\}
1. Paywall sayfanızdaki satın al düğmesine çift tıklayın. Sağ panelde, henüz açık değilse **Actions** bölümünü açın.
2. **Action Flow Editor**'ı açın.
3. **Select Action Trigger** penceresinde **On Tap**'i seçin.
4. **No Actions Created** penceresinde **Add Action**'a tıklayın. `makePurchase` eylemini aratın ve seçin.
5. **Set Actions Arguments** bölümünde, daha önce oluşturulan `getPaywallProductsResult` değişkenini seçin.
6. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structure Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
7. `subscriptionUpdateParameters`'a tıklayın, `AdaptySubscriptionUpdateParameters` ifadesini aratın ve seçin. **Confirm**'e tıklayın.
:::info
Varsayılan olarak tüm nesne alanlarını boş bırakabilirsiniz. Android uygulamalarında bir aboneliği başka biriyle değiştirmek için bu alanları doldurmanız gerekir. Daha fazla bilgi için [buraya](https://android.adapty.io/adapty/com.adapty.models/-adapty-subscription-update-parameters/) bakın.
:::
8. **Confirm**'e tıklayın.
9. **Action Output Variable Name** alanında yeni bir değişken oluşturun ve `makePurchaseResult` olarak adlandırın – bu, satın almanın başarılı olduğunu doğrulamak için daha sonra kullanılacak.
## Adım 3.2. Satın almanın başarılı olup olmadığını kontrol et \{#step-32-check-if-the-purchase-was-successful\}
Şimdi satın almanın gerçekleşip gerçekleşmediğini kontrol eden bir adım ayarlayalım.
1. **+** simgesine tıklayın ve **Add Conditional**'a tıklayın.
2. **Set Condition for Action** alanında `makePurchaseResult` değişkenini seçin.
3. **Set Variable** penceresinde alanları aşağıdaki gibi doldurun:
- **Available Options**: Has Field
- **Select Field**: profile
4. **Confirm**'e tıklayın.
## Adım 3.3. Ücretli içeriği aç \{#step-33-open-paid-content\}
Satın alma başarılıysa ücretli içeriğin kilidini açabilirsiniz. Nasıl yapılacağını aşağıda bulabilirsiniz:
1. **TRUE** etiketinin altındaki **+** simgesine tıklayın ve **Add Action**'a tıklayın.
2. **Define Action** alanında, **Navigate To** listesinden açmak istediğiniz sayfayı aratın ve seçin. Bu örnekte sayfa **Questions**'dır.
## Adım 3.4. Satın alma başarısız olursa hata mesajı göster \{#step-34-show-error-message-if-purchase-failed\}
Satın alma başarısız olursa kullanıcıya bir uyarı gösterelim.
1. **FALSE** etiketine bir **Informational Dialog** eylemi ekleyin.
2. **Title** alanına iletişim kutusu başlığı için istediğiniz metni girin; örneğin **Purchase Failed**.
3. **Message** kutusundaki **Value**'ya tıklayın. **Set from Variable** penceresinde `makePurchaseResult` ifadesini aratın ve seçin. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structure Field
- **Select Field**: error
- **Available Options**: Data Structure Field
- **Select Field**: errorMessage
4. **Confirm**'e tıklayın.
5. **FALSE** akışına bir **Terminate** eylemi ekleyin.
6. Son olarak sağ üst köşedeki **Close**'a tıklayın.
Tebrikler! Kullanıcılarınız artık ürünlerinizi satın alabilir. Ek bir adım olarak, ücretli içerik mi yoksa paywall mı gösterileceğine karar vermek amacıyla başka yerlerde [kullanıcının ücretli içeriğe erişimini kontrol eden bir yapı kurmanızı](ff-check-subscription-status) öneririz.
---
# File: ff-check-subscription-status
---
---
title: "Adım 4. Ücretli içeriğe erişimi kontrol et"
description: "Daha iyi kullanıcı segmentasyonu için Adapty'nin özellik bayraklarını kullanarak abonelik durumunu nasıl kontrol edeceğinizi öğrenin."
---
Bir kullanıcının belirli ücretli içeriğe erişimi olup olmadığını belirlerken, onun access level'ını doğrulamanız gerekir. Bu, kullanıcının en az bir access level'a sahip olup olmadığını ve bu level'ın gerekli olan mı olduğunu kontrol etmek anlamına gelir.
Bunu, mevcut tüm access level'ları içeren kullanıcı profilini kontrol ederek yapabilirsiniz.
Şimdi, kullanıcıların ürününüzü satın almasına izin verelim:
1. Ücretli içeriği göstermesi gereken butona çift tıklayın ve henüz açık değilse sağ paneldeki **Actions** bölümünü açın.
2. **Action Flow Editor**'ı açın.
3. **Select Action Trigger** penceresinde **On Tap** seçeneğini seçin.
4. **No Actions Created** penceresinde **Add Conditional Action** butonuna tıklayın.
5. Eylem argümanlarını ayarlamak için **UNSET**'e tıklayın ve `currentProfile` değişkenini seçin. Bu, geçerli kullanıcının profil verilerini tutan Adapty değişkenidir.
6. Alanları aşağıdaki gibi doldurun:
- **Available Options**: Data Structure Field
- **Select Field**: accessLevels
- **Available Options**: Filter List Items
- **Filter Conditions**:
1. **Conditions -> Single Condition** seçeneğini seçin ve **UNSET**'e tıklayın.
2. **First value** alanında **Source** olarak **Item in list** seçin ve alanları şu şekilde doldurun:
- **Available Options**: Data Structure Field
- **Select Field**: accessLevelIdentifier
3. Filtre operatörünü **Equal to** olarak ayarlayın.
4. **Second value** yanındaki **UNSET**'e tıklayın ve **Value** alanına access level'ınızın ID'sini girin; örneğimizde `premium` kullanıyoruz.
5. **Confirm**'e tıklayın ve aşağıdaki diğer alanları doldurmaya devam edin.
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structure Field
- **Select Field**: accessLevel
- **Available Options**: Data Structure Field
- **Select Field**: isActive
7. **Confirm**'e tıklayın.
Şimdi, sonraki adım için eylemleri ekleyin — kullanıcının doğru aboneliğe sahip olup olmadığına göre. Ya onları premium abonelere açık olan sayfaya yönlendirin ya da erişim satın alabilmeleri için paywall sayfasını açın.
---
# File: ff-resources
---
---
title: "Adapty FlutterFlow eklentisi eylemleri ve veri türleri"
description: "Abonelik tabanlı özellikleri kolaylaştırmak için Adapty'nin özellik bayrağı kaynaklarına erişin."
---
## Özel Aksiyonlar \{#custom-actions\}
Aşağıda, Adapty eklentisiyle FlutterFlow'a sunulan Adapty metodları yer almaktadır. Bunlar FlutterFlow'da özel aksiyon olarak kullanılabilir.
| Özel Eylem | Açıklama | Eylem Argümanları | Adapty Veri Türleri - Eylem Çıktı Değişkeni |
|---|----|--------|----|
| activate | Adapty SDK'yı başlatır | Yok ||
| getPaywall
| Bir paywall getirir. Paywall ürünlerini döndürmez. Gerçek ürünleri almak için `getPaywallProducts` eylemini kullanın |getPaywallProducts
| Gerçek paywall ürünlerinin listesini döndürür | [AdaptyPaywall](ff-resources#adaptypaywall) | [AdaptyGetProductsResult](ff-resources#adaptygetproductsresult) | |getProductsIntroductoryOfferEligibility
| Kullanıcının iOS abonelik başlangıç teklifine uygun olup olmadığını kontrol eder | [AdaptyPaywallProduct](product) | [AdaptyGetIntroEligibilitiesResult](ff-resources#adaptygetintroeligibilitiesresult) | |makePurchase
| Satın alma işlemini tamamlar ve içeriğin kilidini açar. Paywall'da bir promosyon teklifi varsa Adapty bunu ödeme sırasında otomatik olarak uygular |getProfile
|Mevcut uygulama kullanıcısının profilini getirir. Bu sayede access level'ları ve diğer parametreleri ayarlayabilirsiniz
Başarısız olursa (örneğin internet yoksa) önbelleğe alınmış veriler döndürülür. Adapty, bilgilerin mümkün olduğunca güncel kalması için profil önbelleğini düzenli olarak günceller
| Yok | [AdaptyGetProfileResult](ff-resources#adaptygetprofileresult) | | updateProfile | Mevcut kullanıcı profilinin e-posta, telefon numarası vb. isteğe bağlı özelliklerini değiştirir. Bu özellikleri daha sonra kullanıcı [segmentleri](segments) oluşturmak veya CRM'de görüntülemek için kullanabilirsiniz | [AdaptyProfile](ff-resources#adaptyprofile) için ID ve güncellenmesi gereken parametreler | [AdaptyError](ff-resources#adaptyerror) (İsteğe Bağlı) | | restorePurchases | Kullanıcının daha önce yaptığı tüm satın almaları geri yükler | Yok | [AdaptyGetProfileResult](ff-resources#adaptygetprofileresult) | | logShowPaywall | Kullanıcıya belirli bir paywall gösterildiğinde bunu kaydeder | [AdaptyPaywall](ff-resources#adaptypaywall) | [AdaptyError](ff-resources#adaptyerror) (İsteğe Bağlı) | | identify | Kullanıcıyı sisteminizdeki `customerUserId` ile tanımlar | customerUserId | [AdaptyError](ff-resources#adaptyerror) (İsteğe Bağlı) | | logout | Mevcut kullanıcının uygulamadan oturumunu kapatır | Yok | [AdaptyError](ff-resources#adaptyerror) (İsteğe Bağlı)| | presentCodeRedemptionSheet | Kullanıcıların kod kullanmasına olanak tanıyan bir sayfa görüntüler (yalnızca iOS) | Yok | Yok | ## Veri Tipleri \{#data-types\} Adapty eklentisiyle FlutterFlow'a iletilen Adapty veri tipleri (veri değerleri koleksiyonları). ### AdaptyAccessLevel Kullanıcının [access level](access-level) bilgisi. | Alan Adı | Tür | Açıklama | |--------------------------|----------|-------------| | activatedAt | DateTime | Bu access level'ın etkinleştirildiği zaman | | activeIntroductoryOfferType | String | Aktif başlangıç teklifinin türü. Ayarlanmışsa, bu abonelik döneminde bir teklif uygulandığı anlamına gelir | | activePromotionalOfferId | String | Aktif promosyon teklifinin kimliği (iOS'tan satın alınan) | | activePromotionalOfferType | String | Aktif promosyon teklifinin türü (iOS'tan satın alınan). Ayarlanmışsa, bu abonelik döneminde bir teklif uygulandığı anlamına gelir | | billingIssueDetectedAt | DateTime | Bir fatura sorununun tespit edildiği zaman. Abonelik hâlâ aktif olabilir. Ödeme başarıyla işlenirse null olarak ayarlanır | | cancellationReason | String | Aboneliğin iptal edilme nedeni | | expiresAt | DateTime | Access level'ın sona erme zamanı (geçmişte olabilir ya da süresiz erişim için ayarlanmamış olabilir) | | id | String | Access level'ın tanımlayıcısı | | isActive | Boolean | Bu access level aktifse true. Genel olarak, kullanıcının premium özelliklere erişimi olup olmadığını belirlemek için bu özelliği kontrol edebilirsiniz | | isInGracePeriod | Boolean | Bu otomatik yenilenen abonelik [ek süre](https://developer.apple.com/help/app-store-connect/manage-subscriptions/enable-billing-grace-period-for-auto-renewable-subscriptions) içindeyse true | | isLifetime | Boolean | Bu access level süresiz olarak aktifse true (son kullanma tarihi yok) | | isRefund | Boolean | Bu satın alma iade edildiyse true | | offerId | String | Aktif promosyon teklifinin kimliği (Android'den satın alınan) | | renewedAt | DateTime | Access level'ın en son yenilendiği zaman | | startsAt | DateTime | Bu access level'ın başlangıç zamanı (gelecekte olabilir) | | store | String | Satın almanın yapıldığı mağaza | | unsubscribedAt | DateTime | Abonelik için otomatik yenilemenin kapatıldığı zaman. Abonelik hâlâ aktif olabilir. Ayarlanmamışsa, kullanıcı aboneliği yeniden etkinleştirmiştir | | vendorProductId | String | Bu access level'ı açan mağazadaki ürün kimliği | | willRenew | Boolean | Bu otomatik yenilenen abonelik yenilenecek şekilde ayarlanmışsa true | ### AdaptyAccessLevelIdentifiers Bu struct, `Map
Adapty, `AdaptySDK` isim alanını kullanır. Adapty SDK kullanan script dosyalarınızın en üstüne şunu ekleyebilirsiniz:
```csharp showLineNumbers title="C#"
using AdaptySDK;
```
Adapty olaylarına abone olun:
```csharp showLineNumbers title="C#"
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour, AdaptyEventListener {
public void OnLoadLatestProfile(AdaptyProfile profile) {
// handle updated profile data
}
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
}
```
Script Execution Order ayarını, AdaptyListener'ı Default Time'ın önüne gelecek şekilde düzenlemenizi öneririz. Bu sayede Adapty mümkün olduğunca erken başlatılır.
Şimdi uygulamanızda paywallları ayarlayın:
- [Adapty Paywall Builder](adapty-paywall-builder) kullanıyorsanız, önce aşağıdaki [AdaptyUI modülünü etkinleştirin](#activate-adaptyui-module-of-adapty-sdk), ardından [Paywall Builder hızlı başlangıç kılavuzunu](unity-quickstart-paywalls) takip edin.
- Kendi paywall arayüzünüzü oluşturuyorsanız, [özel paywall'lar için hızlı başlangıç kılavuzuna](unity-quickstart-manual) bakın.
## Adapty SDK'nın AdaptyUI modülünü etkinleştirin \{#activate-adaptyui-module-of-adapty-sdk\}
[Paywall Builder](adapty-paywall-builder) kullanmayı planlıyor ve AdaptyUI modülünü yüklediyseniz AdaptyUI'ın etkin olması gerekir. Yapılandırma sırasında etkinleştirebilirsiniz:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetActivateUI(true);
```
## İsteğe bağlı kurulum \{#optional-setup\}
### Günlük Kaydı \{#logging\}
#### Günlük kaydı sistemini kurma \{#set-up-the-logging-system\}
Adapty, ne olduğunu anlamanıza yardımcı olmak için hataları ve diğer önemli bilgileri kaydeder. Aşağıdaki düzeyler mevcuttur:
| Level | Description |
| ---------- | ------------------------------------------------------------ |
| `error` | Yalnızca hatalar loglanır |
| `warn` | Kritik hatalara yol açmayan ancak dikkat edilmesi gereken SDK hataları ve mesajları loglanır |
| `info` | Hatalar, uyarılar ve çeşitli bilgi mesajları loglanır |
| `verbose` | Hata ayıklama sırasında işe yarayabilecek her türlü ek bilgi (fonksiyon çağrıları, API sorguları vb.) loglanır |
Adapty'yi yapılandırırken uygulamanızda log seviyesini ayarlayabilirsiniz:
```csharp showLineNumbers title="C#"
// 'verbose' is recommended for development and the first production release
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY");
builder.LogLevel = AdaptyLogLevel.Verbose;
```
Log seviyesini çalışma zamanında da değiştirebilirsiniz:
```csharp showLineNumbers title="C#"
Adapty.SetLogLevel(AdaptyLogLevel.Verbose, (error) => {
// handle result
});
```
### Veri politikaları \{#data-policies\}
Adapty, açıkça göndermediğiniz sürece kullanıcılarınızın kişisel verilerini saklamaz. Ancak mağaza veya ülke yönergelerine uymak için ek veri güvenliği politikaları uygulayabilirsiniz.
#### IP adresi toplama ve paylaşmayı devre dışı bırakma \{#disable-ip-address-collection-and-sharing\}
Adapty modülünü etkinleştirirken, kullanıcı IP adresi toplama ve paylaşımını devre dışı bırakmak için `SetIPAddressCollectionDisabled` değerini `true` olarak ayarlayın. Varsayılan değer `false`'tur.
Bu parametreyi kullanıcı gizliliğini artırmak, bölgesel veri koruma düzenlemelerine (GDPR veya CCPA gibi) uymak ya da uygulamanız için IP tabanlı özellikler gerekli olmadığında gereksiz veri toplamayı azaltmak amacıyla kullanabilirsiniz.
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetIPAddressCollectionDisabled(true);
```
#### Reklam kimliği toplama ve paylaşımını devre dışı bırakma \{#disable-advertising-id-collection-and-sharing\}
Adapty modülünü etkinleştirirken, reklam tanımlayıcılarının toplanmasını devre dışı bırakmak için `SetAppleIDFACollectionDisabled` ve/veya `SetGoogleAdvertisingIdCollectionDisabled` değerini `true` olarak ayarlayın. Varsayılan değer `false`'tur.
Bu parametreyi; App Store/Google Play politikalarına uymak, App Tracking Transparency istemini tetiklemekten kaçınmak ya da uygulamanız reklam kimliklerine dayalı attribution veya analiz gerektirmiyorsa kullanın.
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleIDFACollectionDisabled(true)
.SetGoogleAdvertisingIdCollectionDisabled(true);
```
#### AdaptyUI için medya önbelleği yapılandırmasını ayarlama \{#set-up-media-cache-configuration-for-adaptyui\}
AdaptyUI, varsayılan olarak performansı artırmak ve ağ kullanımını azaltmak için medyayı (resimler ve videolar gibi) önbelleğe alır. Özel bir yapılandırma sağlayarak önbellek ayarlarını özelleştirebilirsiniz.
Varsayılan önbellek ayarlarını geçersiz kılmak için `SetAdaptyUIMediaCache` kullanın:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAdaptyUIMediaCache(
100 * 1024 * 1024, // MemoryStorageTotalCostLimit 100MB
null, // MemoryStorageCountLimit
100 * 1024 * 1024 // DiskStorageSizeLimit 100MB
);
```
Parametreler:
| Parametre | Zorunlu | Açıklama |
|-----------------------------|----------|-----------------------------------------------------------------------------------------------|
| memoryStorageTotalCostLimit | isteğe bağlı | Bellekteki toplam önbellek boyutu (bayt cinsinden). Varsayılan değer platforma göre değişir. |
| memoryStorageCountLimit | isteğe bağlı | Bellek depolamasının öğe sayısı sınırı. Varsayılan değer platforma göre değişir. |
| diskStorageSizeLimit | isteğe bağlı | Diskteki dosya boyutu sınırı (bayt cinsinden). Varsayılan değer platforma göre değişir. |
### Yerel access level'ları etkinleştirin (Android) \{#enable-local-access-levels-android\}
Varsayılan olarak [yerel access level'lar](local-access-levels) iOS'ta etkin, Android'de devre dışıdır. Android'de de etkinleştirmek için `SetGoogleLocalAccessLevelAllowed` değerini `true` olarak ayarlayın:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetGoogleLocalAccessLevelAllowed(true);
```
### Yedekten geri yüklemede veri temizleme \{#clear-data-on-backup-restore\}
`SetAppleClearDataOnBackup` `true` olarak ayarlandığında, SDK uygulamanın iCloud yedeğinden geri yüklendiğini algılar ve önbelleğe alınmış profil bilgileri, ürün ayrıntıları ve paywalllar dahil olmak üzere yerel olarak depolanan tüm SDK verilerini siler. SDK ardından temiz bir durumla başlatılır. Varsayılan değer `false`'tur.
:::note
Yalnızca yerel SDK önbelleği silinir. Apple ile olan işlem geçmişi ve Adapty sunucularındaki kullanıcı verileri değişmeden kalır.
:::
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleClearDataOnBackup(true);
```
## Sorun Giderme \{#troubleshooting\}
#### Android yedekleme kuralları (Otomatik Yedekleme yapılandırması) \{#android-backup-rules-auto-backup-configuration\}
Bazı SDK'lar (Adapty dahil) kendi Android Auto Backup yapılandırmasını içerir. Yedekleme kurallarını tanımlayan birden fazla SDK kullanıyorsanız, Android manifest birleştirme işlemi `android:fullBackupContent`, `android:dataExtractionRules` veya `android:allowBackup` ile ilgili bir hatayla başarısız olabilir.
Tipik hata belirtileri: `Manifest merger failed: Attribute application@dataExtractionRules value=(@xml/your_data_extraction_rules)
is also present at [com.other.sdk:library:1.0.0] value=(@xml/other_sdk_data_extraction_rules)`
:::note
Bu değişiklikler Android platform dizininizde yapılmalıdır (genellikle projenizin `android/` klasöründe bulunur).
:::
Sorunu çözmek için şunları yapmanız gerekir:
- Manifest birleştirme işlemine, yedeklemeyle ilgili özellikler için uygulamanızın değerlerini kullanmasını söyleyin.
- Adapty'nin kurallarını diğer SDK'ların kurallarıyla birleştiren yedekleme kuralı dosyaları oluşturun.
#### 1. Manifestinize `tools` ad alanını ekleyin \{#1-add-the-tools-namespace-to-your-manifest\}
`AndroidManifest.xml` dosyanızda, kök `
2. `/Assets/Plugins/Android/launcherTemplate.gradle` dosyasına aşağıdaki satırı ekleyin:
```groovy showLineNumbers
apply plugin: 'com.android.application'
// highlight-next-line
apply plugin: 'kotlin-android'
apply from: 'setupSymbols.gradle'
apply from: '../shared/keepUnitySymbols.gradle'
```
3. Aşağıdaki satırı `/Assets/Plugins/Android/baseProjectTemplate.gradle` dosyasına ekleyin:
```groovy showLineNumbers
plugins {
// If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
// See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
// See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
id 'com.android.application' version '8.3.0' apply false
id 'com.android.library' version '8.3.0' apply false
// highlight-next-line
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
**BUILD_SCRIPT_DEPS**
}
```
---
# File: unity-quickstart-paywalls
---
---
title: "Unity SDK'da paywall'ları kullanarak satın almaları etkinleştirme"
description: "Adapty SDK ile Unity uygulamanızda paywall'ları nasıl göstereceğinizi öğrenin."
---
Uygulama içi satın almaları etkinleştirmek için üç temel kavramı anlamanız gerekir:
- [**Ürünler**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Paywall'lar**](paywalls) – hangi ürünlerin sunulacağını tanımlayan yapılandırmalardır. Adapty'de ürünleri almanın tek yolu paywall'lardır; bu tasarım sayesinde uygulama kodunuza dokunmadan teklifleri, fiyatlandırmayı ve ürün kombinasyonlarını değiştirebilirsiniz.
- [**Placement'lar**](placements) – uygulamanızda paywall'ları nerede ve ne zaman göstereceğiniz (`main`, `onboarding`, `settings` gibi). Kontrol panelinde placement'lar için paywall'lar ayarlarsınız, ardından kodunuzda placement ID'siyle bunları talep edersiniz. Bu yapı, A/B testleri çalıştırmayı ve farklı kullanıcılara farklı paywall'lar göstermeyi kolaylaştırır.
Adapty, uygulamanızda satın almaları etkinleştirmek için üç yöntem sunar. Uygulama gereksinimlerinize göre birini seçin:
| Uygulama | Karmaşıklık | Ne zaman kullanılır |
|------------------------------|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Adapty Paywall Builder | ✅ Kolay | [No-code builder'da eksiksiz, satın almaya hazır bir paywall oluşturursunuz](quickstart-paywalls). Adapty bunu otomatik olarak render eder ve tüm satın alma akışını, makbuz doğrulamasını ve abonelik yönetimini arka planda halleder. |
| Elle oluşturulan paywall'lar | 🟡 Orta | Paywall arayüzünüzü uygulama kodunuzda siz uygularsınız; ancak ürün tekliflerinde esnekliği korumak için paywall nesnesini yine de Adapty'den alırsınız. [Kılavuza](unity-quickstart-manual) bakın. |
| Observer modu | 🔴 Zor | Kendi satın alma altyapınız zaten var ve onu kullanmaya devam etmek istiyorsunuz. Observer modunun Adapty'de bazı sınırlamaları olduğunu unutmayın. [Makaleye](observer-vs-full-mode) bakın. |
:::important
**Aşağıdaki adımlar, Adapty paywall builder'da oluşturulan bir paywall'ın nasıl uygulanacağını göstermektedir.**
Paywall builder'ı kullanmak istemiyorsanız [elle oluşturulan paywall'larda satın almaları yönetme kılavuzuna](unity-making-purchases) bakın.
:::
Adapty paywall builder'da oluşturulmuş bir paywall'ı göstermek için uygulama kodunuzda yalnızca şunları yapmanız yeterlidir:
1. **Paywall'ı alın**: Paywall'ı Adapty'den alın.
2. **Paywall'ı gösterin, satın almaları Adapty halleder**: Uygulamanızda aldığınız paywall container'ını gösterin.
3. **Buton eylemlerini yönetin**: Kullanıcıların paywall ile etkileşimlerini uygulamanızın yanıtlarıyla ilişkilendirin. Örneğin, kullanıcılar butonlara tıkladığında bağlantılar açın veya paywall'ı kapatın.
## Başlamadan önce \{#before-you-start\}
Başlamadan önce şu adımları tamamlayın:
1. Uygulamanızı Adapty Kontrol Paneli'nde [App Store](initial_ios) ve/veya [Google Play](initial-android)'e bağlayın.
2. Adapty'de [ürünlerinizi oluşturun](create-product).
3. [Bir paywall oluşturun ve ürünleri ekleyin](create-paywall).
4. [Bir placement oluşturun ve paywall'ınızı ekleyin](create-placement).
5. Uygulama kodunuzda [Adapty SDK'yı yükleyin ve etkinleştirin](sdk-installation-unity).
:::tip
Bu adımları tamamlamanın en hızlı yolu [hızlı başlangıç kılavuzunu](quickstart) takip etmek ya da [Developer CLI](developer-cli-quickstart) kullanarak paywall'lar ve placement'lar oluşturmaktır.
:::
## 1. Paywall'ı alın \{#1-get-the-paywall\}
Paywall'larınız, kontrol panelinde yapılandırılmış placement'larla ilişkilidir. Placement'lar, farklı kitleler için farklı paywall'lar çalıştırmanıza ya da [A/B testleri](ab-tests) yapmanıza olanak tanır.
Adapty paywall builder'da oluşturulmuş bir paywall almak için şunları yapmanız gerekir:
1. `GetPaywall` metodunu kullanarak [placement](placements) ID'sine göre `paywall` nesnesini alın ve `HasViewConfiguration` özelliğini kontrol ederek builder'da oluşturulmuş bir paywall olup olmadığını doğrulayın.
2. `CreatePaywallView` metodunu kullanarak paywall görünümünü oluşturun. Görünüm, paywall'ı göstermek için gereken UI öğelerini ve stilleri içerir.
:::important
Görünüm yapılandırmasını alabilmek için Paywall Builder'da **Show on device** geçişini açmanız gerekir. Aksi takdirde boş bir görünüm yapılandırması alırsınız ve paywall gösterilmez.
:::
```csharp showLineNumbers
Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => {
if(error != null) {
// handle the error
return;
}
// Create paywall view parameters
var parameters = new AdaptyUICreatePaywallViewParameters();
// Create the paywall view
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if(error != null) {
// handle the error
return;
}
// view - the paywall view ready to be presented
});
});
```
:::info
Bu hızlı başlangıç, bir paywall'ı göstermek için gereken minimum yapılandırmayı sağlar. Gelişmiş yapılandırma ayrıntıları için [paywall alma kılavuzumuza](unity-get-pb-paywalls) bakın.
:::
## 2. Paywall'ı gösterin \{#2-display-the-paywall\}
Paywall yapılandırmasına sahip olduğunuzda, paywall'ınızı göstermek için birkaç satır kod eklemeniz yeterlidir.
Paywall'ı göstermek için `CreatePaywallView` metoduyla oluşturulan `view` üzerinde `view.Present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Paywall'ı tekrar göstermeniz gerekiyorsa yeni bir `view` örneği oluşturmak için `CreatePaywallView`'u tekrar çağırın.
```csharp showLineNumbers title="Unity"
view.Present((error) => {
// handle the error
});
```
:::info
Paywall'ın nasıl gösterileceğine dair daha fazla ayrıntı için [kılavuzumuza](unity-present-paywalls) bakın.
:::
## 3. Buton eylemlerini yönetin \{#3-handle-button-actions\}
Kullanıcılar paywall'daki butonlara tıkladığında Unity SDK, satın almaları ve geri yüklemeleri otomatik olarak işler. Ancak diğer butonların özel veya önceden tanımlanmış ID'leri vardır ve kodunuzda eylem yönetimi gerektirir.
Örneğin paywall'ınızda büyük olasılıkla bir kapat butonu ve açılacak URL'ler (kullanım koşulları ve gizlilik politikası gibi) bulunur. Bu eylemleri yönetmek için sınıfınızın `AdaptyPaywallsEventsListener` arayüzünü uygulaması ve bir dinleyici olarak kaydedilmesi gerekir.
:::tip
Buton [eylemlerini](unity-handle-paywall-actions) ve [olayları](unity-handling-events) nasıl yöneteceğinize dair kılavuzlarımızı okuyun.
:::
```csharp showLineNumbers title="Unity"
public class YourClass : MonoBehaviour, AdaptyPaywallsEventsListener
{
void Start()
{
// Register this class as the paywall events listener
Adapty.SetPaywallsEventsListener(this);
}
// AdaptyPaywallsEventsListener method - handles button actions
public void PaywallViewDidPerformAction(
AdaptyUIPaywallView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
Application.OpenURL(action.Value);
break;
default:
break;
}
}
}
```
## Sonraki adımlar \{#next-steps\}
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
Paywall'ınız uygulamada gösterilmeye hazır. Paywall üzerinden bir test satın alması tamamlayabildiğinizden emin olmak için [App Store sandbox](test-purchases-in-sandbox) veya [Google Play Store](testing-on-android) üzerinde satın almalarınızı test edin.
Artık doğru kullanıcılara paywall gösterdiğinizden veya ücretli özelliklere erişim verdiğinizden emin olmak için [kullanıcıların access level'ını kontrol etmeniz](unity-check-subscription-status) gerekir.
## Tam örnek \{#full-example\}
Tüm bu adımların uygulamanızda birlikte nasıl entegre edilebileceğini aşağıda görebilirsiniz.
```csharp showLineNumbers
using System;
using UnityEngine;
using AdaptySDK;
public class PaywallManager : MonoBehaviour, AdaptyPaywallsEventsListener
{
[SerializeField] private string placementId = "YOUR_PLACEMENT_ID";
private AdaptyUIPaywallView currentPaywallView;
void Start()
{
// Register for paywall events
Adapty.SetPaywallsEventsListener(this);
GetAndDisplayPaywall();
}
private void GetAndDisplayPaywall()
{
Adapty.GetPaywall(placementId, (paywall, error) => {
if (error != null) {
Debug.LogError("Error getting paywall: " + error.Message);
return;
}
if (paywall.HasViewConfiguration) {
CreateAndPresentPaywallView(paywall);
} else {
Debug.LogWarning("Paywall was not created using the builder");
}
});
}
private void CreateAndPresentPaywallView(AdaptyPaywall paywall)
{
var parameters = new AdaptyUICreatePaywallViewParameters();
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if (error != null) {
Debug.LogError("Error creating paywall view: " + error.Message);
return;
}
currentPaywallView = view;
view.Present((presentError) => {
if (presentError != null) {
Debug.LogError("Error presenting paywall: " + presentError.Message);
return;
}
Debug.Log("Paywall presented successfully");
});
});
}
// AdaptyPaywallsEventsListener implementation
public void PaywallViewDidPerformAction(
AdaptyUIPaywallView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
Debug.Log("Close button pressed");
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
Application.OpenURL(action.Value);
break;
default:
break;
}
}
// Required interface methods (implement as needed)
public void PaywallViewDidAppear(AdaptyUIPaywallView view) { }
public void PaywallViewDidDisappear(AdaptyUIPaywallView view) { }
public void PaywallViewDidSelectProduct(AdaptyUIPaywallView view, string productId) { }
public void PaywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) { }
public void PaywallViewDidFinishPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyPurchaseResult purchasedResult) { }
public void PaywallViewDidFailPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void PaywallViewDidStartRestore(AdaptyUIPaywallView view) { }
public void PaywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) { }
public void PaywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void ShowPaywall()
{
GetAndDisplayPaywall();
}
void OnDestroy()
{
if (currentPaywallView != null) {
currentPaywallView.Dismiss(null);
}
}
}
```
---
# File: unity-check-subscription-status
---
---
title: "Unity SDK'da abonelik durumunu kontrol etme"
description: "Adapty ile Unity uygulamanızda abonelik durumunu nasıl kontrol edeceğinizi öğrenin."
---
Kullanıcıların ücretli içeriklere erişip erişemeyeceğine ya da bir paywall görmesi gerekip gerekmediğine karar vermek için profildeki [access level](access-level) değerini kontrol etmeniz gerekir.
Bu makalede, kullanıcılara paywall mı göstereceğinizi yoksa ücretli özelliklere erişim mi vereceğinizi belirlemek amacıyla profil durumuna nasıl erişeceğiniz anlatılmaktadır.
## Abonelik durumunu alma \{#get-subscription-status\}
Bir kullanıcıya paywall mı yoksa ücretli içerik mi göstereceğinize karar verirken, profildeki [access level](access-level) değerini kontrol edersiniz. İki seçeneğiniz var:
- En güncel profil verilerine hemen ihtiyaç duyduğunuzda (örneğin uygulama başlangıcında) veya güncellemeyi zorlamak istediğinizde `GetProfile` çağırın.
- Abonelik durumu her değiştiğinde otomatik olarak yenilenen yerel bir kopya tutmak için **otomatik profil güncellemelerini** ayarlayın.
### Profili alma \{#get-profile\}
Abonelik durumunu almanın en kolay yolu, profile erişmek için `GetProfile` metodunu kullanmaktır:
```csharp showLineNumbers
Adapty.GetProfile((profile, error) => {
if (error != null) {
// handle the error
return;
}
// check the access
});
```
### Abonelik güncellemelerini dinleme \{#listen-to-subscription-updates\}
Uygulamanızda profil güncellemelerini otomatik olarak almak için:
1. `AdaptyEventListener` sınıfını genişletin ve `OnLoadLatestProfile` metodunu uygulayın. Adapty, kullanıcının abonelik durumu her değiştiğinde bu metodu otomatik olarak çağırır.
2. Bu metot çağrıldığında güncellenen profil verilerini saklayın; böylece ek ağ istekleri yapmadan uygulamanızın her yerinde kullanabilirsiniz.
```csharp
public class SubscriptionManager : MonoBehaviour, AdaptyEventListener {
private AdaptyProfile currentProfile;
void Start() {
// Register this object as an Adapty event listener
Adapty.SetEventListener(this);
}
// Store the profile when it updates
public void OnLoadLatestProfile(AdaptyProfile profile) {
currentProfile = profile;
// Update UI, unlock content, etc.
}
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
// Use stored profile instead of calling getProfile()
public bool HasAccess() {
if (currentProfile?.AccessLevels != null &&
currentProfile.AccessLevels.ContainsKey("premium")) {
return currentProfile.AccessLevels["premium"].IsActive;
}
return false;
}
}
```
:::note
Adapty, uygulamanız başladığında `OnLoadLatestProfile`'ı otomatik olarak çağırır; bu sayede cihaz çevrimdışı olsa bile önbelleğe alınmış abonelik verileri sağlanır.
:::
## Profili paywall mantığıyla bağlama \{#connect-profile-with-paywall-logic\}
Paywall gösterme veya ücretli özelliklere erişim verme konusunda anlık kararlar almanız gerektiğinde, kullanıcının profilini doğrudan kontrol edebilirsiniz. Bu yaklaşım; uygulama başlangıcı, premium bölümlere girerken veya belirli içerikleri görüntülemeden önce gibi senaryolarda işe yarar.
```csharp
private void CheckAccessLevel()
{
Adapty.GetProfile((profile, error) => {
if (error != null) {
Debug.LogError("Error checking access level: " + error.Message);
// Show paywall if access check fails
return;
}
var accessLevel = profile.AccessLevels["YOUR_ACCESS_LEVEL"];
if (accessLevel == null || !accessLevel.IsActive) {
// Show paywall if no access
}
});
}
private void InitializePaywall()
{
LoadPaywall();
CheckAccessLevel();
}
```
## Sonraki adımlar \{#next-steps\}
Abonelik durumunu nasıl takip edeceğinizi öğrendiğinize göre, kullanıcıların ödedikleri şeylere erişebildiğinden emin olmak için [kullanıcı profilleriyle çalışmayı](unity-quickstart-identify) öğrenin.
---
# File: unity-quickstart-identify
---
---
title: "Unity SDK'da kullanıcıları tanımlama"
description: "Unity'de uygulama içi abonelik yönetimi için Adapty kurulum hızlı başlangıç kılavuzu."
---
:::important
Bu kılavuz, kendi kimlik doğrulama sisteminiz varsa size yöneliktir. Burada, mevcut kimlik doğrulama sisteminizle uyumlu olacak şekilde Adapty'deki kullanıcı profilleriyle nasıl çalışacağınızı öğreneceksiniz.
:::
Kullanıcıların satın almalarını nasıl yöneteceğiniz, uygulamanızın kimlik doğrulama modeline bağlıdır:
- Uygulamanız arka uç kimlik doğrulaması kullanmıyorsa ve kullanıcı verilerini depolamıyorsa, [anonim kullanıcılar bölümüne](#anonymous-users) bakın.
- Uygulamanızın arka uç kimlik doğrulaması varsa (veya olacaksa), [tanımlı kullanıcılar bölümüne](#identified-users) bakın.
**Temel kavramlar**:
- **Profiller**, SDK'nın çalışması için gereken varlıklardır. Adapty bunları otomatik olarak oluşturur.
- Anonim **(customer user ID olmadan)** veya tanımlı **(customer user ID ile)** olabilirler.
- Adapty'deki profilleri kendi dahili kimlik doğrulama sisteminizle çapraz referanslamak için **customer user ID** sağlarsınız.
Anonim ve tanımlı kullanıcılar arasındaki farklar şunlardır:
| | Anonim kullanıcılar | Tanımlı kullanıcılar |
|-------------------------|-------------------------------------------------------|----------------------------------------------------------------------------------|
| **Satın alma yönetimi** | Mağaza düzeyinde satın alma geri yükleme | Customer user ID aracılığıyla cihazlar arası satın alma geçmişini koruma |
| **Profil yönetimi** | Her yeniden yüklemede yeni profil | Oturumlar ve cihazlar arasında aynı profil |
| **Veri kalıcılığı** | Anonim kullanıcı verisi uygulama kurulumuna bağlıdır | Tanımlı kullanıcı verisi uygulama kurulumları arasında kalıcıdır |
## Anonim kullanıcılar \{#anonymous-users\}
Arka uç kimlik doğrulamanız yoksa, **uygulama kodunda kimlik doğrulamayı yönetmenize gerek yoktur**:
1. SDK, uygulamanın ilk açılışında etkinleştirildiğinde, Adapty **kullanıcı için yeni bir profil oluşturur**.
2. Kullanıcı uygulamada bir şey satın aldığında, bu satın alma **Adapty profili ve mağaza hesabıyla ilişkilendirilir**.
3. Kullanıcı uygulamayı **yeniden yüklediğinde** veya **yeni bir cihazdan** yüklediğinde, Adapty **etkinleştirmede yeni bir anonim profil oluşturur**.
4. Kullanıcı daha önce uygulamanızda satın alma yapmışsa, varsayılan olarak satın almalar SDK etkinleştirmesinde App Store'dan otomatik olarak senkronize edilir.
Yani anonim kullanıcılarla her kurulumda yeni profil oluşturulur; ancak bu bir sorun değildir çünkü Adapty analizlerinde [yeni kurulum olarak neyin sayılacağını yapılandırabilirsiniz](general#4-installs-definition-for-analytics).
Anonim kullanıcılar için kurulumları **cihaz ID'lerine** göre saymanız gerekir. Bu durumda, yeniden yüklemeler dahil olmak üzere bir cihazdaki her uygulama kurulumu bir yükleme olarak sayılır.
## Tanımlı kullanıcılar \{#identified-users\}
Uygulamadaki kullanıcıları tanımlamak için iki seçeneğiniz var:
- [**Giriş/kayıt sırasında:**](#during-loginsignup) Kullanıcılar uygulamanız başladıktan sonra oturum açıyorsa, kimlik doğruladıklarında customer user ID ile `identify()` çağrısı yapın.
- [**SDK etkinleştirmesi sırasında:**](#during-the-sdk-activation) Uygulama başlatılırken zaten bir customer user ID'niz varsa, `activate()` çağrısı yaparken bunu gönderin.
:::important
Varsayılan olarak, Adapty şu anda başka bir Customer User ID ile ilişkilendirilmiş bir Customer User ID'den satın alma aldığında, access level paylaşılır; yani her iki profil de ücretli erişime sahip olur. Bu ayarı, ücretli erişimi bir profilden diğerine aktaracak veya paylaşımı tamamen devre dışı bırakacak şekilde yapılandırabilirsiniz. Ayrıntılar için [makaleye](general#6-sharing-paid-access-between-user-accounts) bakın.
:::
### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin, uygulamanıza giriş yaptıktan veya kaydolduktan sonra), customer user ID'yi ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty bunu otomatik olarak mevcut profille ilişkilendirir.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı kimlikleri her kullanıcı için benzersiz olmalıdır. Parametre değerini sabit kodlarsanız, tüm kullanıcılar tek bir kullanıcı olarak değerlendirilir.
:::
Diğer SDK metodlarını çağırmadan önce `Identify` tamamlanma callback'ini bekleyin. Eş zamanlı çağrılar `#3006 profileWasChanged` hatasına yol açar veya anonim profile düşer. Bkz. [Unity SDK'da çağrı sırası](unity-sdk-call-order).
```csharp showLineNumbers
Adapty.Identify("YOUR_USER_ID", (error) => { // Unique for each user
if(error == null) {
// successful identify
}
});
```
### SDK etkinleştirmesi sırasında \{#during-the-sdk-activation\}
SDK'yı etkinleştirdiğinizde zaten bir customer user ID biliyorsanız, ayrıca `identify` çağrısı yapmak yerine bunu `activate` metodunda gönderebilirsiniz.
Customer user ID bilseniz de bunu yalnızca etkinleştirmeden sonra ayarlarsanız, etkinleştirmede Adapty yeni bir anonim profil oluşturur ve yalnızca `identify` çağrısı yaptıktan sonra mevcut profile geçer.
Mevcut bir customer user ID (daha önce kullandığınız) veya yeni bir tane geçirebilirsiniz. Yeni bir tane geçirirseniz, etkinleştirmede oluşturulan yeni profil otomatik olarak customer user ID ile ilişkilendirilir.
:::note
Varsayılan olarak, anonim profil oluşturma analiz kontrol panellerini etkilemez; çünkü kurulumlar cihaz ID'lerine göre sayılır.
Cihaz ID'si, bir cihazda mağazadan yapılan tek bir uygulama kurulumunu temsil eder ve yalnızca uygulama yeniden yüklendikten sonra yeniden oluşturulur.
Bu, birinci veya tekrar kurulum olup olmadığına ya da mevcut bir customer user ID kullanılıp kullanılmadığına bağlı değildir.
Profil oluşturma (SDK etkinleştirmesinde veya çıkışta), oturum açma veya uygulamayı yeniden yüklemeden yükseltme ek kurulum olayı oluşturmaz.
Kurulumları cihazlar yerine benzersiz kullanıcılara göre saymak istiyorsanız, **App settings** bölümüne gidip [**Installs definition for analytics**](general#4-installs-definition-for-analytics) ayarını yapılandırın.
:::
```csharp showLineNumbers
using UnityEngine;
using AdaptySDK;
var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY")
.SetCustomerUserId("YOUR_USER_ID"); // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
Adapty.Activate(builder.Build(), (error) => {
if (error != null) {
// handle the error
return;
}
});
```
### Kullanıcı çıkışı \{#log-users-out\}
Kullanıcıların çıkış yapması için bir butonunuz varsa, `logout` metodunu kullanın.
:::important
Kullanıcı çıkışı, kullanıcı için yeni bir anonim profil oluşturur.
:::
```csharp showLineNumbers
Adapty.Logout((error) => {
if(error == null) {
// successful logout
}
});
```
:::info
Kullanıcıları tekrar uygulamaya giriş yaptırmak için `identify` metodunu kullanın.
:::
### Girişsiz satın almalara izin verme \{#allow-purchases-without-login\}
Kullanıcılarınız uygulamanıza giriş yapmadan önce ve sonra satın alma yapabiliyorsa, giriş yaptıktan sonra erişimlerini koruduğunuzdan emin olmanız gerekir:
1. Çıkış yapmış bir kullanıcı satın alma yaptığında, Adapty bunu anonim profil ID'siyle ilişkilendirir.
2. Kullanıcı hesabına giriş yaptığında, Adapty tanımlı profiliyle çalışmaya geçer.
- Yeni bir customer user ID ise (örneğin, satın alma kayıt öncesinde yapılmışsa), Adapty customer user ID'yi mevcut profile atar; böylece tüm satın alma geçmişi korunur.
- Mevcut bir customer user ID ise (customer user ID zaten bir profile bağlıysa), profil geçişinden sonra gerçek access level'ı almanız gerekir. Tanımlamadan hemen sonra [`getProfile`](unity-check-subscription-status) çağrısı yapabilir veya veriler otomatik senkronize olması için [profil güncellemelerini dinleyebilirsiniz](unity-check-subscription-status).
## Sonraki adımlar \{#next-steps\}
Tebrikler! Uygulamanızda uygulama içi ödeme mantığını hayata geçirdiniz! Uygulamanızın gelirini artırmanızı diliyoruz!
Adapty'den daha fazla yararlanmak için şu konuları inceleyebilirsiniz:
- [**Test etme**](troubleshooting-test-purchases): Her şeyin beklendiği gibi çalıştığından emin olun
- [**Onboardings**](onboardings): Onboarding'lerle kullanıcıları etkileyin ve elde tutmayı artırın
- [**Entegrasyonlar**](configuration): Tek satır kodla pazarlama attribution ve analiz hizmetleriyle entegre edin
- [**Özel profil öznitelikleri ayarlama**](unity-setting-user-attributes): Kullanıcı profillerine özel öznitelikler ekleyin ve segmentler oluşturun; böylece A/B testleri başlatabilir veya farklı kullanıcılara farklı paywall'lar gösterebilirsiniz
---
# File: adapty-sdk-integration-skill-unity
---
---
title: "SDK entegrasyon skill'i ile Adapty'yi Unity uygulamanıza entegre edin"
description: "Adapty SDK'yı AI kodlama aracınızla Unity uygulamanıza uçtan uca entegre etmek için adapty-sdk-integration skill'ini kullanın."
---
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
:::important
Bu özellik beta aşamasındadır. Takılı kalır veya beklenmedik şekilde davranırsa, [adım adım entegrasyon kılavuzunu](adapty-cursor-unity) takip edin — AI aracınıza her aşamayı doğru belgelerle adım adım anlatır.
:::
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
---
# File: adapty-cursor-unity
---
---
title: "Adapty'yi Unity uygulamanıza yapay zeka yardımıyla entegre edin"
description: "Cursor, Context7, ChatGPT, Claude veya diğer yapay zeka araçlarını kullanarak Adapty'yi Unity uygulamanıza entegre etmek için adım adım kılavuz."
---
Bu kılavuz, bir AI kodlama aracıyla Unity uygulamanıza Adapty'yi adım adım entegre etme sürecini anlatır — doğru Adapty dökümanlarını doğru sırayla besleyerek ilerlersiniz.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Başlamadan önce: kontrol paneli kurulumu \{#before-you-start-dashboard-setup\}
Adapty, herhangi bir SDK kodu yazmadan önce kontrol panelinde bazı ayarların yapılmasını gerektirir. Bunu etkileşimli bir LLM aracıyla ya da Kontrol Paneli üzerinden manuel olarak yapabilirsiniz.
### Skill yaklaşımı (önerilen) \{#skill-approach-recommended\}
Adapty CLI skill'i, LLM'inizin uygulamanızı, ürünlerinizi, access level'larınızı, paywall'larınızı ve placement'larınızı doğrudan kurmasını sağlar — her adım için kontrol panelini açmanıza gerek kalmaz. Yalnızca kontrol panelinde [mağazalarınızı bağlamanız](integrate-payments) yeterlidir.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Skill eklendikten sonra, agent'ınızda `/adapty-cli` komutunu çalıştırın. Mağazalarınızı bağlamak için kontrol panelini ne zaman açmanız gerektiği de dahil olmak üzere her adımda sizi yönlendirecektir.
### Kontrol paneli yaklaşımı \{#dashboard-approach\}
Her şeyi manuel olarak yapılandırmayı tercih ediyorsanız, herhangi bir kod yazmadan önce bunlara ihtiyacınız olacak. LLM'niz kontrol paneli değerlerini sizin için arayamaz — bunları kendiniz sağlamanız gerekir.
1. **Uygulama mağazalarınızı bağlayın**: Adapty Kontrol Paneli'nde **App settings → General** bölümüne gidin. Unity uygulamanız her iki platformu da hedefliyorsa hem App Store'u hem de Google Play'i bağlayın. Bu, satın alımların çalışması için gereklidir.
[Uygulama mağazalarını bağlayın](integrate-payments)
2. **Public SDK anahtarınızı kopyalayın**: Adapty Kontrol Paneli'nde **App settings → General** sayfasına gidin, ardından **API keys** bölümünü bulun. Kodda, bu Adapty yapılandırma builder'ına geçirdiğiniz string'dir.
3. **En az bir ürün oluşturun**: Adapty Kontrol Paneli'nde **Products** sayfasına gidin. Ürünlere kodda doğrudan başvurmazsınız — Adapty bunları paywall'lar aracılığıyla iletir.
[Ürün ekle](quickstart-products)
4. **Bir paywall ve placement oluşturun**: Adapty Kontrol Paneli'nde **Paywalls** sayfasında bir paywall oluşturun, ardından bunu **Placements** sayfasında bir placement'a atayın. Kodda, placement ID'si `Adapty.GetPaywall("YOUR_PLACEMENT_ID")` çağrısına ilettiğiniz string'dir.
[Paywall oluştur](quickstart-paywalls)
5. **Access level'ları ayarlayın**: Adapty Kontrol Paneli'nde, **Products** sayfasında ürün bazında yapılandırın. Kodda, `profile.AccessLevels["premium"]?.IsActive` içinde kontrol edilen string'dir. Varsayılan `premium` access level çoğu uygulama için yeterlidir. Ödeme yapan kullanıcılar ürüne göre farklı özelliklere erişiyorsa (örneğin `basic` plan ile `pro` plan), kodlamaya başlamadan önce [ek access level'lar oluşturun](assigning-access-level-to-a-product).
:::tip
Beşini de tamamladığınızda kod yazmaya hazırsınız. LLM'inize şunu söyleyin: "Public SDK anahtarım X, placement ID'm Y" — böylece doğru başlatma ve paywall çekme kodunu üretebilir.
:::
### Hazır olduğunuzda kurulum \{#set-up-when-ready\}
Bunlar kodlamaya başlamak için zorunlu değildir, ancak entegrasyonunuz olgunlaştıkça bunlara ihtiyaç duyacaksınız:
- **A/B testleri**: **Placements** sayfasından yapılandırın. Kod değişikliği gerekmez.
[A/B testleri](ab-tests)
- **Ek paywall'lar ve placement'lar**: Farklı placement ID'leriyle daha fazla `GetPaywall` çağrısı ekleyin.
- **Analitik entegrasyonları**: **Integrations** sayfasından yapılandırın. Kurulum entegrasyona göre değişir. Bkz. [analitik entegrasyonları](analytics-integration) ve [attribution entegrasyonları](attribution-integration).
## LLM'inize Adapty Dokümanlarını Besleyin \{#feed-adapty-docs-to-your-llm\}
### Context7'yi Kullanın (önerilen)
[Context7](https://context7.com), LLM'inizin güncel Adapty belgelerine doğrudan erişmesini sağlayan bir MCP sunucusudur. LLM, ne sorduğunuza göre doğru belgeleri otomatik olarak getirir — manuel URL yapıştırmaya gerek yoktur.
Context7; **Cursor**, **Claude Code**, **Windsurf** ve diğer MCP uyumlu araçlarla çalışır. Kurulum için şunu çalıştırın:
```
npx ctx7 setup
```
Bu komut, editörünüzü algılar ve Context7 sunucusunu yapılandırır. Manuel kurulum için [Context7 GitHub deposuna](https://github.com/upstash/context7) bakın.
Yapılandırıldıktan sonra, Adapty kütüphanesine prompt'larınızda referans verin:
```
Use the adaptyteam/adapty-docs library to look up how to install the Unity SDK
```
:::warning
Context7, belge bağlantılarını manuel olarak yapıştırma ihtiyacını ortadan kaldırsa da uygulama sırası önemlidir. Her şeyin doğru çalıştığından emin olmak için aşağıdaki [uygulama adımlarını](#implementation-walkthrough) sırayla takip edin.
:::
### Düz metin dokümanları kullanın \{#use-plain-text-docs\}
Her Adapty dokümanına düz metin Markdown olarak erişebilirsiniz. URL'nin sonuna `.md` ekleyin ya da makale başlığının altındaki **Copy for LLM** butonuna tıklayın. Örneğin: [adapty-cursor-unity.md](https://adapty.io/docs/tr/adapty-cursor-unity.md).
Aşağıdaki [uygulama adım adım rehberi](#implementation-walkthrough)'nin her aşamasında, yapıştırabileceğiniz `.md` bağlantılarıyla birlikte "Send this to your LLM" bloğu yer almaktadır.
Aynı anda daha fazla doküman için aşağıdaki [indeks dosyaları ve platforma özel alt kümelerine](#plain-text-doc-index-files) bakın.
## Uygulama adım adım \{#implementation-walkthrough\}
Bu kılavuzun geri kalanı, Adapty entegrasyonunu uygulama sırasına göre ele alır. Her aşamada LLM'inize gönderebileceğiniz dokümanlar, tamamlandığında görmeniz gerekenler ve sık karşılaşılan sorunlar yer alır.
### Entegrasyonunuzu Planlayın \{#plan-your-integration\}
Koda geçmeden önce, LLM'inizden projenizi analiz etmesini ve bir uygulama planı oluşturmasını isteyin. AI aracınız bir planlama modunu destekliyorsa (Cursor'ın veya Claude Code'un plan modu gibi), LLM'in herhangi bir kod yazmadan önce hem proje yapınızı hem de Adapty dokümanlarını okuyabilmesi için bunu kullanın.
LLM'inize satın alma işlemleri için hangi yaklaşımı kullandığınızı söyleyin — bu, takip etmesi gereken kılavuzları etkiler:
- [**Adapty Paywall Builder**](adapty-paywall-builder): Adapty'nin no-code builder'ında paywall'lar oluşturursunuz ve SDK bunları otomatik olarak render eder.
- [**Manuel oluşturulan paywall'lar**](unity-making-purchases): Kendi paywall arayüzünüzü kodla oluşturursunuz ancak ürünleri çekmek ve satın almaları yönetmek için Adapty'yi kullanmaya devam edersiniz.
- [**Observer mode**](observer-vs-full-mode): Mevcut satın alma altyapınızı korur ve Adapty'yi yalnızca analitik ve entegrasyonlar için kullanırsınız.
Hangisini seçeceğinizden emin değil misiniz? [Hızlı başlangıçtaki karşılaştırma tablosunu](unity-quickstart-paywalls) okuyun.
### SDK'yı Yükleyin ve Yapılandırın \{#install-and-configure-the-sdk\}
Adapty SDK paketini Unity Package Manager aracılığıyla ekleyin ve Public SDK anahtarınızla etkinleştirin. Bu, temel adımdır — diğer hiçbir şey bu olmadan çalışmaz.
**Rehber:** [Adapty SDK'yı yükleyin ve yapılandırın](sdk-installation-unity)
Bunu LLM'inize gönderin:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/tr/sdk-installation-unity.md
```
:::tip[Checkpoint]
- **Beklenen:** Proje derleniyor ve çalışıyor. Unity Console, Adapty aktivasyon logunu gösteriyor.
- **Dikkat:** "Public API key is missing" → **App settings** bölümünden gerçek anahtarınızı kopyalayıp placeholder'ın yerine yapıştırdığınızı kontrol edin.
:::
### Paywall'ları göster ve satın almaları yönet \{#show-paywalls-and-handle-purchases\}
Placement ID'sine göre bir paywall getir, görüntüle ve satın alma olaylarını yönet. İhtiyacınız olan kılavuzlar, satın almaları nasıl yönettiğinize bağlıdır.
Her satın almayı ilerledikçe sandbox'ta test et — sona kadar bekleme. Kurulum talimatları için [Sandbox'ta satın alma testi](test-purchases-in-sandbox) bölümüne bakın.
isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenir. İlk alt etiket dil, ikincisi ise bölge içindir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, mevcut olması halinde önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri deneyimler. Önbellek düzenli aralıklarla güncellenir, dolayısıyla ağ isteklerini azaltmak amacıyla oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını; yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Paywall'ları daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman paywall'larınızın en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün kimliklerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer birçok özelliği içeren bir [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesi. | ## Paywall Builder ile tasarlanan paywall'un görünüm yapılandırmasını getirin \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall Builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse görünüm yapılandırması getirilemez. ::: Paywall'u getirdikten sonra, Paywall Builder kullanılarak oluşturulduğunu gösteren bir `ViewConfiguration` içerip içermediğini kontrol edin. Bu bilgi, paywall'u nasıl görüntüleyeceğinizi belirler. `ViewConfiguration` mevcutsa Paywall Builder paywall'u olarak ele alın; yoksa [remote config paywall olarak işleyin](present-remote-config-paywalls-unity). Unity SDK'da, görünüm yapılandırmasını manuel olarak önceden getirmeye gerek kalmadan doğrudan `CreatePaywallView` metodunu çağırın. :::warning `CreatePaywallView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa `CreatePaywallView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers var parameters = new AdaptyUICreatePaywallViewParameters() .SetPreloadProducts(preloadProducts) .SetLoadTimeout(new TimeSpan(0, 0, 3)); AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => { // handle the result }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------ | :------------- | :----------------------------------------------------------- | | **paywall** | zorunlu | İstenen paywall için bir controller edinmek amacıyla kullanılan `AdaptyPaywall` nesnesi. | | **loadTimeout** | varsayılan: 5 sn | Bu yöntem için zaman aşımı sınırını belirler. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür. Arka planda farklı isteklerden oluşabileceğinden, bu yöntem nadir durumlarda `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabilir. | | **PreloadProducts** | isteğe bağlı | Ekranda ürünlerin görüntülenme süresini optimize etmek için bir `AdaptyPaywallProducts` dizisi sağlayın. `nil` geçilirse AdaptyUI gerekli ürünleri otomatik olarak getirir. | | **CustomTags** | isteğe bağlı | Özel etiketlerin ve çözümlenmiş değerlerinin bir sözlüğünü tanımlayın. Özel etiketler, paywall içeriğinde yer tutucu olarak işlev görür; paywall içinde kişiselleştirilmiş içerik sunmak için belirli dizelerle dinamik olarak değiştirilirler. Daha fazla ayrıntı için Paywall Builder'da özel etiketler konusuna bakın. | | **CustomTimers** | isteğe bağlı | Özel zamanlayıcıların ve bitiş tarihlerinin bir sözlüğünü tanımlayın. Özel zamanlayıcılar, paywallınızda geri sayım sayaçları görüntülemenizi sağlar. | :::note Birden fazla dil kullanıyorsanız, [Paywall Builder yerelleştirmesi eklemeyi](add-paywall-locale-in-adapty-paywall-builder) ve yerel ayar kodlarını doğru kullanmayı [buradan](localizations-and-locale-codes) öğrenebilirsiniz. ::: Görünümü elde ettikten sonra, [paywallı gösterin](unity-present-paywalls). ## Varlıkları özelleştirme \{#customize-assets\} Paywallınızdaki görüntü ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görüntü ve videoların önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leriyle hedefleyerek davranışlarını özelleştirirsiniz. Diğer görüntü ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görüntü veya video gösterin. - Uzaktaki ana görüntü yüklenirken yerel bir önizleme görüntüsü gösterin. - Video başlamadan önce bir önizleme görüntüsü gösterin. :::important Bu özelliği kullanmak için Adapty Unity SDK'yı 3.8.0 veya üzeri bir sürüme güncelleyin. ::: Aşağıda, basit bir sözlük aracılığıyla özel varlıkları nasıl sağlayabileceğinize dair bir örnek bulunmaktadır: ```csharp showLineNumbers var customAssets = new Dictionaryisteğe bağlı
varsayılan: `en`
|Paywall yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel verilere her zaman ulaşamayabilir; ancak internet bağlantısı ne kadar düzensiz olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum sırasında ağ isteklerini önlemek amacıyla kullanmak güvenlidir.
Önbelleğin, uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırıldığında veya manuel temizleme yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek paywall'lar. Paywall'ları daha hızlı yüklemek için CDN, CDN'e erişilemediği durumlar için ise bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken paywall'larınızın her zaman en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| --- # File: unity-present-paywalls --- --- title: "Paywallları görüntüleme" description: "Adapty SDK ile Unity uygulamanızda paywallları nasıl görüntüleyeceğinizi öğrenin." --- Paywall Builder ile bir paywall özelleştirdiyseniz, bunu kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render etmenize gerek yoktur. Böyle bir paywall, hem ne gösterileceğini hem de nasıl gösterileceğini içerir. :::warning Bu kılavuz, Adapty SDK 3.3.0 veya sonrasını gerektiren **yeni Paywall Builder**'ı kapsamaktadır. Remote config paywalllarını sunmak için bkz. [Remote config ile tasarlanan paywallları render etme](present-remote-config-paywalls). ::: Bir paywall görüntülemek için, [`CreatePaywallView`](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) metodu tarafından oluşturulan `view` üzerinde `view.Present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Paywall'ı tekrar görüntülemeniz gerekiyorsa, yeni bir `view` örneği oluşturmak için `CreatePaywallView`'ı bir kez daha çağırın. :::warning Aynı `view`'ı yeniden oluşturmadan tekrar kullanmak, `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers title="Unity" view.Present((error) => { // handle the error }); ``` :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Diyalog gösterme \{#show-dialog\} Android'de bir paywall görünümü sunulduğunda, yerel uyarı iletişim kutuları yerine bu metodu kullanın. Android'de normal uyarılar paywall görünümünün arkasında kalarak kullanıcılara görünmez hale gelir. Bu metod, tüm platformlarda iletişim kutusunun paywall'ın üzerinde düzgün şekilde gösterilmesini sağlar. ```csharp showLineNumbers title="Unity" var dialog = new AdaptyUIDialogConfiguration() .SetTitle("Close paywall?") .SetContent("You will lose access to exclusive offers.") .SetDefaultActionTitle("Stay") .SetSecondaryActionTitle("Close"); AdaptyUI.ShowDialog(view, dialog, (action, error) => { if (error == null) { if (action == AdaptyUIDialogActionType.Secondary) { // User confirmed - close the paywall view.Dismiss(); } // If primary - do nothing, user stays } }); ``` ## iOS sunum stilini yapılandırma \{#configure-ios-presentation-style\} `Present()` metoduna `iosPresentationStyle` parametresini geçirerek paywall'ın iOS'ta nasıl sunulacağını yapılandırın. Parametre, `AdaptyUIIOSPresentationStyle.FullScreen` (varsayılan) veya `AdaptyUIIOSPresentationStyle.PageSheet` değerlerini kabul eder. ```csharp showLineNumbers title="Unity" view.Present(AdaptyUIIOSPresentationStyle.PageSheet, (error) => { // handle the error }); ``` --- # File: unity-handle-paywall-actions --- --- title: "Unity SDK'da düğme eylemlerine yanıt verme" description: "Daha iyi uygulama monetizasyonu için Unity'de Adapty kullanarak paywall düğme eylemlerini yönetin." --- Adapty Paywall Builder kullanarak paywall oluşturuyorsanız, düğmeleri doğru şekilde yapılandırmanız gerekir: 1. [Paywall builder'da bir düğme ekleyin](paywall-buttons) ve bu düğmeye mevcut bir eylem atayın ya da özel bir eylem ID'si oluşturun. 2. Uygulamanızın kodunda, atadığınız her eylemi işleyecek kodu yazın. Bu rehber, özel ve hazır eylemleri kodunuzda nasıl yöneteceğinizi göstermektedir. :::warning **Yalnızca satın almalar ve geri yüklemeler otomatik olarak işlenir.** Paywallları kapatma veya bağlantı açma gibi diğer tüm düğme eylemleri için uygulama kodunuzda ilgili işleyicileri uygulamanız gerekir. ::: ## Paywallları kapatma \{#close-paywalls\} Paywall'ınızı kapatacak bir düğme eklemek için: 1. Paywall builder'da bir düğme ekleyin ve **Close** eylemini atayın. 2. Uygulama kodunuzda, paywall'ı kapatan `close` eylemi için bir işleyici uygulayın. ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Close: view.Dismiss(null); break; default: // handle other events break; } } ``` ## Paywall'lardan URL açma \{#open-urls-from-paywalls\} :::tip Bir grup bağlantı eklemek istiyorsanız (örneğin, kullanım koşulları ve satın alma geri yükleme), paywall builder'da bir **Link** öğesi ekleyin ve bunu **Open URL** eylemine sahip düğmelerle aynı şekilde işleyin. ::: Paywall'ınızdan bir bağlantı açan bir düğme eklemek için (örneğin, **Kullanım Koşulları** veya **Gizlilik Politikası**): 1. Paywall builder'da bir düğme ekleyin, **Open URL** eylemini atayın ve açmak istediğiniz URL'yi girin. 2. Uygulama kodunuzda, alınan URL'yi tarayıcıda açan `openUrl` eylemi için bir işleyici uygulayın. ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.OpenUrl: var urlString = action.Value; if(!string.IsNullOrWhiteSpace(urlString)) { Application.OpenURL(urlString); } break; default: // handle other events break; } } ``` ## Uygulamaya giriş yapma \{#log-into-the-app\} Kullanıcıların uygulamanıza giriş yapmasını sağlayan bir düğme eklemek için: 1. Paywall builder'da bir düğme ekleyin ve `login` ID'siyle **Custom** eylemini atayın. 2. Uygulama kodunuzda, kullanıcınızı tanımlayan `login` özel eylemi için bir işleyici uygulayın. ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Custom: if (action.Value == "login") { // Navigate to login scene SceneManager.LoadScene("LoginScene"); } break; default: // handle other events break; } } ``` ## Özel eylemleri yönetme \{#handle-custom-actions\} Diğer eylemleri yöneten bir düğme eklemek için: 1. Paywall builder'da bir düğme ekleyin, **Custom** eylemini atayın ve bir ID belirleyin. 2. Uygulama kodunuzda, oluşturduğunuz eylem ID'si için bir işleyici uygulayın. Örneğin, başka bir abonelik teklifi veya tek seferlik satın alma seçeneğiniz varsa, başka bir paywall görüntüleyen bir düğme ekleyebilirsiniz: ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Custom: if (action.Value == "openNewPaywall") { // Display another paywall ShowAlternativePaywall(); } break; default: // handle other events break; } } private void ShowAlternativePaywall() { // Implement your logic to show alternative paywall } ``` --- # File: unity-handling-events --- --- title: "Paywall olaylarını yönet" description: "Adapty SDK ile Unity uygulamanızda paywall olaylarını nasıl yöneteceğinizi öğrenin." --- :::important Bu rehber; satın alma, geri yükleme, ürün seçimi ve paywall render işlemlerine ait olay yönetimini kapsar. Ayrıca buton işlemlerini de (paywallı kapatma, bağlantı açma vb.) uygulamanız gerekir. Ayrıntılar için [buton aksiyonlarını yönetme rehberimize](unity-handle-paywall-actions) bakın. ::: [Paywall Builder](adapty-paywall-builder) ile yapılandırılan paywall'lar, satın alma ve geri yükleme işlemleri için ek kod gerektirmez. Ancak uygulamanızın yanıt verebileceği bazı olaylar üretirler. Bu olaylar; buton tıklamaları (kapat butonları, URL'ler, ürün seçimleri vb.) ve paywall üzerinde gerçekleştirilen satın alma ile ilgili aksiyonlara dair bildirimleri kapsar. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz. :::warning Bu rehber yalnızca Adapty SDK v3.3.0 veya üzerini gerektiren **yeni Paywall Builder paywall'ları** içindir. ::: :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Olayları yönetme \{#handling-events\} Mobil uygulamanızdaki paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için `AdaptyPaywallsEventsListener` arayüzünü uygulayın: ```csharp showLineNumbers title="Unity" using UnityEngine; using AdaptySDK; public class PaywallEventsHandler : MonoBehaviour, AdaptyPaywallsEventsListener { void Start() { Adapty.SetPaywallsEventsListener(this); } // Implement all required interface methods below } ``` ### Kullanıcı kaynaklı olaylar \{#user-generated-events\} #### Paywall göründü \{#paywall-appeared\} Paywall görünümü ekranda gösterildiğinde tetiklenir. :::note iOS'ta, kullanıcı bir paywall içindeki [web paywall butonuna](web-paywall#step-2a-add-a-web-purchase-button) dokunduğunda ve uygulama içi tarayıcıda bir web paywall açıldığında da tetiklenir. ::: ```csharp showLineNumbers title="Unity" public void PaywallViewDidAppear(AdaptyUIPaywallView view) { } ``` #### Paywall kayboldu \{#paywall-disappeared\} Paywall görünümü ekrandan kapatıldığında tetiklenir. :::note iOS'ta, bir paywalldan uygulama içi tarayıcıda açılan [web paywall](web-paywall#step-2a-add-a-web-purchase-button) ekrandan kaybolduğunda da tetiklenir. ::: ```csharp showLineNumbers title="Unity" public void PaywallViewDidDisappear(AdaptyUIPaywallView view) { } ``` #### Ürün seçimi \{#product-selection\} Kullanıcı ya da sistem tarafından satın alma için bir ürün seçildiğinde tetiklenir. ```csharp showLineNumbers title="Unity" public void PaywallViewDidSelectProduct( AdaptyUIPaywallView view, string productId ) { } ```
## Paywall görüntüleme sayısı çok yüksek \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntüleme sayısı beklenenin iki katını gösteriyor.
**Neden**: Kodunuzda `LogShowPaywall` çağırıyor olabilirsiniz; Paywall Builder kullanıyorsanız bu, görüntüleme sayısını çiftler. Paywall Builder ile tasarlanmış paywall'larda analitikler otomatik olarak izlenir, dolayısıyla bu metodu kullanmanıza gerek yoktur.
**Çözüm**: Paywall Builder kullanıyorsanız kodunuzda `LogShowPaywall` çağırmadığınızdan emin olun.
## Diğer sorunlar \{#other-issues\}
**Sorun**: Yukarıda ele alınmayan başka Paywall Builder ile ilgili sorunlar yaşıyorsunuz.
**Çözüm**: Gerekirse [migration kılavuzlarını](unity-sdk-migration-guides) kullanarak SDK'yı en son sürüme geçirin. Birçok sorun yeni SDK sürümlerinde çözülmüştür.
---
# File: unity-quickstart-manual
---
---
title: "Unity SDK'da özel paywallınızda satın alma işlemlerini etkinleştirme"
description: "Uygulama içi satın almaları etkinleştirmek için Adapty SDK'yı özel Unity paywalllarınıza entegre edin."
---
Bu kılavuz, Adapty'yi özel paywalllarınıza nasıl entegre edeceğinizi açıklar. Paywall uygulaması üzerinde tam kontrolü elinizde tutarken Adapty SDK ürünleri getirir, yeni satın alma işlemlerini yönetir ve önceki satın almaları geri yükler.
:::important
**Bu kılavuz, özel paywall uygulayan geliştiriciler içindir.** Satın alma işlemlerini etkinleştirmenin en kolay yolunu arıyorsanız [Adapty Paywall Builder](unity-quickstart-paywalls)'ı kullanın. Paywall Builder ile paywallları kodsuz görsel düzenleyicide oluşturursunuz, Adapty tüm satın alma mantığını otomatik olarak yönetir ve uygulamanızı yeniden yayınlamadan farklı tasarımları test edebilirsiniz.
:::
## Başlamadan önce \{#before-you-start\}
### Ürünleri ayarlama \{#set-up-products\}
Uygulama içi satın almaları etkinleştirmek için üç temel kavramı anlamanız gerekir:
- [**Ürünler**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Paywalllar**](paywalls) – hangi ürünlerin sunulacağını tanımlayan yapılandırmalar. Adapty'de ürünleri almanın tek yolu paywalllar üzerindendir; ancak bu yapı sayesinde uygulama kodunuza dokunmadan ürünleri, fiyatları ve teklifleri değiştirebilirsiniz.
- [**Placement'lar**](placements) – uygulamanızda paywallları nerede ve ne zaman göstereceğiniz (örneğin `main`, `onboarding`, `settings`). Kontrol panelinde placement'lar için paywalllar ayarlarsınız, ardından kodunuzda placement ID'si ile bunları talep edersiniz. Bu yapı, A/B testleri çalıştırmayı ve farklı kullanıcılara farklı paywalllar göstermeyi kolaylaştırır.
Özel paywall kullanıyor olsanız bile bu kavramları anladığınızdan emin olun. Bunlar temelde uygulamanızda sattığınız ürünleri yönetme yönteminizdir.
Özel paywallınızı uygulamak için bir **paywall** oluşturmanız ve bunu bir **placement**'a eklemeniz gerekir. Bu kurulum, ürünlerinizi almanızı sağlar. Kontrol panelinde yapmanız gerekenleri anlamak için [buradaki](quickstart) hızlı başlangıç kılavuzunu takip edin.
### Kullanıcıları yönetme \{#manage-users\}
Kendi tarafınızda backend kimlik doğrulaması ile veya olmadan çalışabilirsiniz.
Ancak Adapty SDK, anonim ve tanımlanmış kullanıcıları farklı şekilde ele alır. Ayrıntıları anlamak ve kullanıcılarla düzgün şekilde çalıştığınızdan emin olmak için [kimlik belirleme hızlı başlangıç kılavuzunu](unity-quickstart-identify) okuyun.
## Adım 1. Ürünleri alın \{#step-1-get-products\}
Özel paywallınız için ürünleri almak üzere şunları yapmanız gerekir:
1. [placement](placements) ID'sini `getPaywall` metoduna geçirerek `paywall` nesnesini alın.
2. `getPaywallProducts` metodunu kullanarak bu paywall için ürünler dizisini alın.
```csharp showLineNumbers
using AdaptySDK;
void LoadPaywall() {
Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => {
if (error != null) {
// Handle the error
return;
}
Adapty.GetPaywallProducts(paywall, (products, productsError) => {
if (productsError != null) {
// Handle the error
return;
}
// Use products to build your custom paywall UI
});
});
}
```
## Adım 2. Satın almaları kabul edin \{#step-2-accept-purchases\}
Kullanıcı özel paywallınızda bir ürüne dokunduğunda, seçili ürünle `makePurchase` metodunu çağırın. Bu işlem satın alma akışını yönetir ve güncellenmiş profili döndürür.
```csharp showLineNumbers
using AdaptySDK;
void PurchaseProduct(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
if (error != null) {
// Handle the error
return;
}
switch (result.Type) {
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// Purchase successful, profile updated
break;
case AdaptyPurchaseResultType.UserCancelled:
// User canceled the purchase
break;
case AdaptyPurchaseResultType.Pending:
// Purchase is pending (e.g., user will pay offline with cash)
break;
}
});
}
```
## Adım 3. Satın almaları geri yükleyin \{#step-3-restore-purchases\}
Uygulama mağazaları, abonelik içeren tüm uygulamaların kullanıcılara satın almalarını geri yükleyebilecekleri bir yol sunmasını zorunlu kılar.
Kullanıcı geri yükleme düğmesine dokunduğunda `restorePurchases` metodunu çağırın. Bu işlem, satın alma geçmişini Adapty ile senkronize eder ve güncellenmiş profili döndürür.
```csharp showLineNumbers
using AdaptySDK;
void RestorePurchases() {
Adapty.RestorePurchases((profile, error) => {
if (error != null) {
// Handle the error
return;
}
// Restore successful, profile updated
});
}
```
## Sonraki adımlar \{#next-steps\}
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
Paywallınız uygulamada gösterilmeye hazır. Paywalldan bir test satın alması tamamlayabildiğinizden emin olmak için satın almalarınızı [App Store sandbox](test-purchases-in-sandbox) ortamında veya [Google Play Store](testing-on-android)'da test edin.
Ardından, paywallı gösterip göstermeyeceğinizi ya da ücretli özelliklere erişim izni verip vermeyeceğinizi belirlemek için [kullanıcıların satın alma işlemini tamamlayıp tamamlamadığını kontrol edin](unity-check-subscription-status).
---
# File: fetch-paywalls-and-products-unity
---
---
title: "Unity SDK'da remote config paywalllar için paywallları ve ürünleri çekme"
description: "Kullanıcı gelirini artırmak için Adapty Unity SDK'da paywallları ve ürünleri çekin."
---
Remote config ve özel paywallları göstermeden önce, bunlara ilişkin bilgileri çekmeniz gerekir. Bu konunun remote config ve özel paywalllarla ilgili olduğunu unutmayın. Paywall Builder ile özelleştirilmiş paywalllar için çekme işlemine dair rehber için [Paywall Builder paywalllarını ve yapılandırmalarını çekme](unity-get-pb-paywalls) bölümüne bakın.
:::tip
Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın.
:::
isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması önerildiğine dair daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](unity-localizations-and-locale-codes) bölümüne bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla silindiğini unutmayın.
Adapty SDK, paywallları iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](unity-use-fallback-paywalls). Paywallları daha hızlı çekmek için CDN kullanıyoruz ve CDN'e erişilemediği durumlarda bağımsız bir yedek sunucu devreye giriyor. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman paywalllarınızın en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın, çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini koda sabit olarak yazmayın! Paywalllar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz denemeler gibi) zamanla değişebilir. Kodunuzun bu senaryoları işlediğinden emin olun. Örneğin, başlangıçta 2 ürün alırsanız uygulamanız o 2 ürünü görüntülemelidir. Ancak daha sonra 3 ürün alırsanız, uygulamanız herhangi bir kod değişikliği gerektirmeden 3 ürünün tamamını görüntülemelidir. Koda sabit olarak yazmanız gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'leri listesi, paywall tanımlayıcısı, remote config ve diğer çeşitli özelliklerle birlikte bir [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesi. | ## Ürünleri çekme \{#fetch-products\} Paywallı aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```csharp showLineNumbers Adapty.GetPaywallProducts(paywall, (products, error) => { if(error != null) { // handle the error return; } // products - the requested products array }); ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer çeşitli özelliklerle birlikte [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken, [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) nesnesindeki bu özelliklere erişmeniz gerekecektir. Aşağıda en sık kullanılan özellikler gösterilmektedir; ancak mevcut tüm özelliklere ilişkin tam ayrıntılar için bağlantılı belgeye başvurun. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Ürünün başlığını görüntülemek için `product.LocalizedTitle` kullanın. Yerelleştirmenin cihazın yerel ayarına değil, kullanıcıların seçtiği mağaza ülkesine göre yapıldığını unutmayın. | | **Price** | Fiyatın yerelleştirilmiş sürümünü görüntülemek için `product.Price.LocalizedString` kullanın. Bu yerelleştirme, cihazın yerel ayar bilgisine dayanır. Fiyata sayı olarak `product.Price.Amount` üzerinden de erişebilirsiniz. Değer yerel para birimi cinsinden sağlanacaktır. İlişkili para birimi sembolünü almak için `product.Price.CurrencySymbol` kullanın. | | **Subscription Period** | Dönemi (ör. hafta, ay, yıl vb.) görüntülemek için `product.Subscription?.LocalizedPeriod` kullanın. Bu yerelleştirme cihazın yerel ayarına dayanır. Abonelik dönemini programatik olarak almak için `product.Subscription?.Period` kullanın. Oradan uzunluğu almak için `Unit` enum'una erişebilirsiniz (`AdaptySubscriptionPeriodUnit.Day`, `AdaptySubscriptionPeriodUnit.Week`, `AdaptySubscriptionPeriodUnit.Month`, `AdaptySubscriptionPeriodUnit.Year` veya `AdaptySubscriptionPeriodUnit.Unknown`). `NumberOfUnits` değeri, dönem birimi sayısını verir. Örneğin, üç aylık bir abonelik için Unit özelliğinde `AdaptySubscriptionPeriodUnit.Month`, NumberOfUnits özelliğinde `3` görürsünüz. | | **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerdiğini belirten bir rozet veya gösterge görüntülemek için `product.Subscription?.Offer?.Phases` özelliğine bakın. Bu, ücretsiz deneme aşaması ve başlangıç fiyatı aşaması olmak üzere iki indirim aşamasına kadar içerebilen bir listedir. Her aşama nesnesi içinde şu yararlı özellikler bulunur:isteğe bağlı
varsayılan: `en`
|Paywall yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla silindiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek paywalllar. Paywallları daha hızlı çekmek için CDN kullanıyoruz ve CDN'e erişilemediği durumlarda bağımsız bir yedek sunucu devreye giriyor. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman paywalllarınızın en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| --- # File: present-remote-config-paywalls-unity --- --- title: "Unity SDK'da remote config ile tasarlanan paywallı render etme" description: "Adapty Unity SDK'da remote config paywalllarının nasıl sunulacağını ve kullanıcı deneyiminin nasıl kişiselleştirileceğini keşfedin." --- Bir paywallı remote config kullanarak özelleştirdiyseniz, kullanıcılara göstermek için mobil uygulama kodunuzda render işlemini kendiniz yapmanız gerekir. Remote config, ihtiyaçlarınıza göre esneklik sunduğundan, paywallınıza nelerin dahil olacağını ve görünümünün nasıl olacağını siz belirlersiniz. Remote config aracılığıyla yapılandırılmış özel paywallınızı gösterebilmek için remote yapılandırmayı çekmeye yarayan bir yöntem sunuyoruz. ## Paywall remote config'ini alın ve sunun \{#get-paywall-remote-config-and-present-it\} Bir paywallın remote config'ini almak için `remoteConfig` özelliğine erişin ve ihtiyaç duyduğunuz değerleri çekin. ```csharp showLineNumbers Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => { if (error != null) { // handle the error return; } // Access remote config dictionary var dictionary = paywall.RemoteConfig?.Dictionary; var headerText = dictionary?["header_text"] as string; // Or access raw JSON data var jsonData = paywall.RemoteConfig?.Data; }); ``` Bu noktada, gerekli tüm değerleri aldıktan sonra bunları görsel açıdan çekici bir sayfaya dönüştürme zamanı gelmiştir. Tasarımın farklı telefon ekranlarına ve yönlendirmelerine uyum sağladığından, tüm cihazlarda sorunsuz ve kullanıcı dostu bir deneyim sunduğundan emin olun. :::warning Adapty analitiğinin huni ve A/B testi verilerini doğru kaydedebilmesi için aşağıda açıklandığı şekilde [paywall görüntüleme etkinliğini kaydettiğinizden](present-remote-config-paywalls-unity#track-paywall-view-events) emin olun. ::: Paywallı göstermeyi tamamladıktan sonra satın alma akışını kurabilirsiniz. Kullanıcı bir satın alma yaptığında, paywallınızdaki ürünle birlikte `.MakePurchase()` yöntemini çağırmanız yeterlidir. `.MakePurchase()` yöntemi hakkında ayrıntılı bilgi için [Satın alma yapma](unity-making-purchases) bölümüne bakın. [Yedek paywall olarak adlandırılan bir fallback paywall oluşturmanızı](unity-use-fallback-paywalls) öneririz. Bu yedek, internet bağlantısı olmadığında veya önbellek mevcut olmadığında kullanıcıya gösterilir ve bu durumlarda bile sorunsuz bir deneyim sağlar. ## Paywall görüntüleme etkinliklerini takip edin \{#track-paywall-view-events\} Adapty, paywalllarınızın performansını ölçmenize yardımcı olur. Satın alma verilerini otomatik olarak toplasak da paywall görüntülemelerini kaydetmek sizin sorumluluğunuzdadır; çünkü bir müşterinin paywallı ne zaman gördüğünü yalnızca siz bilebilirsiniz. Bir paywall görüntüleme etkinliği kaydetmek için `.LogShowPaywall(paywall)` yöntemini çağırmanız yeterlidir; bu işlem, huni ve A/B testi metriklerinize yansıyacaktır. :::important [Paywall Builder](adapty-paywall-builder) ile oluşturulan paywallları gösteriyorsanız `.LogShowPaywall(paywall)` çağrısı yapmanıza gerek yoktur. ::: ```csharp showLineNumbers Adapty.LogShowPaywall(paywall, (error) => { // handle the error }); ``` İstek parametreleri: | Parametre | Zorunluluk | Açıklama | | :---------- | :--------- |:---------------------------------------------------------------| | **paywall** | zorunlu | Bir [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesi. | --- # File: unity-making-purchases --- --- title: "Unity SDK ile mobil uygulamada satın alma yapma" description: "Adapty kullanarak uygulama içi satın almaları ve abonelikleri yönetme kılavuzu." --- Mobil uygulamanızda paywall'ları göstermek, kullanıcılara premium içerik veya hizmetlere erişim sunmanın temel adımlarından biridir. Ancak, paywall'larınızı özelleştirmek için [Paywall Builder](adapty-paywall-builder) kullanıyorsanız, bu paywall'ları yalnızca göstermek satın almaları desteklemek için yeterlidir. Paywall Builder kullanmıyorsanız, satın alma işlemini tamamlamak ve istenen içeriğin kilidini açmak için `.makePurchase()` adlı ayrı bir metot kullanmanız gerekir. Bu metot, kullanıcıların paywall'larla etkileşime geçmesini ve istedikleri işlemleri gerçekleştirmesini sağlayan kapı işlevi görür. Eğer paywallınızda kullanıcının satın almaya çalıştığı ürün için aktif bir promosyon teklifi varsa, Adapty bunu satın alma sırasında otomatik olarak uygular. :::warning Başlangıç teklifinin otomatik olarak uygulanabilmesi için Paywall Builder ile oluşturulmuş paywallları kullanmanız gerektiğini unutmayın. Diğer durumlarda, [iOS'ta kullanıcının başlangıç teklifi için uygunluğunu doğrulamanız](fetch-paywalls-and-products#check-intro-offer-eligibility-on-ios) gerekecektir. Bu adımı atlamak, uygulamanızın yayın sürecinde reddedilmesine yol açabilir. Bunun yanı sıra, başlangıç teklifine uygun olan kullanıcılardan tam fiyat alınmasına neden olabilir. ::: [Başlangıç yapılandırmasını](quickstart) tek bir adımı bile atlamadan tamamladığınızdan emin olun. Bu olmadan satın alımları doğrulayamayız. ## Satın alma yapma \{#make-purchase\} :::note **[Paywall Builder](adapty-paywall-builder) kullanıyor musunuz?** Satın almalar otomatik olarak işlenir—bu adımı atlayabilirsiniz. **Adım adım rehber mi arıyorsunuz?** Tam bağlam içeren uçtan uca uygulama talimatları için [hızlı başlangıç kılavuzuna](unity-implement-paywalls-manually) göz atın. ::: ```csharp showLineNumbers using AdaptySDK; void MakePurchase(AdaptyPaywallProduct product) { Adapty.MakePurchase(product, (result, error) => { switch (result.Type) { case AdaptyPurchaseResultType.Pending: // handle pending purchase break; case AdaptyPurchaseResultType.UserCancelled: // handle purchase cancellation break; case AdaptyPurchaseResultType.Success: var profile = result.Profile; // handle successfull purchase break; default: break; } }); } ``` İstek parametreleri: | Parametre | Varlık | Açıklama | | :---------- | :------- |:---------------------------------------------------------------------------------------------------| | **Product** | gerekli | Paywall'dan alınan bir [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) nesnesi. | Yanıt parametreleri: | Parametre | Açıklama | |---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Profile** |İstek başarılı olursa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) nesnesi, kullanıcının uygulama içindeki access level'ları, abonelikleri ve tek seferlik satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Hâlâ Apple'ın StoreKit v2.0'dan düşük bir sürümünü ve Adapty SDK'nın v2.9.0'dan düşük bir sürümünü kullanıyorsanız, bunun yerine [Apple App Store paylaşılan secret'ı](app-store-connection-configuration#step-5-enter-app-store-shared-secret) sağlamanız gerekir. Bu yöntem Apple tarafından kullanımdan kaldırılmıştır. ::: ## Satın alma sırasında aboneliği değiştirme \{#change-subscription-when-making-a-purchase\} Bir kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu süreç uygulama mağazasına göre farklı işler: - App Store'da abonelik, abonelik grubu içinde otomatik olarak güncellenir. Kullanıcı bir gruptan abonelik satın alırken başka bir gruptan zaten aktif bir aboneliği varsa, her iki abonelik aynı anda aktif olur. - Google Play'de abonelik otomatik olarak güncellenmez. Geçişi, aşağıda açıklandığı gibi mobil uygulama kodunuzda yönetmeniz gerekir. Android'de aboneliği başka biriyle değiştirmek için `.makePurchase()` metodunu ek parametre ile çağırın: ```csharp showLineNumbers // Create subscription update parameters var subscriptionUpdateParams = new AdaptySubscriptionUpdateParameters( "old_product_id", // Product ID of the current subscription AdaptySubscriptionUpdateReplacementMode.WithTimeProration ); Adapty.MakePurchase(product, subscriptionUpdateParams, (profile, error) => { if(error != null) { // Handle the error return; } // successful cross-grade }); ``` Ek istek parametresi: | Parametre | Varlık | Açıklama | | :--------------------------- | :------- |:-------------------------------------------------------------------------------------------------------| | **subscriptionUpdateParams** | zorunlu | bir [`AdaptySubscriptionUpdateParameters`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_subscription_update_parameters.html) nesnesi. | Abonelikler ve değiştirme modları hakkında daha fazla bilgi edinmek için Google Geliştirici belgelerine bakabilirsiniz: - [Değiştirme modları hakkında](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Google'ın değiştirme modları için önerileri](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Değiştirme modu [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Not: Bu yöntem yalnızca abonelik yükseltmeleri için kullanılabilir. Düşürme işlemleri desteklenmez. - Değiştirme modu [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Not: Gerçek abonelik değişikliği yalnızca mevcut abonelik fatura dönemi sona erdiğinde gerçekleşir. ## iOS'ta teklif kodlarını kullanma \{#redeem-offer-codes-in-ios\}Bir [`AdaptyProfile`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) nesnesi. Bu model; access level, abonelik ve abonelik dışı satın alımlara ilişkin bilgileri içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level** durumunu kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: implement-observer-mode-unity --- --- title: "Unity SDK'da Observer modu uygulama" description: "Unity SDK'da kullanıcı abonelik olaylarını izlemek için Adapty'de observer modunu uygulayın." --- Kendi satın alma altyapınız varsa ve Adapty'ye tamamen geçmeye hazır değilseniz, [Observer modu](observer-vs-full-mode)'nu inceleyebilirsiniz. Temel haliyle Observer modu; gelişmiş analitik ve attribution ile analitik sistemlerle sorunsuz entegrasyon sunar. Bu ihtiyaçlarınızı karşılıyorsa yalnızca şunları yapmanız yeterli: 1. Adapty SDK'yı yapılandırırken `observerMode` parametresini `true` olarak ayarlayarak Observer modunu etkinleştirin. Kurulum talimatlarını [Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk) için takip edin. 2. Mevcut satın alma altyapınızdaki işlemleri [Adapty'ye bildirin](report-transactions-observer-mode-unity). ### Observer modu kurulumu \{#observer-mode-setup\} Satın alma ve abonelik durumunu kendiniz yönetiyorsanız ve Adapty'yi yalnızca abonelik olayları ile analitik göndermek için kullanıyorsanız Observer modunu etkinleştirin. :::important Observer modunda çalışırken Adapty SDK hiçbir işlemi kapatmaz; bu nedenle bunu kendiniz yönettiğinizden emin olun. ::: ```csharp showLineNumbers title="C#" using UnityEngine; using AdaptySDK; public class AdaptyListener : MonoBehaviour, AdaptyEventListener { void Start() { DontDestroyOnLoad(this.gameObject); Adapty.SetEventListener(this); var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY") .SetObserverMode(true); // Enable observer mode Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); } public void OnLoadLatestProfile(AdaptyProfile profile) { } public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { } public void OnInstallationDetailsFail(AdaptyError error) { } } ``` Parametreler: | Parametre | Açıklama | |--------------|------------------------------------------------------------------------------------------------------------| | observerMode | [Observer modu](observer-vs-full-mode)'nu kontrol eden boolean değer. Varsayılan değer `false`'tur. | ## Observer Modunda Adapty paywall'larını kullanma \{#using-adapty-paywalls-in-observer-mode\} Adapty'nin paywall'larını ve A/B testi özelliklerini de kullanmak istiyorsanız bunu yapabilirsiniz; ancak Observer modunda birkaç ek adım gerekir. Yukarıdaki adımlara ek olarak şunları yapmanız gerekir: 1. [Remote config paywall'ları](present-remote-config-paywalls-unity) için paywall'ları her zamanki gibi gösterin. 3. Satın alma işlemleriyle [paywall'ları ilişkilendirin](report-transactions-observer-mode-unity). --- # File: report-transactions-observer-mode-unity --- --- title: "Unity SDK'da Observer Mode'da işlemleri raporlama" description: "Unity SDK'da kullanıcı içgörüleri ve gelir takibi için Adapty Observer Mode'da satın alma işlemlerini raporlayın." ---iOS, StoreKit 1 için: [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction) nesnesi.
iOS, StoreKit 2 için: [Transaction](https://developer.apple.com/documentation/storekit/transaction) nesnesi.
Android için: Satın almanın String tanımlayıcısı (purchase.getOrderId); burada satın alma, billing library [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) sınıfının bir örneğidir.
| | variationId | zorunlu | Varyasyonun string tanımlayıcısı. [AdaptyPaywall](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesinin `variationId` özelliği kullanılarak elde edilebilir. |phoneNumber
firstName
lastName
| String | | gender | Enum, izin verilen değerler: `female`, `male`, `other` | | birthday | Date | ### Özel kullanıcı nitelikleri \{#custom-user-attributes\} Kendi özel niteliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanım şekliyle ilgilidir. Örneğin fitness uygulamaları için haftalık egzersiz sayısı, dil öğrenme uygulamaları için kullanıcının bilgi seviyesi gibi. Bu nitelikleri segmentlerde kullanarak hedefli paywall'lar ve teklifler oluşturabilir; hangi ürün metriklerinin geliri en çok etkilediğini anlamak için de analizlerde kullanabilirsiniz. ```csharp showLineNumbers try { builder = builder.SetCustomStringAttribute("string_key", "string_value"); builder = builder.SetCustomDoubleAttribute("double_key", 123.0f); } catch (Exception e) { // handle the exception } ``` Mevcut bir anahtarı kaldırmak için `.withRemoved(customAttributeForKey:)` metodunu kullanın: ```csharp showLineNumbers try { builder = builder.RemoveCustomAttribute("key_to_remove"); } catch (Exception e) { // handle the exception } ``` Bazen daha önce hangi özel niteliklerin yüklendiğini öğrenmek gerekebilir. Bunun için `AdaptyProfile` nesnesinin `customAttributes` alanını kullanın. :::warning `customAttributes` değerinin güncel olmayabileceğini unutmayın; kullanıcı nitelikleri farklı cihazlardan herhangi bir zamanda gönderilebileceğinden, son senkronizasyondan bu yana sunucudaki nitelikler değişmiş olabilir. ::: ### Sınırlar \{#limits\} - Kullanıcı başına en fazla 30 özel nitelik - Anahtar adları en fazla 30 karakter uzunluğunda olabilir. Anahtar adı alfanümerik karakterler ve şunlardan herhangi birini içerebilir: `_` `-` `.` - Değer, en fazla 50 karakterden oluşan bir string veya float olabilir. --- # File: unity-listen-subscription-changes --- --- title: "Unity SDK'da abonelik durumunu kontrol etme" description: "Unity uygulamanızda müşteri tutundurmasını artırmak için Adapty'de kullanıcı abonelik durumunu takip edin ve yönetin." --- Adapty ile abonelik durumunu takip etmek çok kolay. Ürün ID'lerini kodunuza manuel olarak eklemenize gerek yok. Bunun yerine, aktif bir [access level](access-level) olup olmadığını kontrol ederek kullanıcının abonelik durumunu zahmetsizce doğrulayabilirsiniz.Bir [AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) nesnesi. Genellikle, kullanıcının uygulamaya premium erişimi olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu her zaman API'yi sorgulamaya çalıştığından en güncel sonucu döndürür. Herhangi bir nedenle (örneğin internet bağlantısı yokluğu) Adapty SDK sunucudan bilgi alamazsa önbellekteki veriler döndürülür. Ayrıca Adapty SDK'nın bu bilgileri mümkün olduğunca güncel tutmak için `AdaptyProfile` önbelleğini düzenli aralıklarla güncellediğini de belirtmek gerekir.
| `.getProfile()` metodu, access level durumunu alabileceğiniz kullanıcı profilini sağlar. Uygulama başına birden fazla access level tanımlayabilirsiniz. Örneğin bir gazete uygulamanız varsa ve farklı konulara bağımsız abonelikler satıyorsanız, "sports" ve "science" adında access level'lar oluşturabilirsiniz. Ancak çoğu zaman yalnızca bir access level'a ihtiyaç duyulur; bu durumda varsayılan "premium" access level'ı kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmek için bir örnek: ```csharp showLineNumbers Adapty.GetProfile((profile, error) => { if (error != null) { // handle the error return; } // "premium" is an identifier of default access level var accessLevel = profile.AccessLevels["premium"]; if (accessLevel != null && accessLevel.IsActive) { // grant access to premium features } }); ``` ### Abonelik durumu güncellemelerini dinleme \{#listening-for-subscription-status-updates\} Kullanıcının aboneliği her değiştiğinde Adapty bir olay tetikler. Adapty'den mesaj alabilmek için bazı ek yapılandırmalar yapmanız gerekir: ```csharp showLineNumbers // Extend `AdaptyEventListener ` with `OnLoadLatestProfile ` method: public class AdaptyListener : MonoBehaviour, AdaptyEventListener { public void OnLoadLatestProfile(AdaptyProfile profile) { // handle any changes to subscription state } } ``` Adapty, uygulama başlangıcında da bir olay tetikler. Bu durumda önbellekteki abonelik durumu iletilir. ### Abonelik durumu önbelleği \{#subscription-status-cache\} Adapty SDK'daki önbellek, profilin abonelik durumunu saklar. Bu sayede sunucu kullanılamaz olsa bile profil abonelik durumu hakkında bilgi sağlamak için önbellekteki verilere erişilebilir. Ancak önbellekten doğrudan veri isteği yapılamadığını belirtmek gerekir. SDK, profille ilgili güncelleme veya değişiklikleri kontrol etmek için sunucuyu her dakika periyodik olarak sorgular. Yeni işlemler ya da diğer güncellemeler gibi değişiklikler varsa, sunucuyla senkronizasyonu korumak amacıyla önbellekteki verilere yansıtılır. --- # File: unity-deal-with-att --- --- title: "Unity SDK'da ATT ile Başa Çıkma" description: "Abonelik kurulumu ve yönetimini kolaylaştırmak için Unity'de Adapty'ye başlayın." --- Uygulamanız AppTrackingTransparency çerçevesini kullanıyor ve kullanıcıya uygulama izleme yetkilendirme isteği sunuyorsa, [yetkilendirme durumunu](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) Adapty'ye göndermeniz gerekir. ```csharp showLineNumbers var builder = new Adapty.ProfileParameters.Builder() .SetAppTrackingTransparencyStatus(IOSAppTrackingTransparencyStatus.Authorized); Adapty.UpdateProfile(builder.Build(), (error) => { if(error != null) { // handle the error } }); ``` :::warning Bu değeri, değiştiği anda mümkün olan en erken sürede göndermenizi şiddetle tavsiye ederiz; yalnızca bu durumda veriler, yapılandırdığınız entegrasyonlara zamanında iletilecektir. ::: --- # File: kids-mode-unity --- --- title: "Unity SDK'da Çocuk Modu" description: "Apple ve Google politikalarına uymak için Çocuk Modunu kolayca etkinleştirin. Unity SDK'da IDFA, GAID veya reklam verisi toplanmaz." --- Unity uygulamanız çocuklara yönelikse [Apple](https://developer.apple.com/kids/) ve [Google](https://support.google.com/googleplay/android-developer/answer/9893335) politikalarına uymanız gerekir. Adapty SDK kullanıyorsanız, birkaç basit adımla SDK'yı bu politikalara uygun şekilde yapılandırabilir ve uygulama mağazası incelemelerini geçebilirsiniz. ## Ne yapmanız gerekiyor? \{#whats-required\} Adapty SDK'yı aşağıdakilerin toplanmasını devre dışı bırakacak şekilde yapılandırmanız gerekir: - [IDFA (Reklamverenler için Tanımlayıcı)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Advertising ID (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [IP adresi](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) Bunların yanı sıra, kullanıcı ID'sini dikkatli kullanmanızı öneririz. `isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesi anlamına gelir.
Yerel ayar kodları ve bunların kullanımı hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](flutter-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel veriyi alamayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, dolayısıyla ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında korunduğunu ve yalnızca uygulama yeniden yüklendiğinde ya da manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı almak için CDN, CDN'e erişilemediği durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` ile belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özellikler içeren bir [`AdaptyOnboarding`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_onboarding.html) nesnesi. | Onboarding'i aldıktan sonra `CreateOnboardingView` metodunu çağırın. :::warning `CreateOnboardingView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa `CreateOnboardingView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers AdaptyUI.CreateOnboardingView(onboarding, (view, error) => { // handle the result }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |:---------------| :------------- |:-----------------------------------------------------------------------------| | **onboarding** | zorunlu | İstenen onboarding için görünüm elde etmek amacıyla kullanılan `AdaptyOnboarding` nesnesi. | | **externalUrlsPresentation** |isteğe bağlı
varsayılan: `InAppBrowser`
|Onboarding'deki bağlantıların nasıl açıldığını kontrol eder. Mevcut seçenekler:
- `AdaptyWebPresentation.InAppBrowser` - Bağlantıları uygulama içi tarayıcıda açar (varsayılan)
- `AdaptyWebPresentation.ExternalBrowser` - Bağlantıları cihazın harici tarayıcısında açar
Kullanım örnekleri için [Onboarding'lerde bağlantıların nasıl açıldığını özelleştirme](unity-present-onboardings#customize-how-links-open-in-onboardings) sayfasına bakın.
| Onboarding'i ve görünüm yapılandırmasını başarıyla yükledikten sonra [mobil uygulamanızda gösterebilirsiniz](unity-present-onboardings). ## Varsayılan kitle onboarding'i ile onboarding almayı hızlandırın \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Genellikle onboarding'ler neredeyse anında alınır, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve onboarding'iniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, onboarding almak istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir onboarding göstermek isteyebilirsiniz. Bunu çözmek için, **Tüm Kullanıcılar** kitlesi için belirtilen placement'ın onboarding'ini alan `GetOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding Alma](#fetch-onboarding) bölümünde ayrıntılı olarak açıklandığı şekilde `getOnboarding` metoduyla onboarding almak olduğunu anlamak çok önemlidir. :::warning `GetOnboardingForDefaultAudience` yerine `GetOnboarding` kullanmayı düşünün; ikincisinin önemli sınırlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorun yaratabilir; geriye dönük uyumlu tasarımlar yapmanızı veya eski sürümlerin yanlış görüntülenebileceğini kabul etmenizi gerektirir. - **Kişiselleştirme yok**: Yalnızca "Tüm Kullanıcılar" kitlesi için içerik gösterir; ülke, attribution veya özel özniteliklere dayalı hedeflemeyi ortadan kaldırır. Kullanım durumunuzda daha hızlı alma bu dezavantajlardan daha önemli ise, aşağıda gösterildiği gibi `GetOnboardingForDefaultAudience` kullanın. Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı gibi `GetOnboarding` kullanın. ::: ```csharp showLineNumbers Adapty.GetOnboardingForDefaultAudience("YOUR_PLACEMENT_ID", (onboarding, error) => { if (error != null) { // handle the error return; } // the requested onboarding }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesi anlamına gelir.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel veriyi alamayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, dolayısıyla ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında korunduğunu ve yalnızca uygulama yeniden yüklendiğinde ya da manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı almak için CDN, CDN'e erişilemediği durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| --- # File: unity-present-onboardings --- --- title: "Unity SDK'da onboarding sunma" description: "Daha fazla dönüşüm elde etmek için onboarding'leri etkili biçimde nasıl sunacağınızı öğrenin." --- Builder'ı kullanarak bir onboarding özelleştirdiyseniz, onu kullanıcıya göstermek için Unity uygulama kodunuzda ayrıca render etmeniz gerekmez. Bu tür bir onboarding, hem onboarding içinde neyin gösterileceğini hem de nasıl gösterileceğini zaten içerir. Başlamadan önce şunları doğrulayın: 1. [Adapty Unity SDK](sdk-installation-unity) 3.14.0 veya daha yeni bir sürümü yüklediniz. 2. [Bir onboarding oluşturdunuz](create-onboarding). 3. Onboarding'i bir [placement](placements)'a eklediniz. Bir onboarding görüntülemek için `CreateOnboardingView` metoduyla oluşturulan `view` üzerinde `view.Present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Paywall'ı tekrar görüntülemeniz gerekirse, yeni bir `view` örneği oluşturmak için `CreateOnboardingView` metodunu bir kez daha çağırın. :::warning `view`'ı yeniden oluşturmadan tekrar kullanmak `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers title="Unity" view.Present((presentError) => { if (presentError != null) { // handle the error } }; ``` ## iOS sunum stilini yapılandırma \{#configure-ios-presentation-style\} `Present()` metoduna `iosPresentationStyle` parametresini geçerek onboarding'in iOS'ta nasıl sunulacağını yapılandırın. Parametre `AdaptyUIIOSPresentationStyle.FullScreen` (varsayılan) veya `AdaptyUIIOSPresentationStyle.PageSheet` değerlerini kabul eder. ```csharp showLineNumbers title="Unity" view.Present(AdaptyUIIOSPresentationStyle.PageSheet, (error) => { // handle the error }); ``` ## Onboarding'lerde bağlantıların nasıl açılacağını özelleştirin \{#customize-how-links-open-in-onboardings\} :::important Onboarding'lerde bağlantıların nasıl açılacağını özelleştirme özelliği Adapty SDK v3.15 sürümünden itibaren desteklenmektedir. ::: Varsayılan olarak, onboarding'lerdeki bağlantılar uygulama içi tarayıcıda açılır; bu sayede uygulamalar arasında geçiş yapmadan web sayfaları doğrudan uygulamanız içinde gösterilir. Bağlantıları bunun yerine harici bir tarayıcıda açmak için `CreateOnboardingView` metoduna `AdaptyWebPresentation.ExternalBrowser` değerini geçin: ```csharp showLineNumbers title="Unity" AdaptyUI.CreateOnboardingView( onboarding, AdaptyWebPresentation.ExternalBrowser, // default — InAppBrowser (view, error) => { if (error != null) { // handle the error return; } // present the onboarding view view.Present((presentError) => { if (presentError != null) { // handle the error } }); } ); ``` Mevcut seçenekler: - `AdaptyWebPresentation.InAppBrowser` - Bağlantıları uygulama içi tarayıcıda açar (varsayılan) - `AdaptyWebPresentation.ExternalBrowser` - Bağlantıları cihazın harici tarayıcısında açar --- # File: unity-handling-onboarding-events --- --- title: "Unity SDK'da onboarding olaylarını işleme" description: "Adapty kullanarak Unity'de onboarding ile ilgili olayları işleyin." --- Başlamadan önce şunların sağlandığından emin olun: 1. [Adapty Unity SDK](sdk-installation-unity) 3.14.0 veya daha yeni bir sürümünü yüklediniz. 2. [Bir onboarding oluşturdunuz](create-onboarding). 3. Onboarding'i bir [placement](placements)'a eklediniz. Builder ile yapılandırılan onboarding'ler, uygulamanızın yanıt verebileceği olaylar oluşturur. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz. Unity uygulamanızdaki onboarding ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için `AdaptyOnboardingsEventsListener` arayüzünü uygulayın. ## Özel eylemler \{#custom-actions\} Builder'da bir butona **custom** (özel) eylem ekleyip bir ID atayabilirsiniz.
Bu ID'yi kodunuzda kullanarak özel bir eylem olarak işleyebilirsiniz. Örneğin, kullanıcı **Login** veya **Allow notifications** gibi özel bir butona dokunduğunda, `OnboardingViewOnCustomAction` metodu `actionId` parametresiyle tetiklenir; bu parametre builder'daki **Action ID** değerine karşılık gelir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
Onboarding olaylarını yönetmek için `AdaptyOnboardingsEventsListener` arayüzünü uygulayın:
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
void Start()
{
Adapty.SetOnboardingsEventsListener(this);
}
public void OnboardingViewOnCustomAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
if (actionId == "allowNotifications") {
// request notification permissions
}
}
public void OnboardingViewDidFailWithError(
AdaptyUIOnboardingView view,
AdaptyError error
)
{
// handle errors
}
// Implement other required interface methods (see examples below)
}
```
:::important
Kullanıcı onboarding'i kapattığında ne olacağını kendiniz yönetmeniz gerektiğini unutmayın. Örneğin, onboarding'in görüntülenmesini durdurmanız gerekir.
:::
Sınıfınızda `OnboardingViewOnCloseAction` metodunu uygulayın:
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
public void OnboardingViewOnCloseAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
view.Dismiss((error) => {
if (error != null) {
// handle the error
}
});
}
// ... other interface methods
}
```
2. Abonelik grubu adına tıklayın. Ürünlerinizi **Subscriptions** bölümünde göreceksiniz.
3. Test ettiğiniz ürünün **Ready to Submit** olarak işaretlendiğinden emin olun.
4. Tablodaki ürün ID'sini Adapty Kontrol Paneli'ndeki [**Products**](https://app.adapty.io/products) sekmesindekiyle karşılaştırın. ID'ler eşleşmiyorsa ürün ID'sini tablodan kopyalayın ve Adapty Kontrol Paneli'nde bu ID ile [bir ürün oluşturun](create-product).
## Adım 3. Ürün kullanılabilirliğini kontrol edin \{#step-4-check-product-availability\}
1. **App Store Connect**'e geri dönün ve aynı **Subscriptions** bölümünü açın.
2. Ürünlerinizi görüntülemek için abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Availability** bölümüne inin ve gerekli tüm ülke ve bölgelerin listelendiğini doğrulayın.
## Adım 4. Ürün fiyatlarını kontrol edin \{#step-5-check-product-prices\}
1. **App Store Connect**'teki **Monetization** → **Subscriptions** bölümüne gidin.
2. Abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Subscription Pricing** bölümüne inin ve **Current Pricing for New Subscribers** kısmını genişletin.
5. Gerekli tüm fiyatların listelendiğinden emin olun.
## Adım 5. Uygulamanın ücretli durumunu, banka hesabını ve vergi formlarının aktif olduğunu kontrol edin \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. **App Store Connect**](https://appstoreconnect.apple.com/) ana sayfasında **Business** seçeneğine tıklayın.
2. Şirketinizin adını seçin.
3. Aşağı kaydırın ve **Paid Apps Agreement**, **Bank Account** ile **Tax forms** bölümlerinin tümünün **Active** olarak göründüğünü doğrulayın.
Bu adımları izleyerek `InvalidProductIdentifiers` uyarısını çözebilir ve ürünlerinizi mağazada yayına alabilirsiniz.
## Adım 6. Ürün takılı kaldıysa yeniden oluşturun \{#step-6-recreate-the-product-if-its-stuck\}
1–5 arası adımların hepsi geçiyor olabilir — `Approved` durumu, eşleşen Bundle ID, geçerli API anahtarı — ancak SDK yine de `1000 noProductIDsFound` hatası döndürüyor olabilir. Bu durumda ürün, Apple'ın kayıt defterinde takılı kalmış olabilir. Apple'ın ürün kayıt defteri zaman zaman, bir ürünün App Store Connect arayüzünde görünmesine karşın StoreKit arama yoluna açık olmadığı bir duruma girebilir.
Ürünü App Store Connect'te silin ve aynı ürün kimliğiyle yeniden oluşturun. Yeniden oluşturmanın ardından yayılımın tamamlanması için 24 saate kadar bekleyin.
---
# File: cantMakePayments-unity
---
---
title: "Unity SDK'da Code-1003 cantMakePayment hatasının çözümü"
description: "Adapty'de abonelikleri yönetirken oluşan ödeme hatalarını çözün."
---
1003 hatası, `cantMakePayments`, bu cihazda uygulama içi satın alımların yapılamayacağını belirtir.
`cantMakePayments` hatasıyla karşılaşıyorsanız, bu genellikle şu nedenlerden biriyle ilgilidir:
- Cihaz kısıtlamaları: Bu hata Adapty ile ilgili değildir. Aşağıdaki çözüm yollarına bakın.
- Observer mode yapılandırması: `makePurchase` metodu ve observer mode aynı anda kullanılamaz. Aşağıdaki bölüme bakın.
## Sorun: Cihaz kısıtlamaları \{#issue-device-restrictions\}
| Sorun | Çözüm |
|------------------------------|------------------------------------------------------------------------------------------------------------------------------|
| Ekran Süresi kısıtlamaları | [Ekran Süresi](https://support.apple.com/en-us/102470) ayarlarında Uygulama İçi Satın Alım kısıtlamalarını devre dışı bırakın |
| Hesap askıya alındı | Hesap sorunlarını çözmek için Apple Destek ile iletişime geçin |
| Bölgesel kısıtlamalar | Desteklenen bir bölgeden App Store hesabı kullanın |
## Sorun: Observer mode ve makePurchase'ı birlikte kullanmak \{#issue-using-both-observer-mode-and-makepurchase\}
Satın alımları yönetmek için `makePurchases` kullanıyorsanız Observer mode'u kullanmanıza gerek yoktur. [Observer mode](observer-vs-full-mode), yalnızca satın alma mantığını kendiniz uyguladığınızda gereklidir.
Dolayısıyla `makePurchase` kullanıyorsanız, SDK etkinleştirme kodundan Observer mode'u etkinleştiren kısmı güvenle kaldırabilirsiniz.
---
# File: migration-to-unity-sdk-314
---
---
title: "Adapty Unity SDK'yı v3.14'e Taşıma"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Unity SDK v3.14'e geçin."
---
Adapty SDK 3.14.0, bazı geliştirmeler getiren büyük bir sürümdür. Bu geliştirmeler sizin tarafınızdan bazı taşıma adımları gerektirebilir:
1. Paywall olayları için ayrı event listener.
2. `AdaptyUI.CreateView`'i `AdaptyUI.CreatePaywallView` ve ilgili metodlara yeniden adlandırın.
3. `MakePurchase` metodunu bireysel parametreler yerine `AdaptyPurchaseParameters` kullanacak şekilde güncelleyin.
4. `SetFallbackPaywalls`'u `SetFallback` metoduyla değiştirin.
5. Paywall özellik erişimini `AdaptyPlacement` kullanacak şekilde güncelleyin.
6. Remote config erişimini `AdaptyRemoteConfig` nesnesi kullanacak şekilde güncelleyin.
7. `AdaptyPaywall` modelinde `VendorProductIds`'i `ProductIdentifiers` ile değiştirin.
8. `GetPaywall` fetch policy'sini `AdaptyFetchPolicy` kullanacak şekilde güncelleyin.
## Paywall olayları için ayrı olay dinleyicisi \{#separate-event-listener-for-paywall-events\}
[Paywall Builder](adapty-paywall-builder) ile tasarlanmış paywallları görüntülüyorsanız, paywall görünüm olayları artık özel `AdaptyPaywallsEventsListener` arayüzünü ve `SetPaywallsEventsListener` metodunu kullanmaktadır. `AdaptyEventListener` arayüzü ise profil güncellemeleri ve kurulum detayları için kullanılmaya devam etmektedir.
```diff showLineNumbers
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour,
- AdaptyEventListener {
+ AdaptyEventListener,
+ AdaptyPaywallsEventsListener {
void Start() {
Adapty.SetEventListener(this);
+ Adapty.SetPaywallsEventsListener(this);
}
// AdaptyEventListener methods
public void OnLoadLatestProfile(AdaptyProfile profile) { }
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
+ // AdaptyPaywallsEventsListener methods
+ // Implement paywall event handlers here
}
```
[Paywall olaylarını işleme hakkında daha fazla bilgi edinin](unity-handling-events).
## Görünüm oluşturma ve sunum metodlarını yeniden adlandırın \{#rename-view-creation-and-presentation-methods\}
Görünüm oluşturma ve sunum metodları yeniden adlandırıldı:
```diff showLineNumbers
using AdaptySDK;
- AdaptyUI.CreateView(paywall, parameters, (view, error) => {
+ AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if (error != null) {
// handle the error
return;
}
- AdaptyUI.PresentView(view, (error) => {
+ AdaptyUI.PresentPaywallView(view, (error) => {
// handle the error
});
});
}
```
Benzer şekilde, kapatma metodu da yeniden adlandırıldı:
```diff showLineNumbers
- AdaptyUI.DismissView(view, (error) => {
+ AdaptyUI.DismissPaywallView(view, (error) => {
// handle the error
});
```
## MakePurchase yöntemini güncelleme \{#update-makepurchase-method\}
`MakePurchase` yöntemi artık ayrı `subscriptionUpdateParams` ve `isOfferPersonalized` argümanları yerine `AdaptyPurchaseParameters` kullanıyor. Bu, daha iyi tür güvenliği sağlar ve gelecekte satın alma parametrelerinin genişletilebilmesine olanak tanır.
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(
AdaptyPaywallProduct product,
AdaptySubscriptionUpdateParameters subscriptionUpdate,
bool? isOfferPersonalized
) {
- Adapty.MakePurchase(product, subscriptionUpdate, isOfferPersonalized, (result, error) => {
+ var parameters = new AdaptyPurchaseParametersBuilder()
+ .SetSubscriptionUpdateParams(subscriptionUpdate)
+ .SetIsOfferPersonalized(isOfferPersonalized)
+ .Build();
+
+ Adapty.MakePurchase(product, parameters, (result, error) => {
switch (result.Type) {
case AdaptyPurchaseResultType.Pending:
// handle pending purchase
break;
case AdaptyPurchaseResultType.UserCancelled:
// handle purchase cancellation
break;
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// handle successful purchase
break;
default:
break;
}
});
}
```
Ek parametreye ihtiyaç duyulmuyorsa şunu kullanabilirsiniz:
```csharp showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
// handle purchase result
});
}
```
## Yedek paywall yöntemini güncelleme \{#update-fallback-method\}
:::important
Unity SDK 3.14 sürümüne yükseltirken, Adapty Kontrol Paneli'nden yeni yedek dosyaları indirip projenizdeki mevcut dosyaların yerine koymanız gerekecektir.
:::
Yedekleri ayarlama yöntemi güncellendi. `SetFallbackPaywalls` yöntemi `SetFallback` olarak yeniden adlandırıldı:
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
#if UNITY_IOS
var assetId = "adapty_fallback_ios.json";
#elif UNITY_ANDROID
var assetId = "adapty_fallback_android.json";
#else
var assetId = "";
#endif
- Adapty.SetFallbackPaywalls(assetId, (error) => {
+ Adapty.SetFallback(assetId, (error) => {
// handle the error
});
}
```
Son kod örneğini [Unity'de yedek paywall kullanımı](unity-use-fallback-paywalls) sayfasında inceleyebilirsiniz.
## Paywall özellik erişimini güncelleme \{#update-paywall-property-access\}
Aşağıdaki özellikler `AdaptyPaywall`'dan `AdaptyPlacement`'a taşındı:
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywall(AdaptyPaywall paywall) {
- var abTestName = paywall.ABTestName;
- var audienceName = paywall.AudienceName;
- var revision = paywall.Revision;
- var placementId = paywall.PlacementId;
+ var abTestName = paywall.Placement.ABTestName;
+ var audienceName = paywall.Placement.AudienceName;
+ var revision = paywall.Placement.Revision;
+ var placementId = paywall.Placement.Id;
}
```
## Remote config erişimini güncelleme \{#update-remote-config-access\}
Remote config özellikleri, daha iyi bir yapı için `AdaptyRemoteConfig` nesnesi altında yeniden düzenlendi:
```diff showLineNumbers
using AdaptySDK;
void ProcessRemoteConfig(AdaptyPaywall paywall) {
- var remoteConfigString = paywall.RemoteConfigString;
- var locale = paywall.Locale;
- var remoteConfigDict = paywall.RemoteConfig;
+ var remoteConfigString = paywall.RemoteConfig.Data;
+ var locale = paywall.RemoteConfig.Locale;
+ var remoteConfigDict = paywall.RemoteConfig.Dictionary;
}
```
## AdaptyPaywall model kullanımını güncelleme \{#update-adaptypaywall-model-usage\}
`VendorProductIds` özelliği kullanımdan kaldırılmış olup yerine `ProductIdentifiers` geçmiştir. Yeni özellik, basit string'ler yerine `AdaptyProductIdentifier` nesneleri döndürerek daha yapılandırılmış ürün bilgisi sağlar.
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywallProducts(AdaptyPaywall paywall) {
- var productIds = paywall.VendorProductIds;
- foreach (var vendorId in productIds) {
- // use vendorId
- }
+ var productIdentifiers = paywall.ProductIdentifiers;
+ foreach (var productId in productIdentifiers) {
+ var vendorId = productId.VendorProductId;
+ // use vendorId
+ }
}
```
`AdaptyProductIdentifier` nesnesi, `VendorProductId` özelliği aracılığıyla satıcı ürün kimliğine erişim sağlar; aynı işlevselliği korurken gelecekteki geliştirmeler için daha iyi bir yapı sunar.
## GetPaywall fetch policy'sini güncelleme \{#update-getpaywall-fetch-policy\}
`GetPaywall` metodundaki `fetchPolicy` parametre türü `AdaptyPaywallFetchPolicy`'den `AdaptyPlacementFetchPolicy`'ye değiştirildi. Bu değişiklik, SDK genelinde fetch policy kullanımını birleştiriyor.
```diff showLineNumbers
using AdaptySDK;
void GetPaywall(string placementId) {
- Adapty.GetPaywall(placementId, AdaptyPaywallFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
+ Adapty.GetPaywall(placementId, AdaptyPlacementFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
// handle the result
});
}
```
---
# File: migration-to-unity-sdk-34
---
---
title: "Adapty Unity SDK'yı v3.4'e Taşıma"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Unity SDK v3.4'e geçiş yapın."
---
Adapty SDK 3.4.0, sizin tarafınızdan geçiş adımları gerektiren iyileştirmeler sunan büyük bir sürümdür.
## Yedek paywall dosyalarını güncelleme \{#update-fallback-paywall-files\}
Yeni SDK sürümüyle uyumluluğu sağlamak için yedek paywall dosyalarınızı güncelleyin:
1. Adapty Kontrol Paneli'nden [güncellenmiş yedek paywall dosyalarını indirin](fallback-paywalls).
2. Mobil uygulamanızdaki [mevcut yedek paywallları yeni dosyalarla değiştirin](unity-use-fallback-paywalls).
## Observer Mode uygulamasını güncelleme \{#update-implementation-of-observer-mode\}
Observer Mode kullanıyorsanız, uygulamasını güncellediğinizden emin olun.
Daha önce, işlemleri Adapty'ye bildirmek için farklı yöntemler kullanılıyordu. Yeni sürümde, hem Android hem de iOS'ta tutarlı biçimde `reportTransaction` yöntemi kullanılmalıdır. Bu yöntem, her işlemi açıkça Adapty'ye bildirir ve işlemin tanınmasını sağlar. Bir paywall kullanıldıysa, işlemi bununla ilişkilendirmek için variation ID'yi iletin.
:::warning
**İşlem bildirmeyi atlayın!**
`reportTransaction` çağrısını yapmazsanız Adapty işlemi tanımaz, işlem analizlerde görünmez ve entegrasyonlara gönderilmez.
:::
```diff showLineNumbers
- #if UNITY_ANDROID && !UNITY_EDITOR
- Adapty.RestorePurchases((profile, error) => {
- // handle the error
- });
- #endif
Adapty.ReportTransaction(
"YOUR_TRANSACTION_ID",
"PAYWALL_VARIATION_ID", // optional
(error) => {
// handle the error
});
```
---
# File: migration-to-unity330
---
---
title: "Adapty Unity SDK'yı v3.3'e Geçirme"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Unity SDK v3.3'e geçin."
---
Adapty SDK 3.3.0, bazı iyileştirmeler getiren büyük bir sürümdür; ancak bu iyileştirmeler sizin tarafınızdan bazı geçiş adımları gerektirebilir.
1. Adapty SDK v3.3.x sürümüne yükseltin.
2. Adapty SDK'nın Adapty ve AdaptyUI modüllerindeki birden fazla sınıf, özellik ve yöntem yeniden adlandırıldı.
3. Artık `SetLogLevel` yöntemi bir callback'i argüman olarak kabul etmektedir.
4. Artık `PresentCodeRedemptionSheet` yöntemi bir callback'i argüman olarak kabul etmektedir.
5. Paywall görünümünün oluşturulma şeklini değiştirin.
6. `GetProductsIntroductoryOfferEligibility` yöntemini kaldırın.
7. Yedek paywallları `Assets/StreamingAssets/` dizininde ayrı dosyalara (platform başına bir tane) kaydedin ve dosya adlarını `SetFallbackPaywalls` yöntemine iletin.
8. Satın alma işlemini güncelleyin.
9. Paywall Builder olaylarının işlenmesini güncelleyin.
10. Paywall Builder paywall hatalarının işlenmesini güncelleyin.
11. Adjust, Amplitude, AppMetrica, Appsflyer, Branch, Firebase ve Google Analytics, Mixpanel, OneSignal, Pushwoosh için entegrasyon yapılandırmalarını güncelleyin.
13. Observer modu uygulamasını güncelleyin.
14. Unity eklentisi başlatmasını açık bir `Activate` çağrısıyla güncelleyin.
## Adapty Unity SDK'yı 3.3.x Sürümüne Yükseltin \{#upgrade-adapty-unity-sdk-to-33x\}
Bu sürüme kadar Adapty SDK, uygulamanızda Adapty'nin düzgün çalışması için zorunlu olan temel SDK'ydi; AdaptyUI SDK ise yalnızca Adapty Paywall Builder kullanıyorsanız gerekli hale gelen isteğe bağlı bir SDK'ydı.
3.3.0 sürümüyle birlikte AdaptyUI SDK kullanımdan kaldırılmış ve AdaptyUI, Adapty SDK'ya bir modül olarak dahil edilmiştir. Bu değişiklikler nedeniyle AdaptyUI SDK'yı kaldırıp AdaptySDK'yı yeniden yüklemeniz gerekmektedir.
1. **AdaptySDK** ve **AdaptyUISDK** paket bağımlılıklarını projenizden kaldırın.
2. **AdaptySDK** ve **AdaptyUISDK** klasörlerini silin.
3. AdaptySDK paketini [Unity için Adapty SDK kurulumu ve yapılandırması](sdk-installation-unity) sayfasında açıklandığı gibi yeniden içe aktarın.
## Yeniden Adlandırmalar \{#renamings\}
1. Adapty modülünde yeniden adlandır:
| Eski sürüm | Yeni sürüm |
| ------------------------- | ------------------------ |
| Adapty.sdkVersion | Adapty.SDKVersion |
| Adapty.LogLevel | AdaptyLogLevel |
| Adapty.Paywall | AdaptyPaywall |
| Adapty.PaywallFetchPolicy | AdaptyPaywallFetchPolicy |
| PaywallProduct | AdaptyPaywallProduct |
| Adapty.Profile | AdaptyProfile |
| Adapty.ProfileParameters | AdaptyProfileParameters |
| ProfileGender | AdaptyProfileGender |
| Error | AdaptyError |
2. AdaptyUI modülünde yeniden adlandırmalar:
| Eski versiyon | Yeni versiyon |
| ------------------ | ------------------ |
| CreatePaywallView | CreateView |
| PresentPaywallView | PresentView |
| DismissPaywallView | DismissView |
| AdaptyUI.View | AdaptyUIView |
| AdaptyUI.Action | AdaptyUIUserAction |
## SetLogLevel Metodunu Güncelleme \{#change-the-setloglevel-method\}
Artık `SetLogLevel` metodu bir callback kabul etmektedir.
```diff showLineNumbers
- Adapty.SetLogLevel(Adapty.LogLevel.Verbose);
+ Adapty.SetLogLevel(Adapty.LogLevel.Verbose, null); // or you can pass the callback to handle the possible error
```
## PresentCodeRedemptionSheet Metodunu Güncelleme \{#change-the-presentcoderedemptionsheet-method\}
Artık `PresentCodeRedemptionSheet` metodu bir callback kabul etmektedir.
```diff showLineNumbers
- Adapty.PresentCodeRedemptionSheet();
+ Adapty.PresentCodeRedemptionSheet(null); // or you can pass the callback to handle the possible error
```
## Paywall Görünümünün Oluşturulma Şeklini Değiştirme \{#change-how-the-paywall-view-is-created\}
Tam kod örneği için [Paywall Builder ile tasarlanan paywall'ın görünüm yapılandırmasını getirme](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) bölümüne bakın.
```diff showLineNumbers
+ var parameters = new AdaptyUICreateViewParameters()
+ .SetPreloadProducts(true);
- AdaptyUI.CreatePaywallView(
+ AdaptyUI.CreateView(
paywall,
- preloadProducts: true,
+ parameters,
(view, error) => {
// use the view
});
```
## GetProductsIntroductoryOfferEligibility Metodunu Kaldırma \{#remove-the-getproductsintroductoryoffereligibility-method\}
Adapty iOS SDK 3.3.0 öncesinde, ürün nesnesi kullanıcının uygun olup olmadığından bağımsız olarak her zaman teklifleri içeriyordu. Teklifi kullanmadan önce uygunluğu manuel olarak kontrol etmeniz gerekiyordu.
Artık ürün nesnesi yalnızca kullanıcı uygunsa teklif içermektedir. Bu sayede uygunluğu ayrıca kontrol etmenize gerek kalmaz; bir teklif mevcutsa kullanıcı zaten uygundur.
## Yedek paywall sağlama yöntemi güncellendi \{#update-method-for-providing-fallback-paywalls\}
Bu sürüme kadar yedek paywall'lar serileştirilmiş JSON olarak iletiliyordu. v 3.3.0 itibarıyla mekanizma değişti:
1. Yedek paywall'ları `/Assets/StreamingAssets/` dizinindeki dosyalara kaydedin; Android için bir dosya, iOS için ayrı bir dosya.
2. Dosya adlarını `SetFallbackPaywalls` metoduna geçirin.
Kodunuz şu şekilde değişecek:
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
+ #if UNITY_IOS
+ var assetId = "adapty_fallback_ios.json";
+ #elif UNITY_ANDROID
+ var assetId = "adapty_fallback_android.json";
+ #else
+ var assetId = "";
+ #endif
- Adapty.SetFallbackPaywalls("FALLBACK_PAYWALLS_JSON_STRING", (error) => {
+ Adapty.SetFallbackPaywalls(assetId, (error) => {
// handle the error
});
}
```
Son kod örneğini [Unity'de yedek paywall kullanımı](unity-use-fallback-paywalls) sayfasında inceleyebilirsiniz.
## Satın alma güncelleme \{#update-making-purchase\}
Daha önce iptal edilen ve beklemedeki satın almalar hata olarak değerlendirilir ve sırasıyla `PaymentCancelled` ve `PendingPurchase` kodlarını döndürürdü.
Artık iptal edilen, başarılı ve beklemedeki satın almaları işlemek için yeni bir `AdaptyPurchaseResultType` sınıfı kullanılıyor. Satın alma kodunu aşağıdaki şekilde güncelleyin:
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
- Adapty.MakePurchase(product, (profile, error) => {
- // handle successfull purchase
+ Adapty.MakePurchase(product, (result, error) => {
+ switch (result.Type) {
+ case AdaptyPurchaseResultType.Pending:
+ // handle pending purchase
+ break;
+ case AdaptyPurchaseResultType.UserCancelled:
+ // handle purchase cancellation
+ break;
+ case AdaptyPurchaseResultType.Success:
+ var profile = result.Profile;
+ // handle successful purchase
+ break;
+ default:
+ break;
}
});
}
```
Lütfen çevirmek istediğiniz MDX belgesini paylaşın.
## Paywall Builder olaylarının işlenmesini güncelleme \{#update-handling-of-paywall-builder-events\}
İptal edilen ve bekleyen satın almalar artık hata olarak değerlendirilmiyor; tüm bu durumlar `PaywallViewDidFinishPurchase` metodu ile işleniyor.
1. İptal edilen satın alma olayının işlenmesini silin.
2. Başarılı satın alma olayının işlenmesini aşağıdaki şekilde güncelleyin:
```diff showLineNumbers
- public void OnFinishPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Profile profile
- ) { }
+ public void PaywallViewDidFinishPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyPurchaseResult purchasedResult
+ ) { }
```
3. Aksiyon işlemeyi güncelleyin:
```diff showLineNumbers
- public void OnPerformAction(
- AdaptyUI.View view,
- AdaptyUI.Action action
- ) {
+ public void PaywallViewDidPerformAction(
+ AdaptyUIView view,
+ AdaptyUIUserAction action
+ ) {
switch (action.Type) {
- case AdaptyUI.ActionType.Close:
+ case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
- case AdaptyUI.ActionType.OpenUrl:
+ case AdaptyUIUserActionType.OpenUrl:
var urlString = action.Value;
if (urlString != null {
Application.OpenURL(urlString);
}
default:
// handle other events
break;
}
}
```
4. Başlatılan satın alma işleminin yönetimini güncelleyin:
```diff showLineNumbers
- public void OnSelectProduct(
- AdaptyUI.View view,
- Adapty.PaywallProduct product
- ) { }
+ public void PaywallViewDidSelectProduct(
+ AdaptyUIView view,
+ string productId
+ ) { }
```
5. Başarısız satın alma işleminin yönetimini güncelleyin:
```diff showLineNumbers
- public void OnFailPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyError error
+ ) { }
```
6. Başarılı geri yükleme olayının işlenmesini güncelleyin:
Check out the final code example in the [Handle paywall events](unity-handling-events) page.
## Paywall Builder paywall hatalarının işlenmesini güncelleyin \{#update-handling-of-paywall-builder-paywall-errors\}
Hata işleme yöntemi de değiştirildi; lütfen aşağıdaki rehbere göre kodunuzu güncelleyin.
1. Ürün yükleme hatalarının işlenmesini güncelleyin:
```diff showLineNumbers
- public void OnFailLoadingProducts(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailLoadingProducts(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
2. Render hatalarının işlenmesini güncelleyin:
```diff showLineNumbers
- public void OnFailRendering(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailRendering(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
## Üçüncü Taraf Entegrasyon SDK Yapılandırmasını Güncelleme \{#update-third-party-integration-sdk-configuration\}
Adapty Unity SDK 3.3.0'dan itibaren `updateAttribution` metodunun genel API'si güncellendi. Daha önce `[AnyHashable: Any]` sözlüğü kabul ediyordu ve attribution nesnelerini çeşitli servislerden doğrudan geçirmenize olanak tanıyordu. Artık `[String: any Sendable]` gerektirmektedir, bu nedenle attribution nesnelerini geçirmeden önce dönüştürmeniz gerekecektir.
Aşağıdaki entegrasyonların Adapty Unity SDK 3.3.0 ve sonrasıyla düzgün çalışmasını sağlamak için SDK yapılandırmalarınızı aşağıdaki bölümlerde açıklandığı şekilde güncelleyin.
### Adjust
Mobil uygulama kodunuzu aşağıdaki gibi güncelleyin. Tam kod örneği için [Adjust entegrasyonu için SDK yapılandırması](adjust#connect-your-app-to-adjust) sayfasına bakın.
```diff showLineNumbers
- using static AdaptySDK.Adapty;
using AdaptySDK;
Adjust.GetAdid((adid) => {
- Adjust.GetAttribution((attribution) => {
- Dictionary