# UNITY - 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.584Z Total files: 41 --- # File: sdk-installation-unity --- --- title: "Unity SDK'yı Yükleyin ve Yapılandırın" description: "Unity için Adapty SDK'yı abonelik tabanlı uygulamalara adım adım yükleme kılavuzu." --- Adapty SDK, Unity uygulamanıza sorunsuz entegrasyon için iki temel modül içerir: - **Core Adapty**: Adapty'nin uygulamanızda düzgün çalışması için gerekli olan temel SDK'dır. - **AdaptyUI**: [Adapty Paywall Builder](adapty-paywall-builder) kullanıyorsanız bu modüle ihtiyacınız vardır. Paywall Builder, kolayca cross-platform paywall oluşturmanızı sağlayan kullanıcı dostu, kodsuz 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örüntüleme, satın alma yapma ve diğer temel işlevleri içeren tam kurulumu gösteren [örnek uygulamamıza](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Assets) göz atın. ::: ## Gereksinimler \{#requirements\} Adapty SDK, iOS 13.0 ve üzerini destekler; ancak paywall builder ile oluşturulan paywalllarla çalışmak için iOS 15.0+ gereklidir. :::info Adapty, Google Play Billing Library'nin 8.x sürümüne kadar olan versiyonlarıyla uyumludur. Varsayılan olarak Adapty, Google Play Billing Library v7.0.0 kullanır. Daha yeni bir sürüm kullanmak için Android build'inizdeki [Billing bağımlılığını geçersiz kılın](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ükleyin \{#install-adapty-sdk\} [![Release](https://img.shields.io/github/v/release/adaptyteam/AdaptySDK-Unity.svg?style=flat&logo=unity)](https://github.com/adaptyteam/AdaptySDK-Unity/releases) Tercih ettiğiniz kurulum yöntemini seçin: Adapty SDK'yı Unity Package Manager aracılığıyla Git URL kullanarak yükleyin: 1. Unity'de **Window → Package Manager** bölümünü açın. 2. Sol üst köşedeki **+** düğmesine tıklayın, ardından **Add package from git URL...** seçeneğini seçin. 3. Aşağıdaki URL'yi girin ve **Add** düğmesine tıklayın: ``` https://github.com/adaptyteam/AdaptySDK-Unity.git?path=Packages/com.adapty.unity-sdk#upm ``` Ayrıntılar için Unity'nin [Git URL'sinden UPM paketi yükleme](https://docs.unity3d.com/Manual/upm-ui-giturl.html) rehberine bakın. [`adapty-unity-plugin-*.unitypackage`](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Releases) dosyasını GitHub'dan indirin ve projenize içe aktarın. SDK'yı yükledikten sonra aşağıdaki adımları tamamlayın: 1. [External Dependency Manager (EDM) eklentisini](https://github.com/googlesamples/unity-jar-resolver#getting-started) yükleyin. Adapty SDK, iOS Cocoapods bağımlılıklarını ve Android gradle bağımlılıklarını yönetmek için bunu kullanır. 2. EDM'yi yükledikten sonra bağımlılık yöneticisini çağırmanız gerekebilir: `Assets -> External Dependency Manager -> Android Resolver -> Force Resolve` ve `Assets -> External Dependency Manager -> iOS Resolver -> Install Cocoapods` 3. Unity projenizi iOS için derlerken `Unity-iPhone.xcworkspace` dosyasını elde edersiniz; Cocoapods bağımlılıklarının kullanılabilmesi için `Unity-iPhone.xcodeproj` yerine bu dosyayı açmanız gerekir. ## Adapty SDK'nın Adapty modülünü etkinleştirme \{#activate-adapty-module-of-adapty-sdk\} Adapty SDK'yı uygulama kodunuzda etkinleştirin. :::note Adapty SDK, uygulamanızda yalnızca bir kez etkinleştirilmesi gerekir. ::: **Public SDK Key**'inizi almak için: 1. Adapty Kontrol Paneli'ne gidin ve [**App settings → General**](https://app.adapty.io/settings/general) sayfasına gidin. 2. **Api keys** bölümünden **Public SDK Key**'i kopyalayın (Secret Key'i değil). 3. Koddaki `"YOUR_PUBLIC_SDK_KEY"` ifadesini değiştirin. Ya da [Adapty CLI](developer-cli) kullanarak programatik olarak alın: ``` npm install -g adapty adapty auth login adapty apps list ``` Ya da doğrudan: ``` npx adapty auth login adapty apps list ``` - Adapty başlatma işlemi için **Public SDK key** kullandığınızdan emin olun; **Secret key** yalnızca [sunucu taraflı API](getting-started-with-server-side-api) için kullanılmalıdır. - **SDK key**'leri her uygulama için benzersizdir, bu nedenle birden fazla uygulamanız varsa doğru olanı seçtiğ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"); 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) { } } ``` :::important Diğer Adapty SDK metodlarını çağırmadan önce `Activate` tamamlanma callback'ini bekleyin. Tam sıralama için [Unity SDK'da Çağrı Sırası](unity-sdk-call-order) sayfasına bakın. ::: ## Olay dinlemeyi ayarlayın \{#set-up-event-listening\} Adapty olaylarını dinlemek için bir script oluşturun. Sahnenizde bu nesneye `AdaptyListener` adını verin. Uygulamanın yaşam süresi boyunca kalıcı olmasını sağlamak için bu nesneye `DontDestroyOnLoad` metodunu kullanmanızı öneririz. 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 `` etiketinin tools içerdiğinden emin olun: ```xml ... ``` #### 2. `` içinde yedekleme özelliklerini geçersiz kılın \{#2-override-backup-attributes-in-application\} Aynı `AndroidManifest.xml` dosyasında, `` etiketini güncelleyerek uygulamanızın nihai değerleri sağlamasını ve manifest birleştirme işlemine kütüphane değerlerini değiştirmesini söyleyin: ```xml ... ``` Herhangi bir SDK de `android:allowBackup` ayarlıyorsa, bunu `tools:replace` içine ekleyin: ```xml tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules" ``` #### 3. Birleştirilmiş yedekleme kuralı dosyaları oluşturun \{#3-create-merged-backup-rules-files\} Android projenizin `res/xml/` dizininde, Adapty'nin kurallarını diğer SDK'ların kurallarıyla birleştiren XML dosyaları oluşturun. Android, işletim sistemi sürümüne bağlı olarak farklı yedekleme kuralı formatları kullandığından, her iki dosyayı da oluşturmak uygulamanızın desteklediği tüm Android sürümleriyle uyumluluk sağlar. :::note Aşağıdaki örneklerde örnek bir üçüncü taraf SDK olarak AppsFlyer kullanılmaktadır. Uygulamanızda kullandığınız diğer SDK'lar için kuralları değiştirin veya ekleyin. ::: **Android 12 ve üzeri için** (yeni veri çıkarma kuralları formatını kullanır): ```xml title="sample_data_extraction_rules.xml" ``` **Android 11 ve altı için** (eski tam yedekleme içeriği formatını kullanır): ```xml title="sample_backup_rules.xml" :::important Unity'de bu değişiklikleri `Assets/Plugins/Android/AndroidManifest.xml` dosyasına uygulayın ve yedekleme kuralı dosyalarını `Assets/Plugins/Android/res/xml/` dizini altında oluşturun. ::: #### Android'de başka bir uygulamadan döndükten sonra satın almalar başarısız oluyor \{#purchases-fail-after-returning-from-another-app-in-android\} Satın alma akışını başlatan Activity, varsayılan dışı bir `launchMode` kullanıyorsa Android, kullanıcı Google Play'den, bir bankacılık uygulamasından veya tarayıcıdan geri döndüğünde bu Activity'yi hatalı biçimde yeniden oluşturabilir ya da yeniden kullanabilir. Bu durum satın alma sonucunun kaybolmasına veya iptal edilmiş olarak işlenmesine yol açabilir. Satın alma işlemlerinin doğru çalışması için, satın alma flow'unu başlatan Activity'de yalnızca `standard` veya `singleTop` başlatma modlarını kullanın; diğer modlardan kaçının. `AndroidManifest.xml` dosyanızda, satın alma flow'unu başlatan Activity'nin `standard` veya `singleTop` olarak ayarlandığından emin olun: ```xml ``` #### Paywall Android'de gösterildiğinde uygulama çöküyor \{#app-crashes-when-a-paywall-is-displayed-on-android\} Uygulamanız Android'de bir paywall görüntülenirken çöküyorsa, Kotlin eklentisi Gradle yapılandırmanızda eksik olabilir. Eklemek için: 1. **Player Settings** bölümünde, **Custom Launcher Gradle Template** ve **Custom Base Gradle Template** seçeneklerinin işaretlendiğinden emin olun. 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. **Kılavuzlar:** - [Paywall'ları kullanarak satın alımları etkinleştirme (hızlı başlangıç)](unity-quickstart-paywalls) - [Paywall Builder paywall'larını ve yapılandırmalarını getirme](unity-get-pb-paywalls) - [Paywall'ları görüntüleme](unity-present-paywalls) - [Paywall olaylarını yönetme](unity-handling-events) - [Buton eylemlerine yanıt verme](unity-handle-paywall-actions) Bu bir çeviri görevi değil — bu, bir LLM'e kod yazmadan önce okuması gereken Adapty dokümanlarının bağlantılarını içeren bir komuttur. Bu mesajı olduğu gibi LLM'inize gönderin: --- Read these Adapty docs before writing code: - https://adapty.io/docs/tr/unity-quickstart-paywalls.md - https://adapty.io/docs/tr/unity-get-pb-paywalls.md - https://adapty.io/docs/tr/unity-present-paywalls.md - https://adapty.io/docs/tr/unity-handling-events.md - https://adapty.io/docs/tr/unity-handle-paywall-actions.md :::tip[Checkpoint] - **Beklenen:** Paywall, yapılandırdığınız ürünlerle görünür. Bir ürüne dokunmak sandbox satın alma iletişim kutusunu tetikler. - **Dikkat:** Boş paywall veya `GetPaywall` hatası → placement ID'nin kontrol paneliyle tam olarak eşleştiğini ve placement'a bir kitle atandığını doğrulayın. ::: **Kılavuzlar:** - [Özel paywall'ınızda satın almaları etkinleştirin (hızlı başlangıç)](unity-quickstart-manual) - [Paywall'ları ve ürünleri getirin](fetch-paywalls-and-products-unity) - [Remote config ile tasarlanan paywall'ı render edin](present-remote-config-paywalls-unity) - [Satın alma yapın](unity-making-purchases) - [Satın almaları geri yükleyin](unity-restore-purchase) Bu mesajı LLM'inize gönderin: ``` Read these Adapty docs before writing code: - https://adapty.io/docs/tr/unity-quickstart-manual.md - https://adapty.io/docs/tr/fetch-paywalls-and-products-unity.md - https://adapty.io/docs/tr/present-remote-config-paywalls-unity.md - https://adapty.io/docs/tr/unity-making-purchases.md - https://adapty.io/docs/tr/unity-restore-purchase.md ``` :::tip[Checkpoint] - **Beklenen:** Özel paywall'ınız Adapty'den çekilen ürünleri gösteriyor. Bir ürüne dokunmak sandbox satın alma iletişim kutusunu tetikliyor. - **Yaygın sorun:** Boş ürün dizisi → paywall'a kontrol panelinde ürün atandığını ve placement'ın bir kitleye sahip olduğunu doğrulayın. ::: **Kılavuzlar:** - [Observer mode'a genel bakış](observer-vs-full-mode) - [Observer mode'u uygulama](implement-observer-mode-unity) - [Observer mode'da işlemleri raporlama](report-transactions-observer-mode-unity) ``` Read these Adapty docs before writing code: - https://adapty.io/docs/tr/observer-vs-full-mode.md - https://adapty.io/docs/tr/implement-observer-mode-unity.md - https://adapty.io/docs/tr/report-transactions-observer-mode-unity.md ``` :::tip[Kontrol Noktası] - **Beklenen:** Mevcut satın alma akışınızı kullanarak yaptığınız sandbox satın alımından sonra işlem, Adapty kontrol panelindeki **Event Feed** bölümünde görünür. - **Dikkat:** Hiç event gelmiyorsa → işlemleri Adapty'ye raporladığınızı ve her iki mağaza için sunucu bildirimlerinin yapılandırıldığını doğrulayın. ::: ### Abonelik durumunu kontrol et \{#check-subscription-status\} Satın alma işleminin ardından, premium içeriğe erişimi kısıtlamak için kullanıcı profilinde aktif bir access level olup olmadığını kontrol edin. **Rehber:** [Abonelik durumunu kontrol et](unity-check-subscription-status) Bunu LLM'inize gönderin: ``` Read these Adapty docs before writing code: - https://adapty.io/docs/tr/unity-check-subscription-status.md ``` :::tip[Kontrol Noktası] - **Beklenen:** Sandbox satın almasının ardından `profile.AccessLevels["premium"]?.IsActive` değeri `true` döner. - **Dikkat:** Satın almadan sonra `AccessLevels` boş geliyor → ürüne kontrol panelinde bir access level atanıp atanmadığını kontrol edin. ::: ### Kullanıcıları tanımlayın \{#identify-users\} Uygulama kullanıcı hesaplarını Adapty profilleriyle ilişkilendirerek satın almaların cihazlar arasında kalıcı olmasını sağlayın. :::important Uygulamanızda kimlik doğrulama yoksa bu adımı atlayın. ::: **Kılavuz:** [Kullanıcıları tanımlayın](unity-quickstart-identify) Bunu LLM'inize gönderin: ``` Read these Adapty docs before writing code: - https://adapty.io/docs/tr/unity-quickstart-identify.md ``` :::tip[Checkpoint] - **Beklenen:** `Adapty.Identify("your-user-id")` çağrısının ardından, kontrol panelindeki **Profiles** bölümünde özel kullanıcı kimliğiniz görünür. - **Dikkat:** Anonim profil attributionunu önlemek için `Identify`'ı aktivasyondan sonra, paywall'ları çekmeden önce çağırın. ::: ### Yayına hazırlanın \{#prepare-for-release\} Entegrasyonunuz sandbox ortamında çalışır hale geldiğinde, her şeyin production'a hazır olduğundan emin olmak için yayın kontrol listesini gözden geçirin. **Rehber:** [Yayın kontrol listesi](release-checklist) Bunu LLM'inize gönderin: ``` Read these Adapty docs before releasing: - https://adapty.io/docs/tr/release-checklist.md ``` :::tip[Checkpoint] - **Beklenen:** Tüm kontrol listesi öğeleri onaylandı: mağaza bağlantıları, sunucu bildirimleri, satın alma akışı, access level kontrolleri ve gizlilik gereksinimleri. - **Dikkat:** Eksik sunucu bildirimleri → App Store Sunucu Bildirimlerini **App settings → iOS SDK** bölümünde, Google Play Gerçek Zamanlı Geliştirici Bildirimlerini ise **App settings → Android SDK** bölümünde yapılandırın. ::: ## Düz metin belge dizin dosyaları \{#plain-text-doc-index-files\} LLM'inize tek tek sayfaların ötesinde daha geniş bir bağlam sağlamanız gerekiyorsa, tüm Adapty belgelerini listeleyen veya birleştiren dizin dosyaları sunuyoruz: - [`llms.txt`](https://adapty.io/docs/tr/llms.txt): Tüm sayfaları `.md` bağlantılarıyla listeler. LLM'lerin web sitelerine erişimini kolaylaştırmak için kullanılan [gelişmekte olan bir standart](https://llmstxt.org/). Bazı yapay zeka ajanlarında (ör. ChatGPT) `llms.txt` dosyasını indirip sohbete yüklemeniz gerekebilir. - [`llms-full.txt`](https://adapty.io/docs/tr/llms-full.txt): Tüm Adapty dokümantasyon sitesini tek bir dosyada birleştirir. Çok büyük bir dosya; yalnızca tam resme ihtiyaç duyduğunuzda kullanın. - Unity'e özel [`unity-llms.txt`](https://adapty.io/docs/tr/unity-llms.txt) ve [`unity-llms-full.txt`](https://adapty.io/docs/tr/unity-llms-full.txt): Tam siteye kıyasla token tasarrufu sağlayan platforma özgü alt kümeler. --- # File: unity-get-pb-paywalls --- --- title: "Unity SDK'da Paywall Builder paywalllerini ve konfigürasyonlarını getirme" description: "Adapty'de Unity uygulamanızda daha iyi abonelik kontrolü için PB paywalllerini nasıl alacağınızı öğrenin." --- [Adapty Kontrol Paneli'nde yeni Paywall Builder ile paywall'unuzun görsel kısmını tasarladıktan](adapty-paywall-builder) sonra, bunu mobil uygulamanızda gösterebilirsiniz. Bu süreçteki ilk adım, placement ile ilişkili paywall'u ve görünüm yapılandırmasını aşağıda açıklandığı gibi almaktır. :::warning Yeni Paywall Builder, Unity SDK sürüm 3.3.0 veya üzeriyle çalışır. ::: Lütfen bu konunun Paywall Builder ile özelleştirilmiş paywallları kapsadığını unutmayın. Eğer paywalllarınızı manuel olarak uyguluyorsanız, lütfen [Uzak config paywalllar için paywall ve ürünleri mobil uygulamanızda getirme](fetch-paywalls-and-products-unity) konusuna 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. :::
Mobil uygulamanızda paywallları görüntülemeye başlamadan önce (genişletmek için tıklayın) 1. Adapty Kontrol Paneli'nde [ürünlerinizi oluşturun](create-product). 2. Adapty Kontrol Paneli'nde [bir paywall oluşturun ve ürünleri ekleyin](create-paywall). 3. Adapty Kontrol Paneli'nde [placement'lar oluşturun ve paywallınızı ekleyin](create-placement). 4. Mobil uygulamanıza [Adapty SDK](sdk-installation-unity) kurun.
## Paywall Builder ile tasarlanan paywall'u getirme \{#fetch-paywall-designed-with-paywall-builder\} [Paywall Builder kullanarak bir paywall tasarladıysanız](adapty-paywall-builder), bunu kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render etmeniz gerekmez. Böyle bir paywall, hem gösterilecek içeriği hem de nasıl gösterileceğini barındırır. Yine de placement aracılığıyla ID'sini, view konfigürasyonunu almanız ve ardından mobil uygulamanızda sunmanız gerekir. En iyi performansı sağlamak için, paywall'ı ve [görünüm yapılandırmasını](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) olabildiğince erken almanız, böylece kullanıcıya sunulmadan önce görsellerin indirilmesi için yeterli süre tanımanız kritik önem taşır. Bir paywall almak için `GetPaywall` metodunu kullanın: ```csharp showLineNumbers Adapty.GetPaywall("YOUR_PLACEMENT_ID", "en", (paywall, error) => { if(error != null) { // handle the error return; } // paywall - the resulting object }); ``` 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`

|

[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 Dictionary { { "custom_image", AdaptyCustomAsset.LocalImageFile("custom_assets/images/custom_image.png") }, { "hero_video", AdaptyCustomAsset.LocalVideoFile("custom_assets/videos/custom_video.mp4") } }; var parameters = new AdaptyUICreatePaywallViewParameters() .SetCustomAssets(customAssets) .SetLoadTimeout(new TimeSpan(0, 0, 3)); AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => { // sonucu işle }); ``` :::note Bir asset bulunamazsa, paywall varsayılan görünümüne geri döner. ::: ## Unity uygulamanızda geliştirici tanımlı zamanlayıcılar kurma \{#set-up-developer-defined-timers\} Unity uygulamanızda özel zamanlayıcılar kullanmak için, zamanlayıcı ID'leri ve bitiş tarihlerinden oluşan bir sözlüğü doğrudan `SetCustomTimers` metoduna geçirebilirsiniz. İşte bir örnek: ```csharp showLineNumbers var customTimers = new Dictionary { { "CUSTOM_TIMER_6H", DateTime.Now.AddHours(6) }, { "CUSTOM_TIMER_NY", new DateTime(2025, 1, 1) } }; var parameters = new AdaptyUICreatePaywallViewParameters() .SetCustomTimers(customTimers) .SetLoadTimeout(new TimeSpan(0, 0, 3)); AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => { // handle the result }); ``` 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. Zamanlayıcı çözümleyici, 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 kalan süre. - `CUSTOM_TIMER_6H`: Kullanıcının paywall'ı açtığı andan itibaren başlayan 6 saatlik sürede kalan zaman. ## Varsayılan kitle paywallı ile paywall getirme işlemini hızlandırın \{#speed-up-paywall-fetching-with-default-audience-paywall\} Genellikle paywalllar neredeyse anında getirilir, bu yüzden 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 internet bağlantısı zayıfsa, bir paywallın getirilmesi istediğinizden daha uzun sürebilir. Böyle durumlarda, hiç paywall göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak amacıyla varsayılan bir paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın **All Users** kitlesine ait paywallını getiren `GetPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak, önerilen yaklaşımın [Paywall Getirme](#fetch-paywall) bölümünde açıklandığı gibi `getPaywall` metoduyla paywall getirmek olduğunu anlamak çok önemlidir. :::warning `GetPaywallForDefaultAudience` yerine `GetPaywall` kullanmayı tercih edin; çünkü ikincisinin önemli kısıtlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorun çıkarabilir; ya geriye dönük uyumlu tasarımlar gerektirir ya da eski sürümlerin yanlış görüntülenebileceğini kabul etmeniz gerekir. - **Kişiselleştirme yok**: Yalnızca "Tüm Kullanıcılar" kitlesi için içerik gösterir; ülke, attribution veya özel niteliklere dayalı hedefleme yapılamaz. Bu dezavantajlara karşın daha hızlı veri çekme kullanım durumunuz için daha önemliyse, aşağıda gösterildiği gibi `GetPaywallForDefaultAudience` kullanın. Aksi takdirde, [yukarıda](#fetch-paywall) açıklandığı şekilde `GetPaywall` kullanın. ::: ```csharp showLineNumbers Adapty.GetPaywallForDefaultAudience("YOUR_PLACEMENT_ID", "en", (paywall, error) => { if(error != null) { // handle the error return; } // paywall - the resulting object }); ``` Parametreler: | Parametre | Zorunluluk | 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`

|

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 ) { } ```
Olay örneği (Genişletmek için tıklayın) ```javascript { "productId": "premium_monthly" } ```
#### Satın alma başladı \{#started-purchase\} Kullanıcı satın alma sürecini başlattığında tetiklenir. ```csharp showLineNumbers title="Unity" public void PaywallViewDidStartPurchase( AdaptyUIPaywallView view, AdaptyPaywallProduct product ) { } ```
Olay örneği (Genişletmek için tıklayın) ```javascript { "product": { "vendorProductId": "premium_monthly", "localizedTitle": "Premium Monthly", "localizedDescription": "Premium subscription for 1 month", "localizedPrice": "$9.99", "price": 9.99, "currencyCode": "USD" } } ```
#### Başarılı, iptal edilmiş veya beklemedeki satın alma \{#successful-canceled-or-pending-purchase\} Satın alma başarılı olursa, kullanıcı iptal ederse veya satın alma beklemede kalırsa bu metod tetiklenir. Kullanıcı iptalleri ve beklemedeki ödemeler (örn. ebeveyn onayı gerekli) `PaywallViewDidFailPurchase` yerine bu metodu tetikler. ```csharp showLineNumbers title="Unity" public void PaywallViewDidFinishPurchase( AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyPurchaseResult purchasedResult ) { } ```
Olay örnekleri (Genişletmek için tıklayın) ```javascript // Successful purchase { "product": { "vendorProductId": "premium_monthly", "localizedTitle": "Premium Monthly", "localizedDescription": "Premium subscription for 1 month", "localizedPrice": "$9.99", "price": 9.99, "currencyCode": "USD" }, "purchaseResult": { "type": "Success", "profile": { "accessLevels": { "premium": { "id": "premium", "isActive": true, "expiresAt": "2024-02-15T10:30:00Z" } } } } } // Cancelled purchase { "product": { "vendorProductId": "premium_monthly", "localizedTitle": "Premium Monthly", "localizedDescription": "Premium subscription for 1 month", "localizedPrice": "$9.99", "price": 9.99, "currencyCode": "USD" }, "purchaseResult": { "type": "UserCancelled" } } // Pending purchase { "product": { "vendorProductId": "premium_monthly", "localizedTitle": "Premium Monthly", "localizedDescription": "Premium subscription for 1 month", "localizedPrice": "$9.99", "price": 9.99, "currencyCode": "USD" }, "purchaseResult": { "type": "Pending" } } ```
Bu durumda ekranı kapatmanızı öneririz. #### Başarısız satın alma \{#failed-purchase\} Bir hata nedeniyle satın alma başarısız olursa bu metod tetiklenir. StoreKit/Google Play Billing hataları (ödeme kısıtlamaları, geçersiz ürünler, ağ hataları), işlem doğrulama hataları ve sistem hataları buna dahildir. Kullanıcı iptallerinin iptal sonucuyla `PaywallViewDidFinishPurchase`'i, beklemedeki ödemelerin ise bu metodu tetiklemediğini unutmayın. ```csharp showLineNumbers title="Unity" public void PaywallViewDidFailPurchase( AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error ) { } ```
Olay örneği (Genişletmek için tıklayın) ```javascript { "product": { "vendorProductId": "premium_monthly", "localizedTitle": "Premium Monthly", "localizedDescription": "Premium subscription for 1 month", "localizedPrice": "$9.99", "price": 9.99, "currencyCode": "USD" }, "error": { "code": "purchase_failed", "message": "Purchase failed due to insufficient funds", "details": { "underlyingError": "Insufficient funds in account" } } } ```
#### Geri yükleme başladı \{#started-restore\} Kullanıcı geri yükleme sürecini başlattığında tetiklenir: ```csharp showLineNumbers title="Unity" public void PaywallViewDidStartRestore(AdaptyUIPaywallView view) { } ``` #### Başarılı geri yükleme \{#successful-restore\} Satın alma geri yüklemesi başarılı olduğunda tetiklenir: ```csharp showLineNumbers title="Unity" public void PaywallViewDidFinishRestore( AdaptyUIPaywallView view, AdaptyProfile profile ) { } ```
Olay örneği (Genişletmek için tıklayın) ```javascript { "profile": { "accessLevels": { "premium": { "id": "premium", "isActive": true, "expiresAt": "2024-02-15T10:30:00Z" } }, "subscriptions": [ { "vendorProductId": "premium_monthly", "isActive": true, "expiresAt": "2024-02-15T10:30:00Z" } ] } } ```
Kullanıcının gerekli `accessLevel`'a sahip olması durumunda ekranı kapatmanızı öneririz. Bunu nasıl kontrol edeceğinizi öğrenmek için [Abonelik durumu](unity-listen-subscription-changes) konusuna bakın. #### Başarısız geri yükleme \{#failed-restore\} Satın alma geri yüklemesi başarısız olduğunda tetiklenir: ```csharp showLineNumbers title="Unity" public void PaywallViewDidFailRestore( AdaptyUIPaywallView view, AdaptyError error ) { } ```
Olay örneği (Genişletmek için tıklayın) ```javascript { "error": { "code": "restore_failed", "message": "Purchase restoration failed", "details": { "underlyingError": "No previous purchases found" } } } ```
#### Web ödeme navigasyonu tamamlandı \{#finished-web-payment-navigation\} Satın alma için bir [web paywall](web-paywall) açılmaya çalışıldıktan sonra (başarılı ya da başarısız), bu metod tetiklenir: ```csharp showLineNumbers title="Unity" public void PaywallViewDidFinishWebPaymentNavigation( AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error ) { } ``` **Parametreler:** - `product`: Web paywallın açıldığı (veya açılmaya çalışıldığı) ürün - `error`: Web paywall başarıyla açıldıysa `null`, başarısız olduysa bir `AdaptyError`
Olay örnekleri (Genişletmek için tıklayın) ```javascript // Successful navigation { "product": { "vendorProductId": "premium_monthly", "localizedTitle": "Premium Monthly", "localizedDescription": "Premium subscription for 1 month", "localizedPrice": "$9.99", "price": 9.99, "currencyCode": "USD" }, "error": null } // Failed navigation { "product": { "vendorProductId": "premium_monthly", "localizedTitle": "Premium Monthly", "localizedDescription": "Premium subscription for 1 month", "localizedPrice": "$9.99", "price": 9.99, "currencyCode": "USD" }, "error": { "code": "wrong_param", "message": "Current method is not available for this product", "details": { "underlyingError": "Product not configured for web purchases" } } } ```
### Veri çekme ve render işlemleri \{#data-fetching-and-rendering\} #### Ürün yükleme hataları \{#product-loading-errors\} Ürün yükleme başarısız olduğunda tetiklenir ve `AdaptyError` döndürür. Başlatma sırasında ürün dizisini geçmediyseniz AdaptyUI gerekli nesneleri sunucudan kendi alır. Bu işlem başarısız olabilir; AdaptyUI hatayı bu metodu çağırarak bildirir: ```csharp showLineNumbers title="Unity" public void PaywallViewDidFailLoadingProducts( AdaptyUIPaywallView view, AdaptyError error ) { } ```
Olay örneği (Genişletmek için tıklayın) ```javascript { "error": { "code": "products_loading_failed", "message": "Failed to load products from the server", "details": { "underlyingError": "Network timeout" } } } ```
#### Render hataları \{#rendering-errors\} Arayüz render sırasında bir hata oluştuğunda tetiklenir ve `AdaptyError` döndürür: ```csharp showLineNumbers title="Unity" public void PaywallViewDidFailRendering( AdaptyUIPaywallView view, AdaptyError error ) { } ```
Olay örneği (Genişletmek için tıklayın) ```javascript { "error": { "code": "rendering_failed", "message": "Failed to render paywall interface", "details": { "underlyingError": "Invalid paywall configuration" } } } ```
Normal koşullarda bu tür hatalar yaşanmamalıdır; böyle bir hatayla karşılaşırsanız lütfen bize bildirin. --- # File: unity-web-paywalls --- --- title: "Unity SDK'da web paywall'ları uygulayın" description: "App Store ücretleri ve denetimleri olmadan ödeme almak için bir web paywall'ı kurun." --- :::important Başlamadan önce, [kontrol panelinde web paywall'ınızı yapılandırdığınızdan](web-paywall) ve Adapty SDK sürüm 3.14 veya daha yenisini yüklediğinizden emin olun. ::: ## Web paywall'ları açın \{#open-web-paywalls\} Kendiniz geliştirdiğiniz bir paywall üzerinde çalışıyorsanız, web paywall'larını SDK metodu aracılığıyla yönetmeniz gerekir. `Adapty.OpenWebPaywall` metodu: 1. Adapty'nin belirli bir kullanıcıya gösterilen paywall'ı yönlendirildikleri web sayfasıyla ilişkilendirebilmesi için benzersiz bir URL oluşturur. 2. Kullanıcılarınızın uygulamaya ne zaman döndüğünü takip eder ve ardından profil erişim haklarının güncellenip güncellenmediğini belirlemek için kısa aralıklarla `Adapty.GetProfile` isteği gönderir. Bu sayede ödeme başarılı olmuşsa ve erişim hakları güncellenmiş ise abonelik uygulamada neredeyse anında etkinleşir. ```csharp showLineNumbers title="Unity" Adapty.OpenWebPaywall( product, (error) => { if (error != null) { Debug.LogError($"Failed to open web paywall: {error.Message}"); } else { Debug.Log("Web paywall opened successfully"); } } ); ``` :::note `OpenWebPaywall` metodunun iki sürümü vardır: 1. `OpenWebPaywall(product)`: URL'leri paywall'a göre oluşturur ve ürün verilerini de URL'lere ekler. 2. `OpenWebPaywall(paywall)`: URL'leri paywall'a göre oluşturur; ürün verilerini URL'lere eklemez. Adapty paywall'ındaki ürünler web paywall'ındaki ürünlerden farklıysa bunu kullanın. ::: #### Hataları yönetin \{#handle-errors\} | Hata Kodu | Açıklama | Önerilen İşlem | |-----------|----------|----------------| | `AdaptyErrorCode.WrongParam` | Paywall veya ürünün yapılandırılmış bir web satın alma URL'si yok ya da URL tarayıcıda açılamadı | Ayrıntılar için hata mesajını kontrol edin. Adapty Kontrol Paneli'nde paywall/ürün yapılandırmasını doğrulayın veya cihaz ayarlarını kontrol edin. | | `AdaptyErrorCode.DecodingFailed` | URL'deki parametreler düzgün şekilde kodlanamadı | URL parametrelerinin geçerli ve doğru biçimlendirilmiş olduğunu doğrulayın | :::note Neyin yanlış gittiğine dair ayrıntılı bilgi almak için hatanın `Message` özelliğini kontrol edin; `WrongParam` birden fazla soruna işaret edebilir (eksik satın alma URL'si, tarayıcı açılamadı vb.). ::: ## Web paywalllarını uygulama içi tarayıcıda açma \{#open-web-paywalls-in-an-in-app-browser\} :::important Web paywalllarını uygulama içi tarayıcıda açma özelliği Adapty SDK v3.15'ten itibaren desteklenmektedir. ::: Varsayılan olarak, web paywallları harici tarayıcıda açılır ve kullanıcıları uygulamanızın dışına yönlendirir. Kesintisiz bir kullanıcı deneyimi sunmak için web paywalllarını bunun yerine uygulama içi tarayıcıda açabilirsiniz. Bu sayede web satın alma sayfası uygulamanız içinde görüntülenir ve kullanıcılar uygulama değiştirmeden işlemlerini tamamlayabilir. Bunu etkinleştirmek için `OpenWebPaywall` metoduna `AdaptyWebPresentation.InAppBrowser` değerini geçin: ```csharp showLineNumbers title="Unity" Adapty.OpenWebPaywall( product, AdaptyWebPresentation.InAppBrowser, // default — ExternalBrowser (error) => { if (error != null) { Debug.LogError($"Failed to open web paywall: {error.Message}"); } else { Debug.Log("Web paywall opened successfully"); } } ); ``` --- # File: unity-use-fallback-paywalls --- --- title: "Unity - Yedek paywall kullanımı" description: "Kullanıcılar çevrimdışıyken veya Adapty sunucularına erişilemediğinde bu durumu nasıl yöneteceğinizi öğrenin" --- :::warning Yedek paywall'lar Unity SDK v2.11 ve sonraki sürümlerde desteklenmektedir. ::: Akıcı bir kullanıcı deneyimi sürdürebilmek için flow'larınız, [paywall'larınız](paywalls) ve [onboarding'leriniz](onboardings) için [yedekler](/fallback-paywalls) ayarlamanız önemlidir. Bu önlem, kısmi veya tam internet bağlantısı kaybı durumunda uygulamanın işlevselliğini korur. * **Uygulama Adapty sunucularına erişemiyorsa:** Yedek flow veya paywall gösterebilir ve yerel onboarding yapılandırmasına erişebilir. * **Uygulama internete erişemiyorsa:** Yedek flow veya paywall gösterebilir. Onboarding'ler uzak içerik barındırdığından çalışabilmek için internet bağlantısı gerektirir. :::important Bu kılavuzdaki adımları izlemeden önce yedek yapılandırma dosyalarını Adapty'den [indirin](/local-fallback-paywalls). ::: ## Yapılandırma \{#configuration\} 1. Yedek yapılandırma dosyalarını projenizin ortak `Assets/StreamingAssets` dizinine ekleyin. 2. Hedef paywall veya onboarding'i çekmeden **önce** `.setFallback` metodunu çağırın. ```csharp using UnityEngine; using AdaptySDK; #if UNITY_IOS string fileName = "ios_fallback.json"; #elif UNITY_ANDROID string fileName = "android_fallback.json"; #else // Optional: handle Editor or other platforms string fileName = "fallback.json"; #endif Adapty.SetFallback(fileName, (error) => { if (error != null) { Debug.LogError($"Failed to set fallback: {error}"); return; } // Fallback set successfully }); ``` Parametreler: | Parametre | Açıklama | |:-------------|:----------------------------------------------------------------------| | **fileName** | Yedek yapılandırma dosyasının adını içeren string değeri. | --- # File: unity-localizations-and-locale-codes --- --- title: "Unity SDK'da yerelleştirmeleri ve yerel ayar kodlarını kullanma" description: "Adapty SDK ile Unity uygulamanızdaki paywalls'ı nasıl yerelleştireceğinizi öğrenin." --- ## Bu neden önemli \{#why-this-is-important\} Yerel ayar kodlarının devreye girdiği birkaç senaryo vardır; örneğin, uygulamanızın mevcut yerelleştirmesi için doğru paywall'u almaya çalıştığınızda. Yerel ayar kodları karmaşık olup platformdan platforma farklılık gösterebileceğinden, desteklediğimiz tüm platformlar için dahili bir standarda dayanıyoruz. Ancak bu kodlar karmaşık olduğundan, sunucumuza tam olarak ne gönderdiğinizi ve ardından ne olduğunu anlamanız son derece önemlidir; bu sayede her zaman beklediğiniz sonucu alırsınız. ## Adapty'de yerel ayar kodu standardı \{#locale-code-standard-at-adapty\} Adapty, yerel ayar kodları için biraz değiştirilmiş bir [BCP 47 standardı](https://en.wikipedia.org/wiki/IETF_language_tag) kullanır: her kod, kısa çizgilerle ayrılmış küçük harf alt etiketlerden oluşur. Bazı örnekler: `en` (İngilizce), `pt-br` (Portekizce (Brezilya)), `zh` (Basitleştirilmiş Çince), `zh-hant` (Geleneksel Çince). ## Yerel ayar kodu eşleştirme \{#locale-code-matching\} Adapty, istemci tarafı SDK'dan yerel ayar koduyla birlikte bir çağrı aldığında ve paywall'ın ilgili yerelleştirmesini aramaya başladığında şunlar gerçekleşir: 1. Gelen yerel ayar dizesi küçük harfe dönüştürülür ve tüm alt çizgiler (`_`) kısa çizgiyle (`-`) değiştirilir 2. Ardından tam olarak eşleşen yerel ayar koduna sahip yerelleştirme aranır 3. Eşleşme bulunamazsa, ilk kısa çizgiden önceki alt dize alınır (`pt-br` için `pt`) ve eşleşen yerelleştirme aranır 4. Yine eşleşme bulunamazsa, varsayılan `en` yerelleştirmesi döndürülür Bu sayede `'pt_BR'` gönderen bir iOS cihazı, `pt-BR` gönderen bir Android cihazı ve `pt-br` gönderen başka bir cihaz aynı sonucu alır. ## Yerelleştirmeleri uygulama: önerilen yol \{#implementing-localizations-recommended-way\} Yerelleştirmelerle ilgileniyorsanız, büyük ihtimalle projenizde zaten yerelleştirilmiş string dosyalarıyla çalışıyorsunuzdur. Bu durumda, her dosyanıza ilgili yerelleştirme için amaçlanan Adapty locale kodu ile birlikte bir anahtar-değer çifti eklemenizi öneririz. Ardından SDK'mızı çağırırken bu anahtarın değerini şu şekilde çıkarın: ```csharp showLineNumbers // 1. Yerelleştirme dosyalarınızı düzenleyin (örneğin, Unity'nin Localization paketini kullanarak) /* en.json */ { "adapty_paywalls_locale": "en" } /* es.json */ { "adapty_paywalls_locale": "es" } /* pt-BR.json */ { "adapty_paywalls_locale": "pt-br" } // 2. Yerel ayar kodunu çıkarın ve kullanın using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.Settings; using AdaptySDK; public class PaywallManager : MonoBehaviour { public async void FetchPaywall() { // Unity'nin Localization sisteminden mevcut yerel ayarı alın var locale = LocalizationSettings.SelectedLocale; var localeCode = GetAdaptyLocaleCode(locale); // Yerel ayar kodunu Adapty.GetPaywall veya Adapty.GetPaywallForDefaultAudience metoduna iletin Adapty.GetPaywall("placement_id", localeCode, (paywall, error) => { if (error != null) { // hatayı işle return; } // Paywall'ı kullan }); } private string GetAdaptyLocaleCode(Locale locale) { // Unity yerel ayarını Adapty formatına dönüştür var localeIdentifier = locale.Identifier.Code; return localeIdentifier.ToLower().Replace('_', '-'); } } ``` Bu sayede, uygulamanızın her kullanıcısı için hangi yerelleştirmenin getirileceği üzerinde tam kontrole sahip olursunuz. ## Yerelleştirmeleri uygulama: alternatif yöntem \{#implementing-localizations-the-other-way\} Her yerelleştirme için açıkça bir dil kodu tanımlamak zorunda kalmadan benzer (ama aynı değil) sonuçlar elde edebilirsiniz. Bu yaklaşımda, dil kodunu platformunuzun sunduğu başka nesnelerden çıkarabilirsiniz; örneğin: ```csharp showLineNumbers using UnityEngine; using System.Globalization; using AdaptySDK; public class PaywallManager : MonoBehaviour { public void FetchPaywall() { var localeCode = GetSystemLocaleCode(); // Locale kodunu Adapty.GetPaywall veya Adapty.GetPaywallForDefaultAudience metoduna geçirin Adapty.GetPaywall("placement_id", localeCode, (paywall, error) => { if (error != null) { // handle the error return; } // Use the paywall }); } private string GetSystemLocaleCode() { // Sistemin mevcut kültür bilgisini al var culture = CultureInfo.CurrentCulture; var languageCode = culture.TwoLetterISOLanguageName; var regionCode = culture.Name.Contains('-') ? culture.Name.Split('-')[1] : null; if (!string.IsNullOrEmpty(regionCode)) { return $"{languageCode}-{regionCode.ToLower()}"; } return languageCode; } } ``` Bu yaklaşımı birkaç nedenden dolayı önermediğimizi belirtmek gerekir: 1. iOS'ta tercih edilen diller ile mevcut yerel ayar (locale) aynı şey değildir. Yerelleştirmenin doğru seçilmesini istiyorsanız, ya yerelleştirilmiş string dosyalarıyla önerilen yaklaşımı kullandığınızda kutudan çıktığı gibi çalışan Apple'ın mantığına güvenmeniz ya da bunu kendiniz yeniden oluşturmanız gerekir. 2. Adapty'nin sunucusunun tam olarak ne alacağını tahmin etmek güçtür. Örneğin iOS'ta, bir cihazda `ar_OM@numbers='latn'` gibi bir yerel ayar elde edip sunucumuza gönderebilirsiniz. Bu durumda aradığınız `ar-om` yerelleştirmesini değil, büyük ihtimalle beklemediğiniz `ar` yerelleştirmesini alırsınız. Bu yaklaşımı kullanmaya karar verirseniz, ilgili tüm kullanım senaryolarını kapsadığınızdan emin olun. --- # File: unity-troubleshoot-paywall-builder --- --- title: "Unity SDK'da Paywall Builder Sorunlarını Giderme" description: "Unity SDK'da Paywall Builder Sorunlarını Giderme" --- Bu kılavuz, Unity SDK'da Adapty Paywall Builder ile tasarlanmış paywall'ları kullanırken karşılaşılan yaygın sorunları çözmenize yardımcı olur. ## Paywall yapılandırması alınamıyor \{#getting-a-paywall-configuration-fails\} **Sorun**: `CreateView` metodu paywall yapılandırmasını alamıyor. **Neden**: Paywall, Paywall Builder'da cihazda gösterim için etkinleştirilmemiş. **Çözüm**: Paywall Builder'da **Show on device** geçişini etkinleştirin. ## 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. :::
Mobil uygulamanızda paywallları ve ürünleri çekmeye başlamadan önce (genişletmek için tıklayın) 1. Adapty Kontrol Paneli'nde [ürünlerinizi oluşturun](create-product). 2. Adapty Kontrol Paneli'nde [bir paywall oluşturun ve ürünleri paywalla ekleyin](create-paywall). 3. Adapty Kontrol Paneli'nde [placement'lar oluşturun ve paywallınızı placement'a ekleyin](create-placement). 4. Mobil uygulamanıza [Adapty SDK'yı yükleyin](sdk-installation-unity).
## Paywall bilgilerini çekme \{#fetch-paywall-information\} Adapty'de bir [ürün](product), App Store ve Google Play'deki ürünlerin birleşimidir. Bu platformlar arası ürünler paywallara entegre edilerek belirli mobil uygulama placement'larında gösterilmesini sağlar. Ürünleri görüntülemek için `getPaywall` metodunu kullanarak [placement](placements)'larınızdan birinden bir [Paywall](paywalls) almanız gerekir. :::important **Ürün ID'lerini koda sabit olarak yazmayın.** Koda 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 işleyebilmelidir — bugün bir paywall iki ürün döndürüyorsa ve yarın üç ürün döndürüyorsa, kod değişikliği gerektirmeden hepsini görüntüleyin. ::: ```csharp showLineNumbers Adapty.GetPaywall("YOUR_PLACEMENT_ID", "en", (paywall, error) => { if(error != null) { // handle the error return; } // paywall - the resulting object }); ``` | Parametre | Zorunluluk | Açıklama | |---------|--------|-----------| | **placementId** | zorunlu | [Placement](placements) tanımlayıcısı. 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 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:
• `PaymentMode`: `AdaptyPaymentMode.FreeTrial`, `AdaptyPaymentMode.PayAsYouGo`, `AdaptyPaymentMode.PayUpFront` ve `AdaptyPaymentMode.Unknown` değerlerine sahip bir enum. Ücretsiz denemeler `AdaptyPaymentMode.FreeTrial` türünde olacaktır.
• `Price`: İndirimli fiyat sayı olarak. Ücretsiz denemeler için burada `0` arayın.
• `LocalizedNumberOfPeriods`: Teklifin süresini cihazın yerel ayarıyla yerelleştirilmiş olarak açıklayan bir dize. Örneğin, üç günlük bir deneme teklifi bu alanda `"3 days"` gösterir.
• `SubscriptionPeriod`: Alternatif olarak, teklif döneminin bireysel ayrıntılarını bu özellikle alabilirsiniz. Teklifler için önceki bölümün açıkladığıyla aynı şekilde çalışır.
• `LocalizedSubscriptionPeriod`: Kullanıcının yerel ayarı için biçimlendirilmiş indirim abonelik dönemi. | ## Varsayılan kitle paywallıyla paywall çekmeyi hızlandırma \{#speed-up-paywall-fetching-with-default-audience-paywall\} Genellikle paywalllar neredeyse anında çekilir, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitleniz ve paywallınız varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, 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 ele almak için, belirtilen placement'ın **Tüm Kullanıcılar** kitlesi için paywallı çeken `GetPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Paywall Bilgilerini Çekme](#fetch-paywall) bölümünde açıklandığı gibi `getPaywall` metodunu kullanmak olduğunu anlamak önemlidir. :::warning `GetPaywallForDefaultAudience` yerine `GetPaywall` kullanmayı düşünün; çünkü ikincisinin önemli sınırlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorunlar yaratabilir; geriye dönük uyumlu tasarımlar gerektirmek veya eski sürümlerin yanlış görüntülenebileceğini kabul etmek zorunlu kalabilirsiniz. - **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 durumunuz için daha hızlı çekme bu dezavantajlardan ağır basıyorsa, aşağıda gösterildiği gibi `GetPaywallForDefaultAudience` kullanın. Aksi takdirde [yukarıda](#fetch-paywall) açıklandığı gibi `GetPaywall` kullanın. ::: ```csharp showLineNumbers Adapty.GetPaywallForDefaultAudience("YOUR_PLACEMENT_ID", "en", (paywall, error) => { if(error != null) { // handle the error return; } // paywall - the resulting object }); ``` 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`

|

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\}
Teklif kodları hakkında Teklif kodları, belirli kullanıcılara indirim veya ücretsiz deneme sunmanıza olanak tanır. Otomatik uygulanan normal tekliflerin aksine, teklif kodları uygulama dışında — e-posta kampanyaları, sosyal medya veya basılı materyaller aracılığıyla — dağıtılır. Kullanıcılar bu kodları App Store'a girerek, bir kullanım URL'si aracılığıyla veya uygulama içi bir iletişim kutusu üzerinden kullanabilir. Teklif kodlarını ayarlamak için App Store Connect'te bir abonelik açın ve **Offer Codes** bölümüne gidin. [Üç tür](https://developer.apple.com/help/app-store-connect/manage-subscriptions/set-up-subscription-offer-codes) teklif kodu oluşturabilirsiniz: - **Free** — abonelik belirli bir süre boyunca ücretsizdir ve bir sonraki yenileme tam fiyat üzerinden gerçekleşir. - **Pay as you go** — kullanıcı, belirli bir süre boyunca her faturalandırma döngüsünde indirimli fiyat öder; ardından abonelik tam fiyatla yenilenir. - **Pay up front** — kullanıcı, teklif süresi boyunca tek seferlik indirimli bir fiyat öder; ardından abonelik tam fiyatla yenilenir. Teklif kodlarını Adapty'ye eklemenize gerek yoktur. Apple, teklif süresi boyunca gerçekleşen her işlemi teklif kodu kategorisiyle etiketler. Bu etiket; ilk kullanımı ve sonraki tüm indirimli yenilemeleri kapsar. Adapty bu etiketi algılar ve her işlemi `offer_code` teklif kategorisiyle kaydeder. Teklif süresi sona erip abonelik tam fiyatla yenilendiğinde, etiket artık yer almaz. [Adapty Kontrol Paneli](controls-filters-grouping-compare-proceeds)'nde **Offer Code** teklif türüne göre analitikleri filtreleyebilirsiniz. #### Gelir tutarsızlığı sorunlarını giderme \{#revenue-discrepancy-troubleshooting\} Adapty'de bir teklif kodu işleminin indirimli teklif fiyatı yerine tam ürün fiyatıyla göründüğünü fark ederseniz App Store Connect'te aşağıdakileri doğrulayın: - Teklif kodunun, kullanıcıların kodu kullanabileceği tüm bölgeler için doğru fiyatlandırma yapılandırılmış olmalıdır. - Teklif fiyatı, kullanıcının bulunduğu ülke veya bölge için ayrıca ayarlanmış olmalıdır. Apple, işlemde bölgesel fiyatı gönderir. Teklif için belirli bir bölgeye ait fiyat yapılandırılmamışsa Apple tam ürün fiyatını gönderebilir. Teklif kodu işlemlerini [Adapty Kontrol Paneli](controls-filters-grouping-compare-proceeds)'nde **Offer Code** teklif türü ve **Offer Discount Type** filtreleri aracılığıyla filtreleyip doğrulayabilirsiniz. #### Eski promosyon kodları (kullanımdan kaldırıldı) \{#legacy-promo-codes-deprecated\} :::warning Apple, uygulama içi satın almalar için promosyon kodlarını Mart 2026'da kullanımdan kaldırdı. Teklif kodları, daha fazla özellikle bunların yerini alıyor: yapılandırılabilir uygunluk kriterleri, son kullanma tarihleri ve üç ayda 1 milyona kadar kod. Uygulama içi satın almalar için daha önce promosyon kodu kullandıysanız App Store Connect'te teklif kodlarına geçiş yapın. ::: Eski promosyon kodları (uygulama başına sürüm başına en fazla 100 adet) bir aboneliğe ücretsiz erişim sağlıyordu. Teklif kodlarının aksine, Apple promosyon kodu işlemlerine indirim bilgisi eklemiyordu — makbuza tam ürün fiyatını gönderiyordu. Bunun sonucunda Adapty bu işlemleri tam fiyat üzerinden kaydediyordu ve bu durum Adapty analitikleri ile App Store Connect arasında gelir tutarsızlıklarına yol açıyordu. Ücretsiz olması gereken ancak tam fiyatla görünen geçmişe ait işlemler görüyorsanız bunlar büyük olasılıkla eski promosyon kodlarından kaynaklanmaktadır. Bu kodlar artık kullanımdan kaldırıldığından, doğru gelir takibi için teklif kodlarına geçiş yapın.
Uygulamanızda kod kullanma sayfasını göstermek için: ```csharp showLineNumbers Adapty.PresentCodeRedemptionSheet((error) => { // handle the error }); ``` :::danger Gözlemlerimize göre, bazı uygulamalarda Teklif Kodu Kullanma sayfası güvenilir biçimde çalışmayabilir. Kullanıcıyı doğrudan App Store'a yönlendirmenizi öneririz. Bunu yapmak için aşağıdaki formattaki URL'yi açmanız gerekir: `https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}` ::: ## Ön ödemeli planları yönetme (Android) \{#manage-prepaid-plans-android\} Uygulama kullanıcılarınız [ön ödemeli planlar](https://developer.android.com/google/play/billing/subscriptions#prepaid-plans) satın alabiliyorsa (örneğin, birkaç aylık yenilenmeyen bir abonelik), ön ödemeli planlar için [bekleyen işlemleri](https://developer.android.com/google/play/billing/subscriptions#pending) etkinleştirebilirsiniz. ```csharp showLineNumbers title="Unity" using UnityEngine; using AdaptySDK; var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY") .SetGoogleEnablePendingPrepaidPlans(true); Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); ``` --- # File: unity-restore-purchase --- --- title: "Unity SDK'da mobil uygulamada satın alımları geri yükleme" description: "Sorunsuz bir kullanıcı deneyimi sağlamak için Adapty'de satın alımları nasıl geri yükleyeceğinizi öğrenin." --- Hem iOS hem de Android'de satın alımları geri yükleme; kullanıcıların abonelikler veya uygulama içi satın alımlar gibi daha önce satın aldıkları içeriklere tekrar ücret ödemeden yeniden erişmesini sağlayan bir özelliktir. Bu özellik, uygulamayı kaldırıp yeniden yükleyen ya da yeni bir cihaza geçen ve önceki satın alımlarına tekrar erişmek isteyen kullanıcılar için oldukça kullanışlıdır. :::note [Paywall Builder](adapty-paywall-builder) ile oluşturulmuş paywallarda satın alımlar, sizin tarafınızdan ek bir kod gerekmeksizin otomatik olarak geri yüklenir. Bu durum sizin için geçerliyse bu adımı atlayabilirsiniz. ::: Paywallı özelleştirmek için [Paywall Builder](adapty-paywall-builder) kullanmıyorsanız satın alımı geri yüklemek için `.restorePurchases()` metodunu çağırın: ```csharp showLineNumbers Adapty.RestorePurchases((profile, error) => { if (error != null) { // handle the error return; } var accessLevel = profile.AccessLevels["YOUR_ACCESS_LEVEL"]; if (accessLevel != null && accessLevel.IsActive) { // restore access } }); ``` Yanıt parametreleri: | Parametre | Açıklama | |---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Profile** |

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." --- Observer modunda Adapty SDK, mevcut satın alma sisteminiz üzerinden gerçekleştirilen işlemleri kendi başına takip edemez. Uygulama mağazanızdaki işlemleri manuel olarak raporlamanız gerekir. Analizlerdeki hataları önlemek için bunu uygulamanızı yayınlamadan **önce** yapılandırmanız kritik önem taşır. Her işlemi Adapty'nin tanıyabilmesi için `reportTransaction` kullanarak açıkça raporlayın. :::warning **İşlem raporlamayı atlamayın!** `ReportTransaction` çağrısı yapmazsanız Adapty işlemi tanımaz, işlem analizlerde görünmez ve entegrasyonlara gönderilmez. ::: Adapty paywall'ları kullanıyorsanız, bir işlemi raporlarken `variationId` değerini de ekleyin. Bu, satın almayı tetikleyen paywall ile ilişkilendirir ve doğru paywall analitikleri sağlar. ```csharp showLineNumbers Adapty.ReportTransaction( "YOUR_TRANSACTION_ID", "PAYWALL_VARIATION_ID", // optional (error) => { // handle the error }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | ------------- | -------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | transactionId | zorunlu |
  • iOS için: İşlemin tanımlayıcısı.
  • 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 | isteğe bağlı | 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. |
Observer modunda Adapty SDK, mevcut satın alma sisteminiz üzerinden gerçekleştirilen işlemleri kendi başına takip edemez. Uygulama mağazanızdaki işlemleri raporlamanız ya da geri yüklemeniz gerekir. Analizlerdeki hataları önlemek için bunu uygulamanızı yayınlamadan **önce** yapılandırmanız kritik önem taşır. Her işlemi açıkça raporlamak için her iki platformda da `reportTransaction` kullanın; Android'de Adapty'nin işlemi tanıdığından emin olmak için ek adım olarak `restorePurchases` çağrısı yapın. :::warning **İşlem raporlamayı ve satın alma geri yüklemeyi atlamayın!** Bu metodları çağırmazsanız Adapty işlemi tanımaz, işlem analizlerde görünmez ve entegrasyonlara gönderilmez. ::: Adapty paywall'ları kullanıyorsanız, bir işlemi raporlarken `PAYWALL_VARIATION_ID` değerini de ekleyin. Bu, satın almayı tetikleyen paywall ile ilişkilendirir ve doğru paywall analitikleri sağlar. ```csharp showLineNumbers // every time when calling transasction.finish() #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 }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | ------------- | -------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | transactionId | zorunlu |
  • 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 | isteğe bağlı | 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. |
**İşlemleri raporlama** - 3.1.x ve önceki sürümler App Store'daki işlemleri otomatik olarak dinler, dolayısıyla manuel raporlama gerekmez. - 3.2 sürümü Observer Mode'u desteklememektedir. **İşlemleri raporlama** Observer Mode'da Adapty'ye bir işlem raporlamak için `restorePurchases` kullanın. Ayrıntılar için [Mobil Kodda Satın Almaları Geri Yükleme](unity-restore-purchase) sayfasına bakın. :::warning **İşlem raporlamayı atlamayın!** `restorePurchases` çağrısı yapmazsanız Adapty işlemi tanımaz, işlem analizlerde görünmez ve entegrasyonlara gönderilmez. ::: **Paywall'ları işlemlerle ilişkilendirme** Adapty SDK, satın almaların kaynağını belirleyemez; zira bu işlemleri siz gerçekleştirirsiniz. Bu nedenle Observer modunda paywall ve/veya A/B testi kullanmayı planlıyorsanız, uygulama mağazanızdan gelen işlemi mobil uygulama kodunuzda ilgili paywall ile ilişkilendirmeniz gerekir. Bunu uygulamanızı yayınlamadan önce doğru şekilde yapılandırmanız önemlidir; aksi takdirde analizlerde hatalara yol açar. ```csharp Adapty.SetVariationForTransaction("", "", (error) => { if(error != null) { // handle the error return; } // successful binding }); ``` | Parametre | Zorunluluk | Açıklama | | ------------------------------------------------------ | -------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | transactionId | zorunlu |

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. |
--- # File: unity-troubleshoot-purchases --- --- title: "Unity SDK'da satın alma sorunlarını giderme" description: "Unity SDK'da satın alma sorunlarını giderme" --- Bu kılavuz, Unity SDK'da satın almaları manuel olarak uygularken karşılaşılan yaygın sorunları çözmenize yardımcı olur. ## makePurchase başarıyla çağrılıyor, 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 genellikle Google Play Store kurulumunun eksik ya da yanlış yapılandırıldığını gösterir. **Çözüm**: Tüm [Google Play kurulum adımlarını](initial-android) tamamladığınızdan emin olun. ## makePurchase iki kez tetikleniyor \{#makepurchase-is-invoked-twice\} **Sorun**: Aynı satın alma için `makePurchase` metodu birden fazla kez çağrılıyor. **Neden**: Bu durum genellikle UI durum yönetimi sorunları veya kullanıcının hızlı ardışık 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 modda AdaptyError.cantMakePayments \{#adaptyerrorcantmakepayments-in-observer-mode\} **Sorun**: Observer modda `makePurchase` kullanırken `AdaptyError.cantMakePayments` hatası alıyorsunuz. **Neden**: Observer modda satın almaları kendi tarafınızda yönetmeniz gerekir; Adapty'nin `makePurchase` metodunu kullanmamalısınız. **Çözüm**: Satın almalar için `makePurchase` kullanıyorsanız observer modunu kapatın. Ya `makePurchase` kullanın ya da observer modunda satın almaları kendi tarafınızda yönetin. Daha fazla ayrıntı için [Observer modunu uygulama](implement-observer-mode-unity) sayfasına 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ırmanın kullanılamadığına dair bir hata alıyorsunuz. **Neden**: Bu hata Adapty ile ilgili değildir. Cihazda faturalandırmanın mevcut olmadığını belirten bir Google Play Billing Library hatasıdır. **Çözüm**: Bu hata Adapty ile ilgili değildir. Daha fazla bilgi için Play Store belgelerine göz atabilirsiniz: [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` bulunamadığına dair sorunlarla karşılaşıyorsunuz. **Neden**: Bu durum genellikle sandbox test sorunlarıyla ilgilidir. **Çözüm**: Yeni bir sandbox kullanıcısı oluşturun ve tekrar deneyin. Bu yöntem, sandbox ile ilgili satın alma tamamlama işleyicisi sorunlarını çoğunlukla çözer. ## Diğer sorunlar \{#other-issues\} **Sorun**: Yukarıda ele alınmayan başka satın alma sorunları yaşıyorsunuz. **Çözüm**: Gerekirse SDK'yı [geçiş kılavuzlarını](unity-sdk-migration-guides) kullanarak en son sürüme güncelleyin. Pek çok sorun yeni SDK sürümlerinde giderilmiştir. --- # File: unity-identifying-users --- --- title: "Unity SDK'da kullanıcıları tanımlama" description: "Adapty SDK ile Unity uygulamanızdaki kullanıcıları nasıl tanımlayacağınızı öğrenin." --- 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 belirlemeniz gerekir. Kullanıcıları Customer User ID'leriyle [Profiles](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 belirleme \{#setting-customer-user-id-on-configuration\} Yapılandırma sırasında bir kullanıcı ID'niz varsa, bunu `.activate()` metoduna `customerUserId` parametresi olarak geçin: ```csharp showLineNumbers using UnityEngine; using AdaptySDK; var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY") .SetCustomerUserId("YOUR_USER_ID"); Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); ``` :::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 belirleme \{#setting-customer-user-id-after-configuration\} SDK yapılandırması sırasında kullanıcı ID'niz yoksa, `.identify()` metodunu kullanarak bunu istediğiniz zaman sonradan ayarlayabilirsiniz. Bu metodun en yaygın kullanım senaryoları; kayıt veya oturum açma sonrasında kullanıcının anonim kullanıcıdan kimliği doğrulanmış kullanıcıya geçiş yaptığı durumlardır. ```csharp showLineNumbers Adapty.Identify("YOUR_USER_ID", (error) => { if(error == null) { // successful identify } }); ``` İstek parametreleri: - **Customer User ID** (zorunlu): Bir string kullanıcı tanımlayıcısı. :::warning Önemli kullanıcı verilerinin yeniden gönderilmesi Kullanıcının hesabına yeniden giriş yapması gibi bazı durumlarda, Adapty'nin sunucuları söz konusu kullanıcı hakkında zaten bilgiye sahiptir. Bu senaryolarda Adapty SDK, yeni kullanıcıyla çalışmaya otomatik olarak geçiş yapar. Anonim kullanıcıya özel nitelikler veya üçüncü taraf ağlardan attribution verileri gibi herhangi bir veri aktardıysanız, bu verileri tanımlanan kullanıcı için yeniden göndermeniz gerekir. Ayrıca, yeni kullanıcının verileri farklı olabileceğinden, kullanıcıyı tanımladıktan sonra tüm paywall'ları ve ürünleri yeniden talep etmeniz gerektiğini unutmayın. ::: ### Oturum kapatma ve açma \{#logging-out-and-logging-in\} `.logout()` metodunu çağırarak kullanıcının oturumunu istediğiniz zaman kapatabilirsiniz: ```csharp showLineNumbers Adapty.Logout((error) => { if(error == null) { // successful logout } }); ``` Ardından `.identify()` metodunu kullanarak kullanıcının oturumunu açabilirsiniz. ## `appAccountToken` atama (iOS) \{#assign-appaccounttoken-ios\} [`appAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)), App Store işlemlerini dahili kullanıcı kimliğinizle ilişkilendirmenizi sağlayan bir **UUID**'dir. StoreKit bu token'ı her işlemle ilişkilendirir; böylece arka ucunuz 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 bu UUID'yi yeniden kullanın. Bu sayede satın almalar ve App Store bildirimleri doğru şekilde ilişkilendirilmiş kalır. Token'ı iki şekilde ayarlayabilirsiniz: SDK aktivasyonu sırasında veya kullanıcıyı tanımlarken. :::important `appAccountToken`'ı her zaman `customerUserId` ile birlikte geçirmelisiniz. Yalnızca token'ı geçerseniz, bu işleme dahil edilmez. ::: ```csharp showLineNumbers title="Unity" using UnityEngine; using AdaptySDK; using System; // During configuration: var appAccountToken = new Guid("YOUR_APP_ACCOUNT_TOKEN"); var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY") .SetCustomerUserId("YOUR_USER_ID", appAccountToken); Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); // Or when identifying users Adapty.Identify("YOUR_USER_ID", appAccountToken, (error) => { if (error == null) { // successful identify } }); ``` ## Gizlenmiş hesap ID'lerini ayarlama (Android) \{#set-obfuscated-account-ids-android\} Google Play, kullanıcı gizliliğini ve güvenliğini artırmak amacıyla belirli kullanım senaryoları için 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; bu özellikle dolandırıcılığın önlenmesi 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. ```csharp showLineNumbers title="Unity" using UnityEngine; using AdaptySDK; // During configuration: var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY") .SetCustomerUserId("YOUR_USER_ID", null, "YOUR_OBFUSCATED_ACCOUNT_ID"); Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); // Or when identifying users Adapty.Identify("YOUR_USER_ID", null, "YOUR_OBFUSCATED_ACCOUNT_ID", (error) => { if (error == null) { // successful identify } }); ``` ## Cihazlar arası kullanıcıları tespit edin \{#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: unity-setting-user-attributes --- --- title: "Unity SDK'da kullanıcı nitelikleri ayarlama" description: "Adapty SDK ile Unity uygulamanızda kullanıcı niteliklerini ve profil verilerini nasıl güncelleyeceğinizi öğrenin." --- Uygulamanızın kullanıcısına e-posta, telefon numarası gibi isteğe bağlı nitelikler ekleyebilirsiniz. Bu nitelikleri kullanarak kullanıcı [segmentleri](segments) oluşturabilir ya da bunları CRM'de görüntüleyebilirsiniz. ### Kullanıcı niteliklerini ayarlama \{#setting-user-attributes\} Kullanıcı niteliklerini ayarlamak için `.updateProfile()` metodunu çağırın: ```csharp showLineNumbers var builder = new Adapty.ProfileParameters.Builder() .SetFirstName("John") .SetLastName("Appleseed") .SetBirthday(new DateTime(1970, 1, 3)) .SetGender(ProfileGender.Female) .SetEmail("example@adapty.io"); Adapty.UpdateProfile(builder.Build(), (error) => { if(error != nil) { // handle the error } }); ``` `updateProfile` metoduyla daha önce ayarladığınız niteliklerin 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ı ve `` değerleri aşağıda listelenmiştir: | Anahtar | Değer | |---|-----| |

email

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.
Abonelik durumunu kontrol etmeye başlamadan önce (Genişletmek için tıklayın) - iOS için [App Store Server Notifications](enable-app-store-server-notifications) kurulumunu yapın - Android için [Real-time Developer Notifications (RTDN)](enable-real-time-developer-notifications-rtdn) kurulumunu yapın
## Access level ve AdaptyProfile nesnesi \{#access-level-and-the-adaptyprofile-object\} Access level'lar, [AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) nesnesinin özellikleridir. Profili, uygulamanız başladığında (örneğin [bir kullanıcıyı tanımladığınızda](unity-identifying-users#setting-customer-user-id-on-configuration)) alıp ardından değişiklik olduğunda güncellemenizi öneririz. Bu sayede profil nesnesini tekrar tekrar istek göndermeden kullanabilirsiniz. Profil güncellemelerinden haberdar olmak için aşağıdaki [Abonelik durumu güncellemelerini dinleme](#listening-for-subscription-status-updates) 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. ::: ## Access level'ı sunucudan alma \{#retrieving-the-access-level-from-the-server\} Access level'ı sunucudan almak için `.GetProfile()` metodunu kullanın: ```csharp showLineNumbers Adapty.GetProfile((profile, error) => { if (error != null) { // handle the error return; } // check the access }); ``` Yanıt parametreleri: | Parametre | Açıklama | | --------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Profile |

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. `` formatındaki kullanıcı ID'si, e-posta kullanımı gibi kişisel veri toplama olarak değerlendirilecektir. Çocuk Modu için en iyi uygulama, uyumluluğu sağlamak amacıyla rastgele veya anonimleştirilmiş tanımlayıcılar (ör. karma ID'ler veya cihaz tarafından oluşturulan UUID'ler) kullanmaktır. ## Çocuk Modunu Etkinleştirme \{#enabling-kids-mode\} ### Adapty Kontrol Paneli'nde yapılacak güncellemeler \{#updates-in-the-adapty-dashboard\} Adapty Kontrol Paneli'nde IP adresi toplamanın devre dışı bırakılması gerekir. Bunun için [App settings](https://app.adapty.io/settings/general) sayfasına gidin ve **Collect users' IP address** altındaki **Disable IP address collection** seçeneğine tıklayın. ### Mobil uygulama kodunuzda yapılacak güncellemeler \{#updates-in-your-mobile-app-code\} Unity'de Çocuk Modu desteği yakında geliyor! Şimdilik aşağıdaki platform kılavuzlarını takip edebilirsiniz: - iOS yapılandırması için [iOS SDK'da Çocuk Modu](kids-mode) - Android yapılandırması için [Android SDK'da Çocuk Modu](kids-mode-android) --- # File: unity-get-onboardings --- --- title: "Unity SDK'da onboarding alma" description: "Unity için Adapty'de onboarding'leri nasıl alacağınızı öğrenin." --- [Adapty Kontrol Paneli'ndeki builder ile onboarding'inizin görsel kısmını tasarladıktan](design-onboarding) sonra Unity uygulamanızda gösterebilirsiniz. Bu sürecin ilk adımı, aşağıda açıklandığı gibi placement ile ilişkili onboarding'i ve görünüm yapılandırmasını almaktır. Başlamadan önce şunları kontrol edin: 1. [Adapty Unity SDK](sdk-installation-unity) 3.14.0 veya üzeri sürümünü yüklediğinizden emin olun. 2. Bir [onboarding oluşturduğunuzdan](create-onboarding) emin olun. 3. Onboarding'i bir [placement](placements)'a eklediğinizden emin olun. ## Onboarding'i alın ve görünüm oluşturun \{#fetch-onboarding-and-create-view\} No-code builder'ımızla bir [onboarding](onboardings) oluşturduğunuzda, bu onboarding uygulamanızın alıp göstermesi gereken bir yapılandırma içeren konteyner olarak saklanır. Bu konteyner, hangi içeriğin görüneceği, nasıl sunulacağı ve kullanıcı etkileşimlerinin (quiz cevapları veya form girişleri gibi) nasıl işleneceği dahil tüm deneyimi yönetir. Konteyner aynı zamanda analitik olaylarını otomatik olarak takip eder; bu sayede ayrıca görüntüleme takibi yapmanız gerekmez. En iyi performans için, kullanıcılara göstermeden önce görsellerin indirilmesine yeterli zaman tanımak amacıyla onboarding yapılandırmasını erken alın. Onboarding almak için `GetOnboarding` metodunu kullanın: ```csharp showLineNumbers Adapty.GetOnboarding("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.

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) } ```
Olay örneği (Genişletmek için tıklayın) ```json { "actionId": "allowNotifications", "meta": { "onboardingId": "onboarding_123", "screenClientId": "profile_screen", "screenIndex": 0, "screensTotal": 3 } } ```
## Onboarding'i kapatma \{#closing-onboarding\} Onboarding, kullanıcı **Close** eylemi atanmış bir butona dokunduğunda kapanmış sayılır. :::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 } ```
Olay örneği (Genişletmek için tıklayın) ```json { "action_id": "close_button", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "final_screen", "screen_index": 3, "total_screens": 4 } } ```
## Bir paywall açma \{#opening-a-paywall\} :::tip Onboarding içinde bir paywall açmak istiyorsanız bu olayı işleyin. Paywall kapatıldıktan sonra açmak istiyorsanız daha doğrudan bir yol var: [`OnboardingViewOnCloseAction`](#closing-onboarding) olayını işleyin ve olay verisine dayanmadan paywall'ı açın. ::: Onboarding'lerde paywall'larla çalışmanın en sorunsuz yolu, aksiyon ID'sini bir paywall placement ID'siyle eşit kılmaktır. Bu sayede `OnboardingViewOnPaywallAction` sonrasında, placement ID'yi kullanarak paywall'ı hemen alıp açabilirsiniz. iOS'ta aynı anda ekranda yalnızca bir görünüm (paywall veya onboarding) gösterilebilir. Onboarding'in üzerine bir paywall sunarsanız, arka plandaki onboarding'i programatik olarak kontrol edemezsiniz. Onboarding'i kapatmaya çalışırsanız bunun yerine paywall kapanır ve onboarding görünür kalır. Bunu önlemek için paywall sunmadan önce her zaman onboarding görünümünü kapatın. ```csharp showLineNumbers title="Unity" public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener { public void OnboardingViewOnPaywallAction( AdaptyUIOnboardingView view, AdaptyUIOnboardingMeta meta, string actionId ) { // Dismiss onboarding before presenting paywall view.Dismiss((dismissError) => { if (dismissError != null) { // handle the error return; } Adapty.GetPaywall(actionId, (paywall, error) => { if (error != null) { // handle the error return; } AdaptyUI.CreatePaywallView(paywall, (paywallView, createError) => { if (createError != null) { // handle the error return; } paywallView.Present((presentError) => { if (presentError != null) { // handle the error } }); }); }); }); } // ... other interface methods } ```
Olay örneği (Genişletmek için tıklayın) ```json { "action_id": "premium_offer_1", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "pricing_screen", "screen_index": 2, "total_screens": 4 } } ```
## Onboarding yüklemesinin tamamlanması \{#finishing-loading-onboarding\} Onboarding yüklemesi tamamlandığında `OnboardingViewDidFinishLoading` metodunu uygulayın: ```csharp showLineNumbers title="Unity" public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener { public void OnboardingViewDidFinishLoading( AdaptyUIOnboardingView view, AdaptyUIOnboardingMeta meta ) { // handle loading completion } // ... other interface methods } ```
Olay örneği (Genişletmek için tıklayın) ```json { "meta": { "onboarding_id": "onboarding_123", "screen_cid": "welcome_screen", "screen_index": 0, "total_screens": 4 } } ```
## Navigasyonu izleme \{#tracking-navigation\} `OnboardingViewOnAnalyticsEvent` metodu, onboarding akışı sırasında çeşitli analitik olaylar gerçekleştiğinde çağrılır. `analyticsEvent` nesnesi aşağıdaki türlerden biri olabilir: | Tür | Açıklama | |------------|-------------| | `AdaptyOnboardingsAnalyticsEventOnboardingStarted` | Onboarding yüklendiğinde | | `AdaptyOnboardingsAnalyticsEventScreenPresented` | Herhangi bir ekran gösterildiğinde | | `AdaptyOnboardingsAnalyticsEventScreenCompleted` | Bir ekran tamamlandığında. İsteğe bağlı `ElementId` (tamamlanan öğenin tanımlayıcısı) ve isteğe bağlı `Reply` (kullanıcının yanıtı) içerir. Kullanıcılar ekrandan çıkmak için herhangi bir eylem gerçekleştirdiğinde tetiklenir. | | `AdaptyOnboardingsAnalyticsEventSecondScreenPresented` | İkinci ekran gösterildiğinde | | `AdaptyOnboardingsAnalyticsEventUserEmailCollected` | Kullanıcının e-postası giriş alanı aracılığıyla toplandığında tetiklenir | | `AdaptyOnboardingsAnalyticsEventOnboardingCompleted` | Kullanıcı `final` ID'li bir ekrana ulaştığında tetiklenir. Bu olaya ihtiyacınız varsa [son ekrana `final` ID'yi atayın](design-onboarding). | | `AdaptyOnboardingsAnalyticsEventUnknown` | Tanınmayan olay türleri için. `Name` (bilinmeyen olayın adı) ve `meta` (ek meta veriler) içerir | Her olay şu alanları içeren `meta` bilgisini barındırır: | Alan | Açıklama | |------------|-------------| | `OnboardingId` | Onboarding akışının benzersiz tanımlayıcısı | | `ScreenClientId` | Mevcut ekranın tanımlayıcısı | | `ScreenIndex` | Mevcut ekranın akıştaki konumu | | `ScreensTotal` | Akıştaki toplam ekran sayısı | Analitik olaylarını izleme amacıyla nasıl kullanabileceğinize dair bir örnek: ```csharp showLineNumbers title="Unity" public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener { public void OnboardingViewOnAnalyticsEvent( AdaptyUIOnboardingView view, AdaptyUIOnboardingMeta meta, AdaptyOnboardingsAnalyticsEvent analyticsEvent ) { switch (analyticsEvent) { case AdaptyOnboardingsAnalyticsEventOnboardingStarted: // track onboarding start TrackEvent("onboarding_started", meta); break; case AdaptyOnboardingsAnalyticsEventScreenPresented: // track screen presentation TrackEvent("screen_presented", meta); break; case AdaptyOnboardingsAnalyticsEventScreenCompleted screenCompleted: // track screen completion with user response TrackEvent("screen_completed", meta, screenCompleted.ElementId, screenCompleted.Reply); break; case AdaptyOnboardingsAnalyticsEventOnboardingCompleted: // track successful onboarding completion TrackEvent("onboarding_completed", meta); break; case AdaptyOnboardingsAnalyticsEventUnknown unknownEvent: // handle unknown events TrackEvent(unknownEvent.Name, meta); break; // handle other cases as needed } } // ... other interface methods } ``` :::note `TrackEvent` metodu, analitik verilerini tercih ettiğiniz analitik servisine göndermek için kendiniz uygulamanız gereken bir yer tutucudur. :::
Olay örnekleri (Genişletmek için tıklayın) ```javascript // onboardingStarted { "name": "onboarding_started", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "welcome_screen", "screen_index": 0, "total_screens": 4 } } // screenPresented { "name": "screen_presented", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "interests_screen", "screen_index": 2, "total_screens": 4 } } // screenCompleted { "name": "screen_completed", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "profile_screen", "screen_index": 1, "total_screens": 4 }, "params": { "element_id": "profile_form", "reply": "success" } } // secondScreenPresented { "name": "second_screen_presented", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "profile_screen", "screen_index": 1, "total_screens": 4 } } // userEmailCollected { "name": "user_email_collected", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "profile_screen", "screen_index": 1, "total_screens": 4 } } // onboardingCompleted { "name": "onboarding_completed", "meta": { "onboarding_id": "onboarding_123", "screen_cid": "final_screen", "screen_index": 3, "total_screens": 4 } } ```
--- # File: unity-onboarding-input --- --- title: "Unity SDK'da onboarding verilerini işleme" description: "Adapty SDK ile Unity uygulamanızdaki onboarding verilerini kaydedin ve kullanın." --- Kullanıcılarınız bir quiz sorusunu yanıtladığında veya bir giriş alanına veri girdiğinde `OnboardingViewOnStateUpdatedAction` metodu çağrılır. Alan türünü kodunuzda kaydedebilir veya işleyebilirsiniz. Sınıfınızda `OnboardingViewOnStateUpdatedAction` metodunu uygulayın: ```csharp showLineNumbers title="Unity" public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener { public void OnboardingViewOnStateUpdatedAction( AdaptyUIOnboardingView view, AdaptyUIOnboardingMeta meta, string elementId, AdaptyOnboardingsStateUpdatedParams @params ) { switch (@params) { case AdaptyOnboardingsSelectParams selectParams: // handle single selection break; case AdaptyOnboardingsMultiSelectParams multiSelectParams: // handle multiple selections break; case AdaptyOnboardingsInputParams inputParams: // handle text input break; case AdaptyOnboardingsDatePickerParams datePickerParams: // handle date selection break; } } // ... other interface methods } ``` Parametreler şunlardır: | Parametre | Açıklama | |----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `elementId` | Giriş öğesi için benzersiz bir tanımlayıcı. Soruları yanıtlarla ilişkilendirmek için kullanabilirsiniz. | | `@params` | Kullanıcının girdi veri nesnesi. Aşağıdaki türlerden biri olabilir. | | `AdaptyOnboardingsSelectParams` | Seçeneklerden tek seçim. `Id`, `Value`, `Label` içerir. | | `AdaptyOnboardingsMultiSelectParams` | Seçeneklerden çoklu seçim. `Params` listesi içerir (her biri `Id`, `Value`, `Label` ile)
• `input`: `type`, `value` içeren nesne
• `datePicker`: `day`, `month`, `year` içeren nesne | | `AdaptyOnboardingsInputParams` | Metin giriş alanı. `AdaptyOnboardingsTextInput`, `AdaptyOnboardingsEmailInput` veya `AdaptyOnboardingsNumberInput` olabilen `Input` içerir. | | `AdaptyOnboardingsDatePickerParams` | Tarih seçimi. Null olabilen `Day`, `Month`, `Year` içerir. |
Kaydedilen veri örnekleri (uygulamanızda farklılık gösterebilir) ```javascript // Example of a saved select action { "elementId": "preference_selector", "meta": { "onboardingId": "onboarding_123", "screenClientId": "preferences_screen", "screenIndex": 1, "screensTotal": 3 }, "params": { "type": "select", "value": { "id": "option_1", "value": "premium", "label": "Premium Plan" } } } // Example of a saved multi-select action { "elementId": "interests_selector", "meta": { "onboardingId": "onboarding_123", "screenClientId": "interests_screen", "screenIndex": 2, "screensTotal": 3 }, "params": { "type": "multiSelect", "value": [ { "id": "interest_1", "value": "sports", "label": "Sports" }, { "id": "interest_2", "value": "music", "label": "Music" } ] } } // Example of a saved input action { "elementId": "name_input", "meta": { "onboardingId": "onboarding_123", "screenClientId": "profile_screen", "screenIndex": 0, "screensTotal": 3 }, "params": { "type": "input", "value": { "type": "text", "value": "John Doe" } } } // Example of a saved date picker action { "elementId": "birthday_picker", "meta": { "onboardingId": "onboarding_123", "screenClientId": "profile_screen", "screenIndex": 0, "screensTotal": 3 }, "params": { "type": "datePicker", "value": { "day": 15, "month": 6, "year": 1990 } } } ```
## Kullanım senaryoları \{#use-cases\} ### Kullanıcı profillerini verilerle zenginleştirme \{#enrich-user-profiles-with-data\} Giriş verilerini kullanıcı profiliyle hemen ilişkilendirmek ve aynı bilgiyi iki kez sormaktan kaçınmak istiyorsanız, eylemi işlerken giriş verisiyle [kullanıcı profilini güncellemeniz](unity-setting-user-attributes) gerekir. Örneğin, kullanıcılara `name` ID'li metin alanına adlarını girmelerini istiyorsunuz ve bu alanın değerini kullanıcının adı olarak ayarlamak istiyorsunuz. Ayrıca `email` alanına e-posta adreslerini girmelerini de istiyorsunuz. Uygulama kodunuzda bu şöyle görünebilir: ```csharp showLineNumbers title="Unity" public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener { public void OnboardingViewOnStateUpdatedAction( AdaptyUIOnboardingView view, AdaptyUIOnboardingMeta meta, string elementId, AdaptyOnboardingsStateUpdatedParams @params ) { if (@params is AdaptyOnboardingsInputParams inputParams) { var builder = new AdaptyProfileParameters.Builder(); switch (elementId) { case "name": if (inputParams.Input is AdaptyOnboardingsTextInput textInput) { builder.SetFirstName(textInput.Value); } break; case "email": if (inputParams.Input is AdaptyOnboardingsEmailInput emailInput) { builder.SetEmail(emailInput.Value); } break; } Adapty.UpdateProfile(builder.Build(), (error) => { if (error != null) { // handle the error } }); } } // ... other interface methods } ``` ### Yanıtlara göre paywallları özelleştirme \{#customize-paywalls-based-on-answers\} Onboarding'lerdeki quizleri kullanarak, kullanıcılara onboarding'i tamamladıktan sonra gösterdiğiniz paywallları da özelleştirebilirsiniz. Örneğin, kullanıcılara spor deneyimleri hakkında soru sorarak farklı kullanıcı gruplarına farklı CTA'lar ve ürünler gösterebilirsiniz. 1. Onboarding builder'da bir [quiz ekleyin](onboarding-quizzes) ve seçeneklerine anlamlı ID'ler atayın. 2. Quiz yanıtlarını ID'lerine göre işleyin ve kullanıcılar için [özel attribute'lar ayarlayın](unity-setting-user-attributes). ```csharp showLineNumbers title="Unity" public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener { public void OnboardingViewOnStateUpdatedAction( AdaptyUIOnboardingView view, AdaptyUIOnboardingMeta meta, string elementId, AdaptyOnboardingsStateUpdatedParams @params ) { if (@params is AdaptyOnboardingsSelectParams selectParams) { var builder = new AdaptyProfileParameters.Builder(); switch (elementId) { case "experience": // set custom attribute 'experience' with the selected value (beginner, amateur, pro) builder.SetCustomStringAttribute("experience", selectParams.Value); break; } Adapty.UpdateProfile(builder.Build(), (error) => { if (error != null) { // handle the error } }); } } // ... other interface methods } ``` 3. Her özel attribute değeri için [segment oluşturun](segments). 4. Bir [placement](placements) oluşturun ve oluşturduğunuz her segment için [kitle](audience) ekleyin. 5. Uygulama kodunuzda placement için bir [paywall görüntüleyin](unity-paywalls). Onboarding'inizde bir paywall açan buton varsa, paywall kodunu [bu butonun eylemine yanıt olarak](unity-handling-onboarding-events#opening-a-paywall) uygulayın. --- # File: unity-sdk-call-order --- --- title: "Unity SDK'da çağrı sırası" description: "Adapty SDK metodlarını doğru sırayla çağırarak premium erişim kaybını, eksik attribution'ı ve aralıklı #2002 hatalarını önleyin." --- `Adapty.Activate()` tamamlanmadan diğer hiçbir Adapty SDK metodunu çağırmamalısınız. Tamamlanma callback'i tetiklenmeden SDK'nın herhangi bir durumu olmaz. `Activate()` tamamlanmadan veya onunla paralel olarak yapılan her çağrı [`#2002 notActivated`](unity-handle-errors#custom-network-codes) hatasıyla başarısız olur. Uygulamanız kullanıcıların kimliğini doğruluyorsa ve başlatma sonrasında bir müşteri kullanıcı kimliği topluyorsanız, o noktada `Adapty.Identify()` çağrısı yapın. `Identify` geri çağrısı tetiklenene kadar kullanıcı eylemine bağlı metodları çağırmayın. Bu metodlarla yarışan çağrılar ya [`#3006 profileWasChanged`](unity-handle-errors#custom-network-codes) hatasıyla başarısız olur ya da aktivasyon sırasında oluşturulan anonim profile düşer. Bu durumda attribution, `appsflyer_id` gibi MMP kimlikleri ve kurulum sahipliği her zaman tanımlanan profile aktarılmaz. Uygulamanız kullanıcı kimlik doğrulaması yapmıyorsa `Identify` çağrısını atlayın ve anonim profille çalışmaya devam edin. MMP ve analitik SDK'ları (AppsFlyer, Adjust, Branch, PostHog) aynı kurala tabidir. `Adapty.Activate` çağrısından önce bunları başlatın ve UID callback'lerini bekleyin. Aksi takdirde MMP kimliği, kısa süreli anonim bir profile atanır ve bu kimlik tanımlanmış profile her zaman aktarılamayabilir. AppsFlyer'a özgü ayrıntılar için [AppsFlyer](appsflyer) sayfasına bakın. ## Doğru sıralama \{#the-correct-order\} Hangi adımları izleyeceğiniz iki şeye bağlıdır: müşteri kullanıcı kimliğini ne zaman öğrendiğiniz ve bir MMP ya da analitik SDK kullanıp kullanmadığınız. - **2. ve 5. adımlar**: Her uygulama için zorunludur. Önce SDK'yı etkinleştirin, ardından SDK metodlarını çağırın. - **1. ve 3. adımlar**: Yalnızca bir MMP veya analitik SDK (AppsFlyer, Adjust, Branch, PostHog) entegre ediyorsanız gereklidir. - **4. adım**: Yalnızca uygulamanız kullanıcıları doğruluyorsa ve müşteri kullanıcı kimliğini başlatma sonrasında topluyorsa gereklidir. Uygulama başlangıcında müşteri kullanıcı kimliğiniz varsa, doğrudan `Activate()` içine aktarın (adım 2a). Bu yol hiçbir zaman anonim profil oluşturmaz, dolayısıyla adım 4 gerekli değildir. | Adım | Çağrı | Ne Zaman | Notlar | |------|---------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| | 1 | MMP veya analitik SDK'nızı başlatın (AppsFlyer, Adjust, PostHog, Branch) | Uygulama başlatma, ilk önce | MMP'nin UID callback'ini bekleyin, örneğin `getAppsFlyerId`. | | 2a | `SetCustomerUserId` ayarlanmış builder ile `Adapty.Activate(builder.Build(), ...)` | Adım 1'den sonra, uygulama başlatma sırasında, müşteri kullanıcı kimliğine sahipseniz | Önerilir. Anonim profil hiçbir zaman oluşturulmaz. | | 2b | `SetCustomerUserId` olmadan `Adapty.Activate(builder.Build(), ...)` | Adım 1'den sonra, uygulama başlatma sırasında, müşteri kullanıcı kimliğiniz yoksa (veya hiç toplamıyorsanız) | Adapty anonim bir profil oluşturur. | | 3 | Her MMP için `Adapty.SetIntegrationIdentifier(key, value, callback)` | Adım 2'den sonra, herhangi bir kullanıcı eylemi çağrısından önce | MMP kimliklerinin doğru profile düşmesi için gereklidir. | | 4 | `Adapty.Identify("YOUR_USER_ID", callback)` | Adım 3'ten sonra (veya MMP yoksa adım 2'den sonra), adım 5'ten önce — yalnızca kimlik doğrulama ile 2b yolunda | Tamamlama callback'ini bekleyin. `Identify` sırasında yapılan eş zamanlı çağrılar `#3006 profileWasChanged` hatası üretir. | | 5 | `GetPaywall`, `GetPaywallProducts`, `RestorePurchases`, `MakePurchase`, `UpdateAttribution`, `UpdateProfile` | `Identify` çağırıyorsanız adım 4'ten sonra; değilse adım 3'ten sonra (veya MMP yoksa adım 2'den sonra) | Bu çağrılar kararlı bir profile ihtiyaç duyar. | :::important Bu adımları atlamak; geri dönen kullanıcıların premium erişimini kaybetmesine, profillerde eksik `appsflyer_id` bilgisine ve yanlış kitle için döndürülen paywallara yol açar. ::: ## Web2app ve web-funnel kurulumları \{#web2app-and-web-funnel-installs\} Kullanıcılar bir web checkout'unda (Stripe, Paddle) satın alma yapıp ardından native uygulamayı yüklerse, cihazın ilk `Activate()` çağrısı yeni bir anonim profil oluşturur. Bu profil, web profiliyle ilişkilendirilmez. Uygulama başlatılmadan önce customer user ID'yi çözümleyebiliyorsanız (auth akışınızdan veya install referrer'dan), bunu doğrudan `Activate()` içine aktarın. Aksi takdirde web satın alımı, `Identify("YOUR_USER_ID")` ve ardından `RestorePurchases` çağrısı yapılana kadar cihazda görünmez. Her web checkout'uyla gönderilecek metadata için şu sayfalara bakın: - [Stripe](stripe) - [Paddle](paddle) --- # File: unity-optimize-paywall-fetching --- --- title: "Unity SDK'da paywall getirimini optimize edin" description: "Adapty paywalllerini güvenilir şekilde getirin: Unity için zamanlama, önbellekleme ve yedek paywall kalıpları." --- Unity'de güvenilir bir paywall getirimi üç şeyi başarır: hızlı render eder, kitleye yönelik doğru paywall'ı döndürür ve ağ yavaş olduğunda sorunsuz şekilde yedek paywall'a geçer. Aşağıdaki kurallar bu hedefe ulaşmak için zamanlama, önbellekleme ve yedek paywall kalıplarını kapsar. :::tip Bu kurallar, `Adapty.Activate()` ve `Adapty.Identify()` işlemlerinin zaten tamamlandığını varsayar. Bkz. [Unity SDK'da çağrı sırası](unity-sdk-call-order). ::: ## Kurallar ve tuzaklar \{#rules-and-pitfalls\} | Bunu yapın | Bunu yapmayın | Neden | |---|---|---| | Göstermek üzere olduğunuz placement'ı yükleyin. | Tüm placement'ları uygulama açılışında eş zamanlı olarak önceden yükleyin. | Toplu önceden yükleme, ana iş parçacığını bloke eder ve yoğunluk sırasında siyah ekrana neden olur. | | `GetPaywall`'ı attribution çözümlendikten sonra çağırın — örneğin `Activate`'den 1–2 saniye sonra veya `OnLoadLatestProfile` tetiklendikten sonra. | `GetPaywall`'ı `Awake()` içinde çağırın. | Attribution henüz gelmemiştir. Paywall varsayılan kitleye göre çözümlenir ve segmentlerle ASA kişiselleştirmesini sessizce atlar. | | Her placement için bir `loadTimeout` ayarlayın ve bir [yedek paywall](fallback-paywalls) yapılandırın. | `GetPaywall`'ın sonucunu süresiz olarak bekleyin. | Zaman aşımı olmadan, zayıf bağlantıdaki kullanıcılar ağ çözümlenene kadar boş ekran görür veya uygulamayı kapatır. | `fetchPolicy` ve `loadTimeout` parametre referansı için [Paywall'ları ve ürünleri getir](fetch-paywalls-and-products-unity) sayfasına, doğru placement'ı seçmek için ise [Placement'lar](placements) sayfasına bakın. ## Zayıf bağlantı için ayarlama \{#tune-for-poor-connectivity\} Sürekli zayıf bağlantı yaşanan pazarlar için (kırsal alanlar, toplu taşıma, yönlendirme sorunları olan bölgeler): - İlk fetch dışındaki tüm fetch işlemlerinde `fetchPolicy` değerini `AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad` olarak ayarlayın. - Adapty Kontrol Paneli'nde her placement için bir [yedek paywall](fallback-paywalls) yapılandırın. - `loadTimeout` değerini 3–5 saniye olarak ayarlayın ve zaman aşımı gerçekleştiğinde yedek paywalla geçin. - Paywall gösterimini `GetProfile` çağrısına bağlamayın. `GetPaywall` işlemini bağımsız olarak çağırın; bu sayede yavaş bir profil yüklemesi arayüzü engellemez. --- # File: unity-test --- --- title: "Unity SDK'da Test Et ve Yayınla" description: "Adapty SDK ile Unity uygulamanızı nasıl test edip yayınlayacağınızı öğrenin." --- Adapty SDK'yı Unity uygulamanıza entegre ettiyseniz, her şeyin doğru kurulduğunu ve satın almaların hem iOS hem Android platformlarında beklediğiniz gibi çalıştığını test etmek isteyeceksiniz. Bu süreç, hem SDK entegrasyonunun hem de Apple'ın sandbox ortamı ile Google Play'in test ortamında gerçek satın alma akışının test edilmesini kapsar. ## Uygulamanızı test edin \{#test-your-app\} Uygulama içi satın almalarınızı kapsamlı şekilde test etmek için platforma özel test kılavuzlarımıza bakın: [iOS test kılavuzu](test-purchases-in-sandbox) ve [Android test kılavuzu](testing-on-android). ## Yayına hazırlanın \{#prepare-for-release\} Uygulamanızı mağazaya göndermeden önce, aşağıdakileri doğrulamak için [Yayın kontrol listesi](release-checklist)'ni takip edin: - Mağaza bağlantısı ve sunucu bildirimleri yapılandırılmış - Satın almalar tamamlanıyor ve Adapty'e bildiriliyor - Erişim doğru şekilde kilidi açılıyor ve geri yükleniyor - Gizlilik ve inceleme gereksinimleri karşılanmış --- # File: InvalidProductIdentifiers-unity --- --- title: "Unity SDK'da Code-1000 noProductIDsFound Hatasının Çözümü" description: "Adapty'de abonelikleri yönetirken geçersiz ürün tanımlayıcısı hatalarını çözün." --- 1000 kodlu `noProductIDsFound` hatası, paywall'da talep ettiğiniz ürünlerin App Store'da listelenmiş olmasına rağmen satın almaya açık olmadığı anlamına gelir. Bu hata bazen `InvalidProductIdentifiers` uyarısıyla birlikte görünebilir. Uyarı tek başına çıkıyorsa ve hata yoksa görmezden gelebilirsiniz. `noProductIDsFound` hatasıyla karşılaşıyorsanız sorunu çözmek için şu adımları izleyin: ## Adım 1. Bundle ID'yi kontrol edin \{#step-2-check-bundle-id\} 1. [App Store Connect](https://appstoreconnect.apple.com/apps)'i açın. Uygulamanızı seçin ve **General** → **App Information** bölümüne gidin. 2. **General Information** alt bölümündeki **Bundle ID**'yi kopyalayın. 3. Adapty üst menüsünden [**App settings** -> **iOS SDK** sekmesini](https://app.adapty.io/settings/ios-sdk) açın ve kopyaladığınız değeri **Bundle ID** alanına yapıştırın. 4. App Store Connect'teki **App information** sayfasına geri dönün ve oradan **Apple ID**'yi kopyalayın. 5. Adapty kontrol panelindeki [**App settings** -> **iOS SDK**](https://app.adapty.io/settings/ios-sdk) sayfasında, ID'yi **Apple app ID** alanına yapıştırın. ## Adım 2. Ürünleri kontrol edin \{#step-3-check-products\} 1. **App Store Connect**'e gidin ve sol menüden [**Monetization** → **Subscriptions**](https://appstoreconnect.apple.com/apps/6477523342/distribution/subscriptions) bölümüne geçin. 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 data = new Dictionary(); - - data["network"] = attribution.Network; - data["campaign"] = attribution.Campaign; - data["adgroup"] = attribution.Adgroup; - data["creative"] = attribution.Creative; - - String attributionString = JsonUtility.ToJson(data); - Adapty.UpdateAttribution(attributionString, AttributionSource.Adjust, adid, (error) => { - // handle the error - }); + if (adid != null) { + Adapty.SetIntegrationIdentifier( + "adjust_device_id", + adid, + (error) => { + // handle the error + }); } }); Adjust.GetAttribution((attribution) => { Dictionary data = new Dictionary(); data["network"] = attribution.Network; data["campaign"] = attribution.Campaign; data["adgroup"] = attribution.Adgroup; data["creative"] = attribution.Creative; String attributionString = JsonUtility.ToJson(data); - Adapty.UpdateAttribution(attributionString, AttributionSource.Adjust, adid, (error) => { + Adapty.UpdateAttribution(attributionString, "adjust", (error) => { // handle the error }); }); ``` ### 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) sayfasına bakın. ```diff showLineNumbers using AdaptySDK; - var builder = new Adapty.ProfileParameters.Builder(); - builder.SetAmplitudeUserId("YOUR_AMPLITUDE_USER_ID"); - builder.SetAmplitudeDeviceId(amplitude.getDeviceId()); - Adapty.UpdateProfile(builder.Build(), (error) => { - // handle error - }); + Adapty.SetIntegrationIdentifier( + "amplitude_user_id", + "YOUR_AMPLITUDE_USER_ID", + (error) => { + // handle the error + }); + Adapty.SetIntegrationIdentifier( + "amplitude_device_id", + amplitude.getDeviceId(), + (error) => { + // handle the error + }); ``` ### AppMetrica Aşağıda gösterildiği gibi mobil uygulama kodunuzu güncelleyin. Tam kod örneği için [AppMetrica entegrasyonu için SDK yapılandırması](appmetrica#sdk-configuration) sayfasına bakın. ```diff showLineNumbers using AdaptySDK; - var deviceId = AppMetrica.GetDeviceId(); - if (deviceId != null { - var builder = new Adapty.ProfileParameters.Builder(); - builder.SetAppmetricaProfileId("YOUR_ADAPTY_CUSTOMER_USER_ID"); - builder.SetAppmetricaDeviceId(deviceId); - Adapty.UpdateProfile(builder.Build(), (error) => { - // handle error - }); - } + var deviceId = AppMetrica.GetDeviceId(); + if (deviceId != null { + Adapty.SetIntegrationIdentifier( + "appmetrica_device_id", + deviceId, + (error) => { + // handle the error + }); + + Adapty.SetIntegrationIdentifier( + "appmetrica_profile_id", + "YOUR_ADAPTY_CUSTOMER_USER_ID", + (error) => { + // handle the error + }); + } ``` ### AppsFlyer Mobil uygulama kodunuzu aşağıda gösterildiği şekilde güncelleyin. Tam kod örneği için [AppsFlyer entegrasyonunda SDK yapılandırması](appsflyer#connect-your-app-to-appsflyer) bölümüne bakın. ```diff showLineNumbers using AppsFlyerSDK; using AdaptySDK; // before SDK initialization AppsFlyer.getConversionData(this.name); // in your IAppsFlyerConversionData void onConversionDataSuccess(string conversionData) { // It's important to include the network user ID - string appsFlyerId = AppsFlyer.getAppsFlyerId(); - Adapty.UpdateAttribution(conversionData, AttributionSource.Appsflyer, appsFlyerId, (error) => { + string appsFlyerId = AppsFlyer.getAppsFlyerId(); + + Adapty.SetIntegrationIdentifier( + "appsflyer_id", + appsFlyerId, + (error) => { // handle the error }); + + Adapty.UpdateAttribution( + conversionData, + "appsflyer", + (error) => { + // handle the error + }); } ``` ### 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ına](branch#connect-your-app-to-branch) göz atın. ```diff showLineNumbers using AdaptySDK; - class YourBranchImplementation { - func initializeBranch() { - Branch.getInstance().initSession(launchOptions: launchOptions) { (data, error) in - if let data { - Adapty.updateAttribution(data, source: .branch) - } - } - } - } + Branch.initSession(delegate(Dictionary parameters, string error) { + string attributionString = JsonUtility.ToJson(parameters); + + Adapty.UpdateAttribution( + attributionString, + "branch", + (error) => { + // handle the error + }); + }); ``` ### 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 // We suppose FirebaseAnalytics Unity Plugin is already installed using AdaptySDK; Firebase.Analytics .FirebaseAnalytics .GetAnalyticsInstanceIdAsync() .ContinueWithOnMainThread((task) => { if (!task.IsCompletedSuccessfully) { // handle error return; } var firebaseId = task.Result var builder = new Adapty.ProfileParameters.Builder(); - builder.SetFirebaseAppInstanceId(firebaseId); - - Adapty.UpdateProfile(builder.Build(), (error) => { - // handle error + Adapty.SetIntegrationIdentifier( + "firebase_app_instance_id", + firebaseId, + (error) => { + // handle the error }); }); ``` ### 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 using AdaptySDK; - var builder = new Adapty.ProfileParameters.Builder(); - builder.SetMixpanelUserId(Mixpanel.DistinctId); - Adapty.UpdateProfile(builder.Build(), (error) => { - // handle error - }); + var distinctId = Mixpanel.DistinctId; + if (distinctId != null) { + Adapty.SetIntegrationIdentifier( + "mixpanel_user_id", + distinctId, + (error) => { + // handle the error + }); + } ``` ### 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) sayfasına bakın. ```diff showLineNumbers using AdaptySDK; - using OneSignalSDK; - var pushUserId = OneSignal.Default.PushSubscriptionState.userId; - var builder = new Adapty.ProfileParameters.Builder(); - builder.SetOneSignalPlayerId(pushUserId); - Adapty.UpdateProfile(builder.Build(), (error) => { - // handle error - }); + var distinctId = Mixpanel.DistinctId; + if (distinctId != null) { + Adapty.SetIntegrationIdentifier( + "mixpanel_user_id", + distinctId, + (error) => { + // handle the error + }); + } ``` ### Pushwoosh Mobil uygulama kodunuzu aşağıdaki şekilde güncelleyin. Tam kod örneği için [Pushwoosh entegrasyonu için SDK yapılandırması](pushwoosh#sdk-configuration) sayfasına bakın. ```diff showLineNumbers using AdaptySDK; - var builder = new Adapty.ProfileParameters.Builder(); - builder.SetPushwooshHWID(Pushwoosh.Instance.HWID); - Adapty.UpdateProfile(builder.Build(), (error) => { - // handle error - }); + Adapty.SetIntegrationIdentifier( + "pushwoosh_hwid", + Pushwoosh.Instance.HWID, + (error) => { + // handle the error + }); ``` ## Observer mode uygulamasını güncelleyin \{#update-observer-mode-implementation\} Paywall'ları işlemlere bağlama şeklinizi güncelleyin. Daha önce `variationId` atamak için `setVariationId` metodunu kullanıyordunuz. Artık yeni `reportTransaction` metoduyla işlemi kaydederken `variationId`'yi doğrudan dahil edebilirsiniz. Son kod örneğine [Observer modunda paywall'ları satın alma işlemleriyle ilişkilendirme](report-transactions-observer-mode-unity) sayfasından bakabilirsiniz. ```diff showLineNumbers // every time when calling transaction.finish() - Adapty.SetVariationForTransaction("", "", (error) => { - if(error != null) { - // handle the error - return; - } - - // successful binding - }); + Adapty.ReportTransaction( + "YOUR_TRANSACTION_ID", + "PAYWALL_VARIATION_ID", // optional + (error) => { + // handle the error + }); ``` ## Unity Eklenti Başlatmasını Güncelleme \{#update-the-unity-plugin-initialization\} Adapty Unity SDK 3.3.0'dan itibaren, eklenti başlatılırken `Activate` metodunun açıkça çağrılması zorunludur: ```csharp showLineNumbers Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); ``` --- # File: migration-to-unity-sdk-v3 --- --- title: "Adapty Unity SDK'yı v3.0'a Taşıma" description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Unity SDK v3.0'a geçiş yapın." --- Adapty SDK v3.0, yeni ve heyecan verici [Adapty Paywall Builder](adapty-paywall-builder)'ı desteklemektedir. Bu, paywall oluşturmak için kullanılan, kod gerektirmeyen ve kullanıcı dostu aracın yeni sürümüdür. Maksimum esnekliği ve zengin tasarım özellikleriyle paywalllarınız çok daha etkili ve kârlı hale gelecektir. ## Yükseltme süreci \{#upgrade-process\} Unity için yükseltme süreci diğer platformlarla aynı adımları içerir: 1. Adapty SDK v3.x sürümüne yükseltin 2. Mevcut paywall'larınızı yeni Paywall Builder'a taşıyın Unity'ye özgü ayrıntılı geçiş talimatları için lütfen [Unity SDK kurulum kılavuzuna](sdk-installation-unity) bakın ve ana geçiş kılavuzunda belirtilen genel geçiş adımlarını izleyin. --- # File: unity-migration-guide --- --- title: "SDK migrasyon rehberi" description: "Unity Adapty SDK için migrasyon rehberleri." --- ## Migrasyon Rehberleri \{#migration-guides\} ### [Unity Adapty SDK 3.x'e migrasyon rehberi](unity-sdk-migration-guides) Eski sürümlerden Unity Adapty SDK 3.x'e nasıl geçileceğini öğrenin. ## Yenilikler \{#whats-new\} ### Sürüm 3.x \{#version-3x\} - Geliştirilmiş paywall sunumu - İyileştirilmiş hata yönetimi - Daha iyi C# desteği - Performans optimizasyonları ### Sürüm 2.x \{#version-2x\} - Yeni onboarding özellikleri - Geliştirilmiş analitik - İyileştirilmiş satın alma akışı - Hata düzeltmeleri ve kararlılık iyileştirmeleri ## Kırıcı Değişiklikler \{#breaking-changes\} ### Sürüm 3.x \{#version-3x-breaking\} - Güncellenmiş observer API'ı - Değiştirilen paywall sunum metodları - Düzenlenmiş hata yönetimi yapısı ### Sürüm 2.x \{#version-2x-breaking\} - Güncellenmiş onboarding API'ı - Değiştirilen profil yapısı - Düzenlenmiş satın alma akışı ## Migrasyon Kontrol Listesi \{#migration-checklist\} Yeni bir sürüme geçerken: - [ ] Kırıcı değişiklikleri inceleyin - [ ] API çağrılarını güncelleyin - [ ] Tüm işlevselliği test edin - [ ] Hata yönetimini güncelleyin - [ ] Analitik takibini doğrulayın - [ ] Tüm platformlarda test edin --- # End of Documentation _Generated on: 2026-07-24T13:02:34.608Z_ _Successfully processed: 41/41 files_