Adapty, `AdaptySDK` isim alanını kullanır. Adapty SDK kullanan script dosyalarınızın en üstüne şunu ekleyebilirsiniz:
```csharp showLineNumbers title="C#"
using AdaptySDK;
```
Adapty olaylarına abone olun:
```csharp showLineNumbers title="C#"
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour, AdaptyEventListener {
public void OnLoadLatestProfile(AdaptyProfile profile) {
// handle updated profile data
}
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
}
```
Script Execution Order ayarını, AdaptyListener'ı Default Time'ın önüne gelecek şekilde düzenlemenizi öneririz. Bu sayede Adapty mümkün olduğunca erken başlatılır.
Şimdi uygulamanızda paywallları ayarlayın:
- [Adapty Paywall Builder](adapty-paywall-builder) kullanıyorsanız, önce aşağıdaki [AdaptyUI modülünü etkinleştirin](#activate-adaptyui-module-of-adapty-sdk), ardından [Paywall Builder hızlı başlangıç kılavuzunu](unity-quickstart-paywalls) takip edin.
- Kendi paywall arayüzünüzü oluşturuyorsanız, [özel paywall'lar için hızlı başlangıç kılavuzuna](unity-quickstart-manual) bakın.
## Adapty SDK'nın AdaptyUI modülünü etkinleştirin \{#activate-adaptyui-module-of-adapty-sdk\}
[Paywall Builder](adapty-paywall-builder) kullanmayı planlıyor ve AdaptyUI modülünü yüklediyseniz AdaptyUI'ın etkin olması gerekir. Yapılandırma sırasında etkinleştirebilirsiniz:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetActivateUI(true);
```
## İsteğe bağlı kurulum \{#optional-setup\}
### Günlük Kaydı \{#logging\}
#### Günlük kaydı sistemini kurma \{#set-up-the-logging-system\}
Adapty, ne olduğunu anlamanıza yardımcı olmak için hataları ve diğer önemli bilgileri kaydeder. Aşağıdaki düzeyler mevcuttur:
| Level | Description |
| ---------- | ------------------------------------------------------------ |
| `error` | Yalnızca hatalar loglanır |
| `warn` | Kritik hatalara yol açmayan ancak dikkat edilmesi gereken SDK hataları ve mesajları loglanır |
| `info` | Hatalar, uyarılar ve çeşitli bilgi mesajları loglanır |
| `verbose` | Hata ayıklama sırasında işe yarayabilecek her türlü ek bilgi (fonksiyon çağrıları, API sorguları vb.) loglanır |
Adapty'yi yapılandırırken uygulamanızda log seviyesini ayarlayabilirsiniz:
```csharp showLineNumbers title="C#"
// 'verbose' is recommended for development and the first production release
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY");
builder.LogLevel = AdaptyLogLevel.Verbose;
```
Log seviyesini çalışma zamanında da değiştirebilirsiniz:
```csharp showLineNumbers title="C#"
Adapty.SetLogLevel(AdaptyLogLevel.Verbose, (error) => {
// handle result
});
```
### Veri politikaları \{#data-policies\}
Adapty, açıkça göndermediğiniz sürece kullanıcılarınızın kişisel verilerini saklamaz. Ancak mağaza veya ülke yönergelerine uymak için ek veri güvenliği politikaları uygulayabilirsiniz.
#### IP adresi toplama ve paylaşmayı devre dışı bırakma \{#disable-ip-address-collection-and-sharing\}
Adapty modülünü etkinleştirirken, kullanıcı IP adresi toplama ve paylaşımını devre dışı bırakmak için `SetIPAddressCollectionDisabled` değerini `true` olarak ayarlayın. Varsayılan değer `false`'tur.
Bu parametreyi kullanıcı gizliliğini artırmak, bölgesel veri koruma düzenlemelerine (GDPR veya CCPA gibi) uymak ya da uygulamanız için IP tabanlı özellikler gerekli olmadığında gereksiz veri toplamayı azaltmak amacıyla kullanabilirsiniz.
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetIPAddressCollectionDisabled(true);
```
#### Reklam kimliği toplama ve paylaşımını devre dışı bırakma \{#disable-advertising-id-collection-and-sharing\}
Adapty modülünü etkinleştirirken, reklam tanımlayıcılarının toplanmasını devre dışı bırakmak için `SetAppleIDFACollectionDisabled` ve/veya `SetGoogleAdvertisingIdCollectionDisabled` değerini `true` olarak ayarlayın. Varsayılan değer `false`'tur.
Bu parametreyi; App Store/Google Play politikalarına uymak, App Tracking Transparency istemini tetiklemekten kaçınmak ya da uygulamanız reklam kimliklerine dayalı attribution veya analiz gerektirmiyorsa kullanın.
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleIDFACollectionDisabled(true)
.SetGoogleAdvertisingIdCollectionDisabled(true);
```
#### AdaptyUI için medya önbelleği yapılandırmasını ayarlama \{#set-up-media-cache-configuration-for-adaptyui\}
AdaptyUI, varsayılan olarak performansı artırmak ve ağ kullanımını azaltmak için medyayı (resimler ve videolar gibi) önbelleğe alır. Özel bir yapılandırma sağlayarak önbellek ayarlarını özelleştirebilirsiniz.
Varsayılan önbellek ayarlarını geçersiz kılmak için `SetAdaptyUIMediaCache` kullanın:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAdaptyUIMediaCache(
100 * 1024 * 1024, // MemoryStorageTotalCostLimit 100MB
null, // MemoryStorageCountLimit
100 * 1024 * 1024 // DiskStorageSizeLimit 100MB
);
```
Parametreler:
| Parametre | Zorunlu | Açıklama |
|-----------------------------|----------|-----------------------------------------------------------------------------------------------|
| memoryStorageTotalCostLimit | isteğe bağlı | Bellekteki toplam önbellek boyutu (bayt cinsinden). Varsayılan değer platforma göre değişir. |
| memoryStorageCountLimit | isteğe bağlı | Bellek depolamasının öğe sayısı sınırı. Varsayılan değer platforma göre değişir. |
| diskStorageSizeLimit | isteğe bağlı | Diskteki dosya boyutu sınırı (bayt cinsinden). Varsayılan değer platforma göre değişir. |
### Yerel access level'ları etkinleştirin (Android) \{#enable-local-access-levels-android\}
Varsayılan olarak [yerel access level'lar](local-access-levels) iOS'ta etkin, Android'de devre dışıdır. Android'de de etkinleştirmek için `SetGoogleLocalAccessLevelAllowed` değerini `true` olarak ayarlayın:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetGoogleLocalAccessLevelAllowed(true);
```
### Yedekten geri yüklemede veri temizleme \{#clear-data-on-backup-restore\}
`SetAppleClearDataOnBackup` `true` olarak ayarlandığında, SDK uygulamanın iCloud yedeğinden geri yüklendiğini algılar ve önbelleğe alınmış profil bilgileri, ürün ayrıntıları ve paywalllar dahil olmak üzere yerel olarak depolanan tüm SDK verilerini siler. SDK ardından temiz bir durumla başlatılır. Varsayılan değer `false`'tur.
:::note
Yalnızca yerel SDK önbelleği silinir. Apple ile olan işlem geçmişi ve Adapty sunucularındaki kullanıcı verileri değişmeden kalır.
:::
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleClearDataOnBackup(true);
```
## Sorun Giderme \{#troubleshooting\}
#### Android yedekleme kuralları (Otomatik Yedekleme yapılandırması) \{#android-backup-rules-auto-backup-configuration\}
Bazı SDK'lar (Adapty dahil) kendi Android Auto Backup yapılandırmasını içerir. Yedekleme kurallarını tanımlayan birden fazla SDK kullanıyorsanız, Android manifest birleştirme işlemi `android:fullBackupContent`, `android:dataExtractionRules` veya `android:allowBackup` ile ilgili bir hatayla başarısız olabilir.
Tipik hata belirtileri: `Manifest merger failed: Attribute application@dataExtractionRules value=(@xml/your_data_extraction_rules)
is also present at [com.other.sdk:library:1.0.0] value=(@xml/other_sdk_data_extraction_rules)`
:::note
Bu değişiklikler Android platform dizininizde yapılmalıdır (genellikle projenizin `android/` klasöründe bulunur).
:::
Sorunu çözmek için şunları yapmanız gerekir:
- Manifest birleştirme işlemine, yedeklemeyle ilgili özellikler için uygulamanızın değerlerini kullanmasını söyleyin.
- Adapty'nin kurallarını diğer SDK'ların kurallarıyla birleştiren yedekleme kuralı dosyaları oluşturun.
#### 1. Manifestinize `tools` ad alanını ekleyin \{#1-add-the-tools-namespace-to-your-manifest\}
`AndroidManifest.xml` dosyanızda, kök `
2. `/Assets/Plugins/Android/launcherTemplate.gradle` dosyasına aşağıdaki satırı ekleyin:
```groovy showLineNumbers
apply plugin: 'com.android.application'
// highlight-next-line
apply plugin: 'kotlin-android'
apply from: 'setupSymbols.gradle'
apply from: '../shared/keepUnitySymbols.gradle'
```
3. Aşağıdaki satırı `/Assets/Plugins/Android/baseProjectTemplate.gradle` dosyasına ekleyin:
```groovy showLineNumbers
plugins {
// If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
// See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
// See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
id 'com.android.application' version '8.3.0' apply false
id 'com.android.library' version '8.3.0' apply false
// highlight-next-line
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
**BUILD_SCRIPT_DEPS**
}
```
---
# File: unity-quickstart-paywalls
---
---
title: "Unity SDK'da paywall'ları kullanarak satın almaları etkinleştirme"
description: "Adapty SDK ile Unity uygulamanızda paywall'ları nasıl göstereceğinizi öğrenin."
---
Uygulama içi satın almaları etkinleştirmek için üç temel kavramı anlamanız gerekir:
- [**Ürünler**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Paywall'lar**](paywalls) – hangi ürünlerin sunulacağını tanımlayan yapılandırmalardır. Adapty'de ürünleri almanın tek yolu paywall'lardır; bu tasarım sayesinde uygulama kodunuza dokunmadan teklifleri, fiyatlandırmayı ve ürün kombinasyonlarını değiştirebilirsiniz.
- [**Placement'lar**](placements) – uygulamanızda paywall'ları nerede ve ne zaman göstereceğiniz (`main`, `onboarding`, `settings` gibi). Kontrol panelinde placement'lar için paywall'lar ayarlarsınız, ardından kodunuzda placement ID'siyle bunları talep edersiniz. Bu yapı, A/B testleri çalıştırmayı ve farklı kullanıcılara farklı paywall'lar göstermeyi kolaylaştırır.
Adapty, uygulamanızda satın almaları etkinleştirmek için üç yöntem sunar. Uygulama gereksinimlerinize göre birini seçin:
| Uygulama | Karmaşıklık | Ne zaman kullanılır |
|------------------------------|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Adapty Paywall Builder | ✅ Kolay | [No-code builder'da eksiksiz, satın almaya hazır bir paywall oluşturursunuz](quickstart-paywalls). Adapty bunu otomatik olarak render eder ve tüm satın alma akışını, makbuz doğrulamasını ve abonelik yönetimini arka planda halleder. |
| Elle oluşturulan paywall'lar | 🟡 Orta | Paywall arayüzünüzü uygulama kodunuzda siz uygularsınız; ancak ürün tekliflerinde esnekliği korumak için paywall nesnesini yine de Adapty'den alırsınız. [Kılavuza](unity-quickstart-manual) bakın. |
| Observer modu | 🔴 Zor | Kendi satın alma altyapınız zaten var ve onu kullanmaya devam etmek istiyorsunuz. Observer modunun Adapty'de bazı sınırlamaları olduğunu unutmayın. [Makaleye](observer-vs-full-mode) bakın. |
:::important
**Aşağıdaki adımlar, Adapty paywall builder'da oluşturulan bir paywall'ın nasıl uygulanacağını göstermektedir.**
Paywall builder'ı kullanmak istemiyorsanız [elle oluşturulan paywall'larda satın almaları yönetme kılavuzuna](unity-making-purchases) bakın.
:::
Adapty paywall builder'da oluşturulmuş bir paywall'ı göstermek için uygulama kodunuzda yalnızca şunları yapmanız yeterlidir:
1. **Paywall'ı alın**: Paywall'ı Adapty'den alın.
2. **Paywall'ı gösterin, satın almaları Adapty halleder**: Uygulamanızda aldığınız paywall container'ını gösterin.
3. **Buton eylemlerini yönetin**: Kullanıcıların paywall ile etkileşimlerini uygulamanızın yanıtlarıyla ilişkilendirin. Örneğin, kullanıcılar butonlara tıkladığında bağlantılar açın veya paywall'ı kapatın.
## Başlamadan önce \{#before-you-start\}
Başlamadan önce şu adımları tamamlayın:
1. Uygulamanızı Adapty Kontrol Paneli'nde [App Store](initial_ios) ve/veya [Google Play](initial-android)'e bağlayın.
2. Adapty'de [ürünlerinizi oluşturun](create-product).
3. [Bir paywall oluşturun ve ürünleri ekleyin](create-paywall).
4. [Bir placement oluşturun ve paywall'ınızı ekleyin](create-placement).
5. Uygulama kodunuzda [Adapty SDK'yı yükleyin ve etkinleştirin](sdk-installation-unity).
:::tip
Bu adımları tamamlamanın en hızlı yolu [hızlı başlangıç kılavuzunu](quickstart) takip etmek ya da [Developer CLI](developer-cli-quickstart) kullanarak paywall'lar ve placement'lar oluşturmaktır.
:::
## 1. Paywall'ı alın \{#1-get-the-paywall\}
Paywall'larınız, kontrol panelinde yapılandırılmış placement'larla ilişkilidir. Placement'lar, farklı kitleler için farklı paywall'lar çalıştırmanıza ya da [A/B testleri](ab-tests) yapmanıza olanak tanır.
Adapty paywall builder'da oluşturulmuş bir paywall almak için şunları yapmanız gerekir:
1. `GetPaywall` metodunu kullanarak [placement](placements) ID'sine göre `paywall` nesnesini alın ve `HasViewConfiguration` özelliğini kontrol ederek builder'da oluşturulmuş bir paywall olup olmadığını doğrulayın.
2. `CreatePaywallView` metodunu kullanarak paywall görünümünü oluşturun. Görünüm, paywall'ı göstermek için gereken UI öğelerini ve stilleri içerir.
:::important
Görünüm yapılandırmasını alabilmek için Paywall Builder'da **Show on device** geçişini açmanız gerekir. Aksi takdirde boş bir görünüm yapılandırması alırsınız ve paywall gösterilmez.
:::
```csharp showLineNumbers
Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => {
if(error != null) {
// handle the error
return;
}
// Create paywall view parameters
var parameters = new AdaptyUICreatePaywallViewParameters();
// Create the paywall view
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if(error != null) {
// handle the error
return;
}
// view - the paywall view ready to be presented
});
});
```
:::info
Bu hızlı başlangıç, bir paywall'ı göstermek için gereken minimum yapılandırmayı sağlar. Gelişmiş yapılandırma ayrıntıları için [paywall alma kılavuzumuza](unity-get-pb-paywalls) bakın.
:::
## 2. Paywall'ı gösterin \{#2-display-the-paywall\}
Paywall yapılandırmasına sahip olduğunuzda, paywall'ınızı göstermek için birkaç satır kod eklemeniz yeterlidir.
Paywall'ı göstermek için `CreatePaywallView` metoduyla oluşturulan `view` üzerinde `view.Present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Paywall'ı tekrar göstermeniz gerekiyorsa yeni bir `view` örneği oluşturmak için `CreatePaywallView`'u tekrar çağırın.
```csharp showLineNumbers title="Unity"
view.Present((error) => {
// handle the error
});
```
:::info
Paywall'ın nasıl gösterileceğine dair daha fazla ayrıntı için [kılavuzumuza](unity-present-paywalls) bakın.
:::
## 3. Buton eylemlerini yönetin \{#3-handle-button-actions\}
Kullanıcılar paywall'daki butonlara tıkladığında Unity SDK, satın almaları ve geri yüklemeleri otomatik olarak işler. Ancak diğer butonların özel veya önceden tanımlanmış ID'leri vardır ve kodunuzda eylem yönetimi gerektirir.
Örneğin paywall'ınızda büyük olasılıkla bir kapat butonu ve açılacak URL'ler (kullanım koşulları ve gizlilik politikası gibi) bulunur. Bu eylemleri yönetmek için sınıfınızın `AdaptyPaywallsEventsListener` arayüzünü uygulaması ve bir dinleyici olarak kaydedilmesi gerekir.
:::tip
Buton [eylemlerini](unity-handle-paywall-actions) ve [olayları](unity-handling-events) nasıl yöneteceğinize dair kılavuzlarımızı okuyun.
:::
```csharp showLineNumbers title="Unity"
public class YourClass : MonoBehaviour, AdaptyPaywallsEventsListener
{
void Start()
{
// Register this class as the paywall events listener
Adapty.SetPaywallsEventsListener(this);
}
// AdaptyPaywallsEventsListener method - handles button actions
public void PaywallViewDidPerformAction(
AdaptyUIPaywallView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
Application.OpenURL(action.Value);
break;
default:
break;
}
}
}
```
## Sonraki adımlar \{#next-steps\}
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
Paywall'ınız uygulamada gösterilmeye hazır. Paywall üzerinden bir test satın alması tamamlayabildiğinizden emin olmak için [App Store sandbox](test-purchases-in-sandbox) veya [Google Play Store](testing-on-android) üzerinde satın almalarınızı test edin.
Artık doğru kullanıcılara paywall gösterdiğinizden veya ücretli özelliklere erişim verdiğinizden emin olmak için [kullanıcıların access level'ını kontrol etmeniz](unity-check-subscription-status) gerekir.
## Tam örnek \{#full-example\}
Tüm bu adımların uygulamanızda birlikte nasıl entegre edilebileceğini aşağıda görebilirsiniz.
```csharp showLineNumbers
using System;
using UnityEngine;
using AdaptySDK;
public class PaywallManager : MonoBehaviour, AdaptyPaywallsEventsListener
{
[SerializeField] private string placementId = "YOUR_PLACEMENT_ID";
private AdaptyUIPaywallView currentPaywallView;
void Start()
{
// Register for paywall events
Adapty.SetPaywallsEventsListener(this);
GetAndDisplayPaywall();
}
private void GetAndDisplayPaywall()
{
Adapty.GetPaywall(placementId, (paywall, error) => {
if (error != null) {
Debug.LogError("Error getting paywall: " + error.Message);
return;
}
if (paywall.HasViewConfiguration) {
CreateAndPresentPaywallView(paywall);
} else {
Debug.LogWarning("Paywall was not created using the builder");
}
});
}
private void CreateAndPresentPaywallView(AdaptyPaywall paywall)
{
var parameters = new AdaptyUICreatePaywallViewParameters();
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if (error != null) {
Debug.LogError("Error creating paywall view: " + error.Message);
return;
}
currentPaywallView = view;
view.Present((presentError) => {
if (presentError != null) {
Debug.LogError("Error presenting paywall: " + presentError.Message);
return;
}
Debug.Log("Paywall presented successfully");
});
});
}
// AdaptyPaywallsEventsListener implementation
public void PaywallViewDidPerformAction(
AdaptyUIPaywallView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
Debug.Log("Close button pressed");
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
Application.OpenURL(action.Value);
break;
default:
break;
}
}
// Required interface methods (implement as needed)
public void PaywallViewDidAppear(AdaptyUIPaywallView view) { }
public void PaywallViewDidDisappear(AdaptyUIPaywallView view) { }
public void PaywallViewDidSelectProduct(AdaptyUIPaywallView view, string productId) { }
public void PaywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) { }
public void PaywallViewDidFinishPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyPurchaseResult purchasedResult) { }
public void PaywallViewDidFailPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void PaywallViewDidStartRestore(AdaptyUIPaywallView view) { }
public void PaywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) { }
public void PaywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void ShowPaywall()
{
GetAndDisplayPaywall();
}
void OnDestroy()
{
if (currentPaywallView != null) {
currentPaywallView.Dismiss(null);
}
}
}
```
---
# File: unity-check-subscription-status
---
---
title: "Unity SDK'da abonelik durumunu kontrol etme"
description: "Adapty ile Unity uygulamanızda abonelik durumunu nasıl kontrol edeceğinizi öğrenin."
---
Kullanıcıların ücretli içeriklere erişip erişemeyeceğine ya da bir paywall görmesi gerekip gerekmediğine karar vermek için profildeki [access level](access-level) değerini kontrol etmeniz gerekir.
Bu makalede, kullanıcılara paywall mı göstereceğinizi yoksa ücretli özelliklere erişim mi vereceğinizi belirlemek amacıyla profil durumuna nasıl erişeceğiniz anlatılmaktadır.
## Abonelik durumunu alma \{#get-subscription-status\}
Bir kullanıcıya paywall mı yoksa ücretli içerik mi göstereceğinize karar verirken, profildeki [access level](access-level) değerini kontrol edersiniz. İki seçeneğiniz var:
- En güncel profil verilerine hemen ihtiyaç duyduğunuzda (örneğin uygulama başlangıcında) veya güncellemeyi zorlamak istediğinizde `GetProfile` çağırın.
- Abonelik durumu her değiştiğinde otomatik olarak yenilenen yerel bir kopya tutmak için **otomatik profil güncellemelerini** ayarlayın.
### Profili alma \{#get-profile\}
Abonelik durumunu almanın en kolay yolu, profile erişmek için `GetProfile` metodunu kullanmaktır:
```csharp showLineNumbers
Adapty.GetProfile((profile, error) => {
if (error != null) {
// handle the error
return;
}
// check the access
});
```
### Abonelik güncellemelerini dinleme \{#listen-to-subscription-updates\}
Uygulamanızda profil güncellemelerini otomatik olarak almak için:
1. `AdaptyEventListener` sınıfını genişletin ve `OnLoadLatestProfile` metodunu uygulayın. Adapty, kullanıcının abonelik durumu her değiştiğinde bu metodu otomatik olarak çağırır.
2. Bu metot çağrıldığında güncellenen profil verilerini saklayın; böylece ek ağ istekleri yapmadan uygulamanızın her yerinde kullanabilirsiniz.
```csharp
public class SubscriptionManager : MonoBehaviour, AdaptyEventListener {
private AdaptyProfile currentProfile;
void Start() {
// Register this object as an Adapty event listener
Adapty.SetEventListener(this);
}
// Store the profile when it updates
public void OnLoadLatestProfile(AdaptyProfile profile) {
currentProfile = profile;
// Update UI, unlock content, etc.
}
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
// Use stored profile instead of calling getProfile()
public bool HasAccess() {
if (currentProfile?.AccessLevels != null &&
currentProfile.AccessLevels.ContainsKey("premium")) {
return currentProfile.AccessLevels["premium"].IsActive;
}
return false;
}
}
```
:::note
Adapty, uygulamanız başladığında `OnLoadLatestProfile`'ı otomatik olarak çağırır; bu sayede cihaz çevrimdışı olsa bile önbelleğe alınmış abonelik verileri sağlanır.
:::
## Profili paywall mantığıyla bağlama \{#connect-profile-with-paywall-logic\}
Paywall gösterme veya ücretli özelliklere erişim verme konusunda anlık kararlar almanız gerektiğinde, kullanıcının profilini doğrudan kontrol edebilirsiniz. Bu yaklaşım; uygulama başlangıcı, premium bölümlere girerken veya belirli içerikleri görüntülemeden önce gibi senaryolarda işe yarar.
```csharp
private void CheckAccessLevel()
{
Adapty.GetProfile((profile, error) => {
if (error != null) {
Debug.LogError("Error checking access level: " + error.Message);
// Show paywall if access check fails
return;
}
var accessLevel = profile.AccessLevels["YOUR_ACCESS_LEVEL"];
if (accessLevel == null || !accessLevel.IsActive) {
// Show paywall if no access
}
});
}
private void InitializePaywall()
{
LoadPaywall();
CheckAccessLevel();
}
```
## Sonraki adımlar \{#next-steps\}
Abonelik durumunu nasıl takip edeceğinizi öğrendiğinize göre, kullanıcıların ödedikleri şeylere erişebildiğinden emin olmak için [kullanıcı profilleriyle çalışmayı](unity-quickstart-identify) öğrenin.
---
# File: unity-quickstart-identify
---
---
title: "Unity SDK'da kullanıcıları tanımlama"
description: "Unity'de uygulama içi abonelik yönetimi için Adapty kurulum hızlı başlangıç kılavuzu."
---
:::important
Bu kılavuz, kendi kimlik doğrulama sisteminiz varsa size yöneliktir. Burada, mevcut kimlik doğrulama sisteminizle uyumlu olacak şekilde Adapty'deki kullanıcı profilleriyle nasıl çalışacağınızı öğreneceksiniz.
:::
Kullanıcıların satın almalarını nasıl yöneteceğiniz, uygulamanızın kimlik doğrulama modeline bağlıdır:
- Uygulamanız arka uç kimlik doğrulaması kullanmıyorsa ve kullanıcı verilerini depolamıyorsa, [anonim kullanıcılar bölümüne](#anonymous-users) bakın.
- Uygulamanızın arka uç kimlik doğrulaması varsa (veya olacaksa), [tanımlı kullanıcılar bölümüne](#identified-users) bakın.
**Temel kavramlar**:
- **Profiller**, SDK'nın çalışması için gereken varlıklardır. Adapty bunları otomatik olarak oluşturur.
- Anonim **(customer user ID olmadan)** veya tanımlı **(customer user ID ile)** olabilirler.
- Adapty'deki profilleri kendi dahili kimlik doğrulama sisteminizle çapraz referanslamak için **customer user ID** sağlarsınız.
Anonim ve tanımlı kullanıcılar arasındaki farklar şunlardır:
| | Anonim kullanıcılar | Tanımlı kullanıcılar |
|-------------------------|-------------------------------------------------------|----------------------------------------------------------------------------------|
| **Satın alma yönetimi** | Mağaza düzeyinde satın alma geri yükleme | Customer user ID aracılığıyla cihazlar arası satın alma geçmişini koruma |
| **Profil yönetimi** | Her yeniden yüklemede yeni profil | Oturumlar ve cihazlar arasında aynı profil |
| **Veri kalıcılığı** | Anonim kullanıcı verisi uygulama kurulumuna bağlıdır | Tanımlı kullanıcı verisi uygulama kurulumları arasında kalıcıdır |
## Anonim kullanıcılar \{#anonymous-users\}
Arka uç kimlik doğrulamanız yoksa, **uygulama kodunda kimlik doğrulamayı yönetmenize gerek yoktur**:
1. SDK, uygulamanın ilk açılışında etkinleştirildiğinde, Adapty **kullanıcı için yeni bir profil oluşturur**.
2. Kullanıcı uygulamada bir şey satın aldığında, bu satın alma **Adapty profili ve mağaza hesabıyla ilişkilendirilir**.
3. Kullanıcı uygulamayı **yeniden yüklediğinde** veya **yeni bir cihazdan** yüklediğinde, Adapty **etkinleştirmede yeni bir anonim profil oluşturur**.
4. Kullanıcı daha önce uygulamanızda satın alma yapmışsa, varsayılan olarak satın almalar SDK etkinleştirmesinde App Store'dan otomatik olarak senkronize edilir.
Yani anonim kullanıcılarla her kurulumda yeni profil oluşturulur; ancak bu bir sorun değildir çünkü Adapty analizlerinde [yeni kurulum olarak neyin sayılacağını yapılandırabilirsiniz](general#4-installs-definition-for-analytics).
Anonim kullanıcılar için kurulumları **cihaz ID'lerine** göre saymanız gerekir. Bu durumda, yeniden yüklemeler dahil olmak üzere bir cihazdaki her uygulama kurulumu bir yükleme olarak sayılır.
## Tanımlı kullanıcılar \{#identified-users\}
Uygulamadaki kullanıcıları tanımlamak için iki seçeneğiniz var:
- [**Giriş/kayıt sırasında:**](#during-loginsignup) Kullanıcılar uygulamanız başladıktan sonra oturum açıyorsa, kimlik doğruladıklarında customer user ID ile `identify()` çağrısı yapın.
- [**SDK etkinleştirmesi sırasında:**](#during-the-sdk-activation) Uygulama başlatılırken zaten bir customer user ID'niz varsa, `activate()` çağrısı yaparken bunu gönderin.
:::important
Varsayılan olarak, Adapty şu anda başka bir Customer User ID ile ilişkilendirilmiş bir Customer User ID'den satın alma aldığında, access level paylaşılır; yani her iki profil de ücretli erişime sahip olur. Bu ayarı, ücretli erişimi bir profilden diğerine aktaracak veya paylaşımı tamamen devre dışı bırakacak şekilde yapılandırabilirsiniz. Ayrıntılar için [makaleye](general#6-sharing-paid-access-between-user-accounts) bakın.
:::
### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin, uygulamanıza giriş yaptıktan veya kaydolduktan sonra), customer user ID'yi ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty bunu otomatik olarak mevcut profille ilişkilendirir.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı kimlikleri her kullanıcı için benzersiz olmalıdır. Parametre değerini sabit kodlarsanız, tüm kullanıcılar tek bir kullanıcı olarak değerlendirilir.
:::
Diğer SDK metodlarını çağırmadan önce `Identify` tamamlanma callback'ini bekleyin. Eş zamanlı çağrılar `#3006 profileWasChanged` hatasına yol açar veya anonim profile düşer. Bkz. [Unity SDK'da çağrı sırası](unity-sdk-call-order).
```csharp showLineNumbers
Adapty.Identify("YOUR_USER_ID", (error) => { // Unique for each user
if(error == null) {
// successful identify
}
});
```
### SDK etkinleştirmesi sırasında \{#during-the-sdk-activation\}
SDK'yı etkinleştirdiğinizde zaten bir customer user ID biliyorsanız, ayrıca `identify` çağrısı yapmak yerine bunu `activate` metodunda gönderebilirsiniz.
Customer user ID bilseniz de bunu yalnızca etkinleştirmeden sonra ayarlarsanız, etkinleştirmede Adapty yeni bir anonim profil oluşturur ve yalnızca `identify` çağrısı yaptıktan sonra mevcut profile geçer.
Mevcut bir customer user ID (daha önce kullandığınız) veya yeni bir tane geçirebilirsiniz. Yeni bir tane geçirirseniz, etkinleştirmede oluşturulan yeni profil otomatik olarak customer user ID ile ilişkilendirilir.
:::note
Varsayılan olarak, anonim profil oluşturma analiz kontrol panellerini etkilemez; çünkü kurulumlar cihaz ID'lerine göre sayılır.
Cihaz ID'si, bir cihazda mağazadan yapılan tek bir uygulama kurulumunu temsil eder ve yalnızca uygulama yeniden yüklendikten sonra yeniden oluşturulur.
Bu, birinci veya tekrar kurulum olup olmadığına ya da mevcut bir customer user ID kullanılıp kullanılmadığına bağlı değildir.
Profil oluşturma (SDK etkinleştirmesinde veya çıkışta), oturum açma veya uygulamayı yeniden yüklemeden yükseltme ek kurulum olayı oluşturmaz.
Kurulumları cihazlar yerine benzersiz kullanıcılara göre saymak istiyorsanız, **App settings** bölümüne gidip [**Installs definition for analytics**](general#4-installs-definition-for-analytics) ayarını yapılandırın.
:::
```csharp showLineNumbers
using UnityEngine;
using AdaptySDK;
var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY")
.SetCustomerUserId("YOUR_USER_ID"); // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
Adapty.Activate(builder.Build(), (error) => {
if (error != null) {
// handle the error
return;
}
});
```
### Kullanıcı çıkışı \{#log-users-out\}
Kullanıcıların çıkış yapması için bir butonunuz varsa, `logout` metodunu kullanın.
:::important
Kullanıcı çıkışı, kullanıcı için yeni bir anonim profil oluşturur.
:::
```csharp showLineNumbers
Adapty.Logout((error) => {
if(error == null) {
// successful logout
}
});
```
:::info
Kullanıcıları tekrar uygulamaya giriş yaptırmak için `identify` metodunu kullanın.
:::
### Girişsiz satın almalara izin verme \{#allow-purchases-without-login\}
Kullanıcılarınız uygulamanıza giriş yapmadan önce ve sonra satın alma yapabiliyorsa, giriş yaptıktan sonra erişimlerini koruduğunuzdan emin olmanız gerekir:
1. Çıkış yapmış bir kullanıcı satın alma yaptığında, Adapty bunu anonim profil ID'siyle ilişkilendirir.
2. Kullanıcı hesabına giriş yaptığında, Adapty tanımlı profiliyle çalışmaya geçer.
- Yeni bir customer user ID ise (örneğin, satın alma kayıt öncesinde yapılmışsa), Adapty customer user ID'yi mevcut profile atar; böylece tüm satın alma geçmişi korunur.
- Mevcut bir customer user ID ise (customer user ID zaten bir profile bağlıysa), profil geçişinden sonra gerçek access level'ı almanız gerekir. Tanımlamadan hemen sonra [`getProfile`](unity-check-subscription-status) çağrısı yapabilir veya veriler otomatik senkronize olması için [profil güncellemelerini dinleyebilirsiniz](unity-check-subscription-status).
## Sonraki adımlar \{#next-steps\}
Tebrikler! Uygulamanızda uygulama içi ödeme mantığını hayata geçirdiniz! Uygulamanızın gelirini artırmanızı diliyoruz!
Adapty'den daha fazla yararlanmak için şu konuları inceleyebilirsiniz:
- [**Test etme**](troubleshooting-test-purchases): Her şeyin beklendiği gibi çalıştığından emin olun
- [**Onboardings**](onboardings): Onboarding'lerle kullanıcıları etkileyin ve elde tutmayı artırın
- [**Entegrasyonlar**](configuration): Tek satır kodla pazarlama attribution ve analiz hizmetleriyle entegre edin
- [**Özel profil öznitelikleri ayarlama**](unity-setting-user-attributes): Kullanıcı profillerine özel öznitelikler ekleyin ve segmentler oluşturun; böylece A/B testleri başlatabilir veya farklı kullanıcılara farklı paywall'lar gösterebilirsiniz
---
# File: adapty-sdk-integration-skill-unity
---
---
title: "SDK entegrasyon skill'i ile Adapty'yi Unity uygulamanıza entegre edin"
description: "Adapty SDK'yı AI kodlama aracınızla Unity uygulamanıza uçtan uca entegre etmek için adapty-sdk-integration skill'ini kullanın."
---
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
:::important
Bu özellik beta aşamasındadır. Takılı kalır veya beklenmedik şekilde davranırsa, [adım adım entegrasyon kılavuzunu](adapty-cursor-unity) takip edin — AI aracınıza her aşamayı doğru belgelerle adım adım anlatır.
:::
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
---
# File: adapty-cursor-unity
---
---
title: "Adapty'yi Unity uygulamanıza yapay zeka yardımıyla entegre edin"
description: "Cursor, Context7, ChatGPT, Claude veya diğer yapay zeka araçlarını kullanarak Adapty'yi Unity uygulamanıza entegre etmek için adım adım kılavuz."
---
Bu kılavuz, bir AI kodlama aracıyla Unity uygulamanıza Adapty'yi adım adım entegre etme sürecini anlatır — doğru Adapty dökümanlarını doğru sırayla besleyerek ilerlersiniz.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Başlamadan önce: kontrol paneli kurulumu \{#before-you-start-dashboard-setup\}
Adapty, herhangi bir SDK kodu yazmadan önce kontrol panelinde bazı ayarların yapılmasını gerektirir. Bunu etkileşimli bir LLM aracıyla ya da Kontrol Paneli üzerinden manuel olarak yapabilirsiniz.
### Skill yaklaşımı (önerilen) \{#skill-approach-recommended\}
Adapty CLI skill'i, LLM'inizin uygulamanızı, ürünlerinizi, access level'larınızı, paywall'larınızı ve placement'larınızı doğrudan kurmasını sağlar — her adım için kontrol panelini açmanıza gerek kalmaz. Yalnızca kontrol panelinde [mağazalarınızı bağlamanız](integrate-payments) yeterlidir.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Skill eklendikten sonra, agent'ınızda `/adapty-cli` komutunu çalıştırın. Mağazalarınızı bağlamak için kontrol panelini ne zaman açmanız gerektiği de dahil olmak üzere her adımda sizi yönlendirecektir.
### Kontrol paneli yaklaşımı \{#dashboard-approach\}
Her şeyi manuel olarak yapılandırmayı tercih ediyorsanız, herhangi bir kod yazmadan önce bunlara ihtiyacınız olacak. LLM'niz kontrol paneli değerlerini sizin için arayamaz — bunları kendiniz sağlamanız gerekir.
1. **Uygulama mağazalarınızı bağlayın**: Adapty Kontrol Paneli'nde **App settings → General** bölümüne gidin. Unity uygulamanız her iki platformu da hedefliyorsa hem App Store'u hem de Google Play'i bağlayın. Bu, satın alımların çalışması için gereklidir.
[Uygulama mağazalarını bağlayın](integrate-payments)
2. **Public SDK anahtarınızı kopyalayın**: Adapty Kontrol Paneli'nde **App settings → General** sayfasına gidin, ardından **API keys** bölümünü bulun. Kodda, bu Adapty yapılandırma builder'ına geçirdiğiniz string'dir.
3. **En az bir ürün oluşturun**: Adapty Kontrol Paneli'nde **Products** sayfasına gidin. Ürünlere kodda doğrudan başvurmazsınız — Adapty bunları paywall'lar aracılığıyla iletir.
[Ürün ekle](quickstart-products)
4. **Bir paywall ve placement oluşturun**: Adapty Kontrol Paneli'nde **Paywalls** sayfasında bir paywall oluşturun, ardından bunu **Placements** sayfasında bir placement'a atayın. Kodda, placement ID'si `Adapty.GetPaywall("YOUR_PLACEMENT_ID")` çağrısına ilettiğiniz string'dir.
[Paywall oluştur](quickstart-paywalls)
5. **Access level'ları ayarlayın**: Adapty Kontrol Paneli'nde, **Products** sayfasında ürün bazında yapılandırın. Kodda, `profile.AccessLevels["premium"]?.IsActive` içinde kontrol edilen string'dir. Varsayılan `premium` access level çoğu uygulama için yeterlidir. Ödeme yapan kullanıcılar ürüne göre farklı özelliklere erişiyorsa (örneğin `basic` plan ile `pro` plan), kodlamaya başlamadan önce [ek access level'lar oluşturun](assigning-access-level-to-a-product).
:::tip
Beşini de tamamladığınızda kod yazmaya hazırsınız. LLM'inize şunu söyleyin: "Public SDK anahtarım X, placement ID'm Y" — böylece doğru başlatma ve paywall çekme kodunu üretebilir.
:::
### Hazır olduğunuzda kurulum \{#set-up-when-ready\}
Bunlar kodlamaya başlamak için zorunlu değildir, ancak entegrasyonunuz olgunlaştıkça bunlara ihtiyaç duyacaksınız:
- **A/B testleri**: **Placements** sayfasından yapılandırın. Kod değişikliği gerekmez.
[A/B testleri](ab-tests)
- **Ek paywall'lar ve placement'lar**: Farklı placement ID'leriyle daha fazla `GetPaywall` çağrısı ekleyin.
- **Analitik entegrasyonları**: **Integrations** sayfasından yapılandırın. Kurulum entegrasyona göre değişir. Bkz. [analitik entegrasyonları](analytics-integration) ve [attribution entegrasyonları](attribution-integration).
## LLM'inize Adapty Dokümanlarını Besleyin \{#feed-adapty-docs-to-your-llm\}
### Context7'yi Kullanın (önerilen)
[Context7](https://context7.com), LLM'inizin güncel Adapty belgelerine doğrudan erişmesini sağlayan bir MCP sunucusudur. LLM, ne sorduğunuza göre doğru belgeleri otomatik olarak getirir — manuel URL yapıştırmaya gerek yoktur.
Context7; **Cursor**, **Claude Code**, **Windsurf** ve diğer MCP uyumlu araçlarla çalışır. Kurulum için şunu çalıştırın:
```
npx ctx7 setup
```
Bu komut, editörünüzü algılar ve Context7 sunucusunu yapılandırır. Manuel kurulum için [Context7 GitHub deposuna](https://github.com/upstash/context7) bakın.
Yapılandırıldıktan sonra, Adapty kütüphanesine prompt'larınızda referans verin:
```
Use the adaptyteam/adapty-docs library to look up how to install the Unity SDK
```
:::warning
Context7, belge bağlantılarını manuel olarak yapıştırma ihtiyacını ortadan kaldırsa da uygulama sırası önemlidir. Her şeyin doğru çalıştığından emin olmak için aşağıdaki [uygulama adımlarını](#implementation-walkthrough) sırayla takip edin.
:::
### Düz metin dokümanları kullanın \{#use-plain-text-docs\}
Her Adapty dokümanına düz metin Markdown olarak erişebilirsiniz. URL'nin sonuna `.md` ekleyin ya da makale başlığının altındaki **Copy for LLM** butonuna tıklayın. Örneğin: [adapty-cursor-unity.md](https://adapty.io/docs/tr/adapty-cursor-unity.md).
Aşağıdaki [uygulama adım adım rehberi](#implementation-walkthrough)'nin her aşamasında, yapıştırabileceğiniz `.md` bağlantılarıyla birlikte "Send this to your LLM" bloğu yer almaktadır.
Aynı anda daha fazla doküman için aşağıdaki [indeks dosyaları ve platforma özel alt kümelerine](#plain-text-doc-index-files) bakın.
## Uygulama adım adım \{#implementation-walkthrough\}
Bu kılavuzun geri kalanı, Adapty entegrasyonunu uygulama sırasına göre ele alır. Her aşamada LLM'inize gönderebileceğiniz dokümanlar, tamamlandığında görmeniz gerekenler ve sık karşılaşılan sorunlar yer alır.
### Entegrasyonunuzu Planlayın \{#plan-your-integration\}
Koda geçmeden önce, LLM'inizden projenizi analiz etmesini ve bir uygulama planı oluşturmasını isteyin. AI aracınız bir planlama modunu destekliyorsa (Cursor'ın veya Claude Code'un plan modu gibi), LLM'in herhangi bir kod yazmadan önce hem proje yapınızı hem de Adapty dokümanlarını okuyabilmesi için bunu kullanın.
LLM'inize satın alma işlemleri için hangi yaklaşımı kullandığınızı söyleyin — bu, takip etmesi gereken kılavuzları etkiler:
- [**Adapty Paywall Builder**](adapty-paywall-builder): Adapty'nin no-code builder'ında paywall'lar oluşturursunuz ve SDK bunları otomatik olarak render eder.
- [**Manuel oluşturulan paywall'lar**](unity-making-purchases): Kendi paywall arayüzünüzü kodla oluşturursunuz ancak ürünleri çekmek ve satın almaları yönetmek için Adapty'yi kullanmaya devam edersiniz.
- [**Observer mode**](observer-vs-full-mode): Mevcut satın alma altyapınızı korur ve Adapty'yi yalnızca analitik ve entegrasyonlar için kullanırsınız.
Hangisini seçeceğinizden emin değil misiniz? [Hızlı başlangıçtaki karşılaştırma tablosunu](unity-quickstart-paywalls) okuyun.
### SDK'yı Yükleyin ve Yapılandırın \{#install-and-configure-the-sdk\}
Adapty SDK paketini Unity Package Manager aracılığıyla ekleyin ve Public SDK anahtarınızla etkinleştirin. Bu, temel adımdır — diğer hiçbir şey bu olmadan çalışmaz.
**Rehber:** [Adapty SDK'yı yükleyin ve yapılandırın](sdk-installation-unity)
Bunu LLM'inize gönderin:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/tr/sdk-installation-unity.md
```
:::tip[Checkpoint]
- **Beklenen:** Proje derleniyor ve çalışıyor. Unity Console, Adapty aktivasyon logunu gösteriyor.
- **Dikkat:** "Public API key is missing" → **App settings** bölümünden gerçek anahtarınızı kopyalayıp placeholder'ın yerine yapıştırdığınızı kontrol edin.
:::
### Paywall'ları göster ve satın almaları yönet \{#show-paywalls-and-handle-purchases\}
Placement ID'sine göre bir paywall getir, görüntüle ve satın alma olaylarını yönet. İhtiyacınız olan kılavuzlar, satın almaları nasıl yönettiğinize bağlıdır.
Her satın almayı ilerledikçe sandbox'ta test et — sona kadar bekleme. Kurulum talimatları için [Sandbox'ta satın alma testi](test-purchases-in-sandbox) bölümüne bakın.
isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olması beklenir. İlk alt etiket dil, ikincisi ise bölge içindir.
Örnek: `en` İngilizce, `pt-br` ise Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, mevcut olması halinde önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri deneyimler. Önbellek düzenli aralıklarla güncellenir, dolayısıyla ağ isteklerini azaltmak amacıyla oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını; yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Paywall'ları daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman paywall'larınızın en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün kimliklerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer birçok özelliği içeren bir [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesi. | ## Paywall Builder ile tasarlanan paywall'un görünüm yapılandırmasını getirin \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall Builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse görünüm yapılandırması getirilemez. ::: Paywall'u getirdikten sonra, Paywall Builder kullanılarak oluşturulduğunu gösteren bir `ViewConfiguration` içerip içermediğini kontrol edin. Bu bilgi, paywall'u nasıl görüntüleyeceğinizi belirler. `ViewConfiguration` mevcutsa Paywall Builder paywall'u olarak ele alın; yoksa [remote config paywall olarak işleyin](present-remote-config-paywalls-unity). Unity SDK'da, görünüm yapılandırmasını manuel olarak önceden getirmeye gerek kalmadan doğrudan `CreatePaywallView` metodunu çağırın. :::warning `CreatePaywallView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa `CreatePaywallView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers var parameters = new AdaptyUICreatePaywallViewParameters() .SetPreloadProducts(preloadProducts) .SetLoadTimeout(new TimeSpan(0, 0, 3)); AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => { // handle the result }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------ | :------------- | :----------------------------------------------------------- | | **paywall** | zorunlu | İstenen paywall için bir controller edinmek amacıyla kullanılan `AdaptyPaywall` nesnesi. | | **loadTimeout** | varsayılan: 5 sn | Bu yöntem için zaman aşımı sınırını belirler. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür. Arka planda farklı isteklerden oluşabileceğinden, bu yöntem nadir durumlarda `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabilir. | | **PreloadProducts** | isteğe bağlı | Ekranda ürünlerin görüntülenme süresini optimize etmek için bir `AdaptyPaywallProducts` dizisi sağlayın. `nil` geçilirse AdaptyUI gerekli ürünleri otomatik olarak getirir. | | **CustomTags** | isteğe bağlı | Özel etiketlerin ve çözümlenmiş değerlerinin bir sözlüğünü tanımlayın. Özel etiketler, paywall içeriğinde yer tutucu olarak işlev görür; paywall içinde kişiselleştirilmiş içerik sunmak için belirli dizelerle dinamik olarak değiştirilirler. Daha fazla ayrıntı için Paywall Builder'da özel etiketler konusuna bakın. | | **CustomTimers** | isteğe bağlı | Özel zamanlayıcıların ve bitiş tarihlerinin bir sözlüğünü tanımlayın. Özel zamanlayıcılar, paywallınızda geri sayım sayaçları görüntülemenizi sağlar. | :::note Birden fazla dil kullanıyorsanız, [Paywall Builder yerelleştirmesi eklemeyi](add-paywall-locale-in-adapty-paywall-builder) ve yerel ayar kodlarını doğru kullanmayı [buradan](localizations-and-locale-codes) öğrenebilirsiniz. ::: Görünümü elde ettikten sonra, [paywallı gösterin](unity-present-paywalls). ## Varlıkları özelleştirme \{#customize-assets\} Paywallınızdaki görüntü ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görüntü ve videoların önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leriyle hedefleyerek davranışlarını özelleştirirsiniz. Diğer görüntü ve videolar için Adapty kontrol panelinde [özel bir ID belirlemeniz](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görüntü veya video gösterin. - Uzaktaki ana görüntü yüklenirken yerel bir önizleme görüntüsü gösterin. - Video başlamadan önce bir önizleme görüntüsü gösterin. :::important Bu özelliği kullanmak için Adapty Unity SDK'yı 3.8.0 veya üzeri bir sürüme güncelleyin. ::: Aşağıda, basit bir sözlük aracılığıyla özel varlıkları nasıl sağlayabileceğinize dair bir örnek bulunmaktadır: ```csharp showLineNumbers var customAssets = new Dictionaryisteğe bağlı
varsayılan: `en`
|Paywall yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel verilere her zaman ulaşamayabilir; ancak internet bağlantısı ne kadar düzensiz olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle oturum sırasında ağ isteklerini önlemek amacıyla kullanmak güvenlidir.
Önbelleğin, uygulama yeniden başlatıldığında silinmediğini; yalnızca uygulama kaldırıldığında veya manuel temizleme yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek paywall'lar. Paywall'ları daha hızlı yüklemek için CDN, CDN'e erişilemediği durumlar için ise bağımsız bir yedek sunucu kullanırız. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken paywall'larınızın her zaman en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| --- # File: unity-present-paywalls --- --- title: "Paywallları görüntüleme" description: "Adapty SDK ile Unity uygulamanızda paywallları nasıl görüntüleyeceğinizi öğrenin." --- Paywall Builder ile bir paywall özelleştirdiyseniz, bunu kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render etmenize gerek yoktur. Böyle bir paywall, hem ne gösterileceğini hem de nasıl gösterileceğini içerir. :::warning Bu kılavuz, Adapty SDK 3.3.0 veya sonrasını gerektiren **yeni Paywall Builder**'ı kapsamaktadır. Remote config paywalllarını sunmak için bkz. [Remote config ile tasarlanan paywallları render etme](present-remote-config-paywalls). ::: Bir paywall görüntülemek için, [`CreatePaywallView`](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) metodu tarafından oluşturulan `view` üzerinde `view.Present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Paywall'ı tekrar görüntülemeniz gerekiyorsa, yeni bir `view` örneği oluşturmak için `CreatePaywallView`'ı bir kez daha çağırın. :::warning Aynı `view`'ı yeniden oluşturmadan tekrar kullanmak, `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers title="Unity" view.Present((error) => { // handle the error }); ``` :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Diyalog gösterme \{#show-dialog\} Android'de bir paywall görünümü sunulduğunda, yerel uyarı iletişim kutuları yerine bu metodu kullanın. Android'de normal uyarılar paywall görünümünün arkasında kalarak kullanıcılara görünmez hale gelir. Bu metod, tüm platformlarda iletişim kutusunun paywall'ın üzerinde düzgün şekilde gösterilmesini sağlar. ```csharp showLineNumbers title="Unity" var dialog = new AdaptyUIDialogConfiguration() .SetTitle("Close paywall?") .SetContent("You will lose access to exclusive offers.") .SetDefaultActionTitle("Stay") .SetSecondaryActionTitle("Close"); AdaptyUI.ShowDialog(view, dialog, (action, error) => { if (error == null) { if (action == AdaptyUIDialogActionType.Secondary) { // User confirmed - close the paywall view.Dismiss(); } // If primary - do nothing, user stays } }); ``` ## iOS sunum stilini yapılandırma \{#configure-ios-presentation-style\} `Present()` metoduna `iosPresentationStyle` parametresini geçirerek paywall'ın iOS'ta nasıl sunulacağını yapılandırın. Parametre, `AdaptyUIIOSPresentationStyle.FullScreen` (varsayılan) veya `AdaptyUIIOSPresentationStyle.PageSheet` değerlerini kabul eder. ```csharp showLineNumbers title="Unity" view.Present(AdaptyUIIOSPresentationStyle.PageSheet, (error) => { // handle the error }); ``` --- # File: unity-handle-paywall-actions --- --- title: "Unity SDK'da düğme eylemlerine yanıt verme" description: "Daha iyi uygulama monetizasyonu için Unity'de Adapty kullanarak paywall düğme eylemlerini yönetin." --- Adapty Paywall Builder kullanarak paywall oluşturuyorsanız, düğmeleri doğru şekilde yapılandırmanız gerekir: 1. [Paywall builder'da bir düğme ekleyin](paywall-buttons) ve bu düğmeye mevcut bir eylem atayın ya da özel bir eylem ID'si oluşturun. 2. Uygulamanızın kodunda, atadığınız her eylemi işleyecek kodu yazın. Bu rehber, özel ve hazır eylemleri kodunuzda nasıl yöneteceğinizi göstermektedir. :::warning **Yalnızca satın almalar ve geri yüklemeler otomatik olarak işlenir.** Paywallları kapatma veya bağlantı açma gibi diğer tüm düğme eylemleri için uygulama kodunuzda ilgili işleyicileri uygulamanız gerekir. ::: ## Paywallları kapatma \{#close-paywalls\} Paywall'ınızı kapatacak bir düğme eklemek için: 1. Paywall builder'da bir düğme ekleyin ve **Close** eylemini atayın. 2. Uygulama kodunuzda, paywall'ı kapatan `close` eylemi için bir işleyici uygulayın. ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Close: view.Dismiss(null); break; default: // handle other events break; } } ``` ## Paywall'lardan URL açma \{#open-urls-from-paywalls\} :::tip Bir grup bağlantı eklemek istiyorsanız (örneğin, kullanım koşulları ve satın alma geri yükleme), paywall builder'da bir **Link** öğesi ekleyin ve bunu **Open URL** eylemine sahip düğmelerle aynı şekilde işleyin. ::: Paywall'ınızdan bir bağlantı açan bir düğme eklemek için (örneğin, **Kullanım Koşulları** veya **Gizlilik Politikası**): 1. Paywall builder'da bir düğme ekleyin, **Open URL** eylemini atayın ve açmak istediğiniz URL'yi girin. 2. Uygulama kodunuzda, alınan URL'yi tarayıcıda açan `openUrl` eylemi için bir işleyici uygulayın. ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.OpenUrl: var urlString = action.Value; if(!string.IsNullOrWhiteSpace(urlString)) { Application.OpenURL(urlString); } break; default: // handle other events break; } } ``` ## Uygulamaya giriş yapma \{#log-into-the-app\} Kullanıcıların uygulamanıza giriş yapmasını sağlayan bir düğme eklemek için: 1. Paywall builder'da bir düğme ekleyin ve `login` ID'siyle **Custom** eylemini atayın. 2. Uygulama kodunuzda, kullanıcınızı tanımlayan `login` özel eylemi için bir işleyici uygulayın. ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Custom: if (action.Value == "login") { // Navigate to login scene SceneManager.LoadScene("LoginScene"); } break; default: // handle other events break; } } ``` ## Özel eylemleri yönetme \{#handle-custom-actions\} Diğer eylemleri yöneten bir düğme eklemek için: 1. Paywall builder'da bir düğme ekleyin, **Custom** eylemini atayın ve bir ID belirleyin. 2. Uygulama kodunuzda, oluşturduğunuz eylem ID'si için bir işleyici uygulayın. Örneğin, başka bir abonelik teklifi veya tek seferlik satın alma seçeneğiniz varsa, başka bir paywall görüntüleyen bir düğme ekleyebilirsiniz: ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Custom: if (action.Value == "openNewPaywall") { // Display another paywall ShowAlternativePaywall(); } break; default: // handle other events break; } } private void ShowAlternativePaywall() { // Implement your logic to show alternative paywall } ``` --- # File: unity-handling-events --- --- title: "Paywall olaylarını yönet" description: "Adapty SDK ile Unity uygulamanızda paywall olaylarını nasıl yöneteceğinizi öğrenin." --- :::important Bu rehber; satın alma, geri yükleme, ürün seçimi ve paywall render işlemlerine ait olay yönetimini kapsar. Ayrıca buton işlemlerini de (paywallı kapatma, bağlantı açma vb.) uygulamanız gerekir. Ayrıntılar için [buton aksiyonlarını yönetme rehberimize](unity-handle-paywall-actions) bakın. ::: [Paywall Builder](adapty-paywall-builder) ile yapılandırılan paywall'lar, satın alma ve geri yükleme işlemleri için ek kod gerektirmez. Ancak uygulamanızın yanıt verebileceği bazı olaylar üretirler. Bu olaylar; buton tıklamaları (kapat butonları, URL'ler, ürün seçimleri vb.) ve paywall üzerinde gerçekleştirilen satın alma ile ilgili aksiyonlara dair bildirimleri kapsar. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz. :::warning Bu rehber yalnızca Adapty SDK v3.3.0 veya üzerini gerektiren **yeni Paywall Builder paywall'ları** içindir. ::: :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: ## Olayları yönetme \{#handling-events\} Mobil uygulamanızdaki paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için `AdaptyPaywallsEventsListener` arayüzünü uygulayın: ```csharp showLineNumbers title="Unity" using UnityEngine; using AdaptySDK; public class PaywallEventsHandler : MonoBehaviour, AdaptyPaywallsEventsListener { void Start() { Adapty.SetPaywallsEventsListener(this); } // Implement all required interface methods below } ``` ### Kullanıcı kaynaklı olaylar \{#user-generated-events\} #### Paywall göründü \{#paywall-appeared\} Paywall görünümü ekranda gösterildiğinde tetiklenir. :::note iOS'ta, kullanıcı bir paywall içindeki [web paywall butonuna](web-paywall#step-2a-add-a-web-purchase-button) dokunduğunda ve uygulama içi tarayıcıda bir web paywall açıldığında da tetiklenir. ::: ```csharp showLineNumbers title="Unity" public void PaywallViewDidAppear(AdaptyUIPaywallView view) { } ``` #### Paywall kayboldu \{#paywall-disappeared\} Paywall görünümü ekrandan kapatıldığında tetiklenir. :::note iOS'ta, bir paywalldan uygulama içi tarayıcıda açılan [web paywall](web-paywall#step-2a-add-a-web-purchase-button) ekrandan kaybolduğunda da tetiklenir. ::: ```csharp showLineNumbers title="Unity" public void PaywallViewDidDisappear(AdaptyUIPaywallView view) { } ``` #### Ürün seçimi \{#product-selection\} Kullanıcı ya da sistem tarafından satın alma için bir ürün seçildiğinde tetiklenir. ```csharp showLineNumbers title="Unity" public void PaywallViewDidSelectProduct( AdaptyUIPaywallView view, string productId ) { } ```
## Paywall görüntüleme sayısı çok yüksek \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntüleme sayısı beklenenin iki katını gösteriyor.
**Neden**: Kodunuzda `LogShowPaywall` çağırıyor olabilirsiniz; Paywall Builder kullanıyorsanız bu, görüntüleme sayısını çiftler. Paywall Builder ile tasarlanmış paywall'larda analitikler otomatik olarak izlenir, dolayısıyla bu metodu kullanmanıza gerek yoktur.
**Çözüm**: Paywall Builder kullanıyorsanız kodunuzda `LogShowPaywall` çağırmadığınızdan emin olun.
## Diğer sorunlar \{#other-issues\}
**Sorun**: Yukarıda ele alınmayan başka Paywall Builder ile ilgili sorunlar yaşıyorsunuz.
**Çözüm**: Gerekirse [migration kılavuzlarını](unity-sdk-migration-guides) kullanarak SDK'yı en son sürüme geçirin. Birçok sorun yeni SDK sürümlerinde çözülmüştür.
---
# File: unity-quickstart-manual
---
---
title: "Unity SDK'da özel paywallınızda satın alma işlemlerini etkinleştirme"
description: "Uygulama içi satın almaları etkinleştirmek için Adapty SDK'yı özel Unity paywalllarınıza entegre edin."
---
Bu kılavuz, Adapty'yi özel paywalllarınıza nasıl entegre edeceğinizi açıklar. Paywall uygulaması üzerinde tam kontrolü elinizde tutarken Adapty SDK ürünleri getirir, yeni satın alma işlemlerini yönetir ve önceki satın almaları geri yükler.
:::important
**Bu kılavuz, özel paywall uygulayan geliştiriciler içindir.** Satın alma işlemlerini etkinleştirmenin en kolay yolunu arıyorsanız [Adapty Paywall Builder](unity-quickstart-paywalls)'ı kullanın. Paywall Builder ile paywallları kodsuz görsel düzenleyicide oluşturursunuz, Adapty tüm satın alma mantığını otomatik olarak yönetir ve uygulamanızı yeniden yayınlamadan farklı tasarımları test edebilirsiniz.
:::
## Başlamadan önce \{#before-you-start\}
### Ürünleri ayarlama \{#set-up-products\}
Uygulama içi satın almaları etkinleştirmek için üç temel kavramı anlamanız gerekir:
- [**Ürünler**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Paywalllar**](paywalls) – hangi ürünlerin sunulacağını tanımlayan yapılandırmalar. Adapty'de ürünleri almanın tek yolu paywalllar üzerindendir; ancak bu yapı sayesinde uygulama kodunuza dokunmadan ürünleri, fiyatları ve teklifleri değiştirebilirsiniz.
- [**Placement'lar**](placements) – uygulamanızda paywallları nerede ve ne zaman göstereceğiniz (örneğin `main`, `onboarding`, `settings`). Kontrol panelinde placement'lar için paywalllar ayarlarsınız, ardından kodunuzda placement ID'si ile bunları talep edersiniz. Bu yapı, A/B testleri çalıştırmayı ve farklı kullanıcılara farklı paywalllar göstermeyi kolaylaştırır.
Özel paywall kullanıyor olsanız bile bu kavramları anladığınızdan emin olun. Bunlar temelde uygulamanızda sattığınız ürünleri yönetme yönteminizdir.
Özel paywallınızı uygulamak için bir **paywall** oluşturmanız ve bunu bir **placement**'a eklemeniz gerekir. Bu kurulum, ürünlerinizi almanızı sağlar. Kontrol panelinde yapmanız gerekenleri anlamak için [buradaki](quickstart) hızlı başlangıç kılavuzunu takip edin.
### Kullanıcıları yönetme \{#manage-users\}
Kendi tarafınızda backend kimlik doğrulaması ile veya olmadan çalışabilirsiniz.
Ancak Adapty SDK, anonim ve tanımlanmış kullanıcıları farklı şekilde ele alır. Ayrıntıları anlamak ve kullanıcılarla düzgün şekilde çalıştığınızdan emin olmak için [kimlik belirleme hızlı başlangıç kılavuzunu](unity-quickstart-identify) okuyun.
## Adım 1. Ürünleri alın \{#step-1-get-products\}
Özel paywallınız için ürünleri almak üzere şunları yapmanız gerekir:
1. [placement](placements) ID'sini `getPaywall` metoduna geçirerek `paywall` nesnesini alın.
2. `getPaywallProducts` metodunu kullanarak bu paywall için ürünler dizisini alın.
```csharp showLineNumbers
using AdaptySDK;
void LoadPaywall() {
Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => {
if (error != null) {
// Handle the error
return;
}
Adapty.GetPaywallProducts(paywall, (products, productsError) => {
if (productsError != null) {
// Handle the error
return;
}
// Use products to build your custom paywall UI
});
});
}
```
## Adım 2. Satın almaları kabul edin \{#step-2-accept-purchases\}
Kullanıcı özel paywallınızda bir ürüne dokunduğunda, seçili ürünle `makePurchase` metodunu çağırın. Bu işlem satın alma akışını yönetir ve güncellenmiş profili döndürür.
```csharp showLineNumbers
using AdaptySDK;
void PurchaseProduct(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
if (error != null) {
// Handle the error
return;
}
switch (result.Type) {
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// Purchase successful, profile updated
break;
case AdaptyPurchaseResultType.UserCancelled:
// User canceled the purchase
break;
case AdaptyPurchaseResultType.Pending:
// Purchase is pending (e.g., user will pay offline with cash)
break;
}
});
}
```
## Adım 3. Satın almaları geri yükleyin \{#step-3-restore-purchases\}
Uygulama mağazaları, abonelik içeren tüm uygulamaların kullanıcılara satın almalarını geri yükleyebilecekleri bir yol sunmasını zorunlu kılar.
Kullanıcı geri yükleme düğmesine dokunduğunda `restorePurchases` metodunu çağırın. Bu işlem, satın alma geçmişini Adapty ile senkronize eder ve güncellenmiş profili döndürür.
```csharp showLineNumbers
using AdaptySDK;
void RestorePurchases() {
Adapty.RestorePurchases((profile, error) => {
if (error != null) {
// Handle the error
return;
}
// Restore successful, profile updated
});
}
```
## Sonraki adımlar \{#next-steps\}
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
Paywallınız uygulamada gösterilmeye hazır. Paywalldan bir test satın alması tamamlayabildiğinizden emin olmak için satın almalarınızı [App Store sandbox](test-purchases-in-sandbox) ortamında veya [Google Play Store](testing-on-android)'da test edin.
Ardından, paywallı gösterip göstermeyeceğinizi ya da ücretli özelliklere erişim izni verip vermeyeceğinizi belirlemek için [kullanıcıların satın alma işlemini tamamlayıp tamamlamadığını kontrol edin](unity-check-subscription-status).
---
# File: fetch-paywalls-and-products-unity
---
---
title: "Unity SDK'da remote config paywalllar için paywallları ve ürünleri çekme"
description: "Kullanıcı gelirini artırmak için Adapty Unity SDK'da paywallları ve ürünleri çekin."
---
Remote config ve özel paywallları göstermeden önce, bunlara ilişkin bilgileri çekmeniz gerekir. Bu konunun remote config ve özel paywalllarla ilgili olduğunu unutmayın. Paywall Builder ile özelleştirilmiş paywalllar için çekme işlemine dair rehber için [Paywall Builder paywalllarını ve yapılandırmalarını çekme](unity-get-pb-paywalls) bölümüne bakın.
:::tip
Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın.
:::
isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılması önerildiğine dair daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](unity-localizations-and-locale-codes) bölümüne bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla silindiğini unutmayın.
Adapty SDK, paywallları iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](unity-use-fallback-paywalls). Paywallları daha hızlı çekmek için CDN kullanıyoruz ve CDN'e erişilemediği durumlarda bağımsız bir yedek sunucu devreye giriyor. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman paywalllarınızın en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın, çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini koda sabit olarak yazmayın! Paywalllar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz denemeler gibi) zamanla değişebilir. Kodunuzun bu senaryoları işlediğinden emin olun. Örneğin, başlangıçta 2 ürün alırsanız uygulamanız o 2 ürünü görüntülemelidir. Ancak daha sonra 3 ürün alırsanız, uygulamanız herhangi bir kod değişikliği gerektirmeden 3 ürünün tamamını görüntülemelidir. Koda sabit olarak yazmanız gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'leri listesi, paywall tanımlayıcısı, remote config ve diğer çeşitli özelliklerle birlikte bir [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesi. | ## Ürünleri çekme \{#fetch-products\} Paywallı aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```csharp showLineNumbers Adapty.GetPaywallProducts(paywall, (products, error) => { if(error != null) { // handle the error return; } // products - the requested products array }); ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer çeşitli özelliklerle birlikte [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken, [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) nesnesindeki bu özelliklere erişmeniz gerekecektir. Aşağıda en sık kullanılan özellikler gösterilmektedir; ancak mevcut tüm özelliklere ilişkin tam ayrıntılar için bağlantılı belgeye başvurun. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Ürünün başlığını görüntülemek için `product.LocalizedTitle` kullanın. Yerelleştirmenin cihazın yerel ayarına değil, kullanıcıların seçtiği mağaza ülkesine göre yapıldığını unutmayın. | | **Price** | Fiyatın yerelleştirilmiş sürümünü görüntülemek için `product.Price.LocalizedString` kullanın. Bu yerelleştirme, cihazın yerel ayar bilgisine dayanır. Fiyata sayı olarak `product.Price.Amount` üzerinden de erişebilirsiniz. Değer yerel para birimi cinsinden sağlanacaktır. İlişkili para birimi sembolünü almak için `product.Price.CurrencySymbol` kullanın. | | **Subscription Period** | Dönemi (ör. hafta, ay, yıl vb.) görüntülemek için `product.Subscription?.LocalizedPeriod` kullanın. Bu yerelleştirme cihazın yerel ayarına dayanır. Abonelik dönemini programatik olarak almak için `product.Subscription?.Period` kullanın. Oradan uzunluğu almak için `Unit` enum'una erişebilirsiniz (`AdaptySubscriptionPeriodUnit.Day`, `AdaptySubscriptionPeriodUnit.Week`, `AdaptySubscriptionPeriodUnit.Month`, `AdaptySubscriptionPeriodUnit.Year` veya `AdaptySubscriptionPeriodUnit.Unknown`). `NumberOfUnits` değeri, dönem birimi sayısını verir. Örneğin, üç aylık bir abonelik için Unit özelliğinde `AdaptySubscriptionPeriodUnit.Month`, NumberOfUnits özelliğinde `3` görürsünüz. | | **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerdiğini belirten bir rozet veya gösterge görüntülemek için `product.Subscription?.Offer?.Phases` özelliğine bakın. Bu, ücretsiz deneme aşaması ve başlangıç fiyatı aşaması olmak üzere iki indirim aşamasına kadar içerebilen bir listedir. Her aşama nesnesi içinde şu yararlı özellikler bulunur:isteğe bağlı
varsayılan: `en`
|Paywall yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verileri almasını sağladığından bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla karşılaştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar zayıf olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum boyunca kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla silindiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek paywalllar. Paywallları daha hızlı çekmek için CDN kullanıyoruz ve CDN'e erişilemediği durumlarda bağımsız bir yedek sunucu devreye giriyor. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman paywalllarınızın en güncel sürümünü almanızı sağlamak için tasarlanmıştır.
| --- # File: present-remote-config-paywalls-unity --- --- title: "Unity SDK'da remote config ile tasarlanan paywallı render etme" description: "Adapty Unity SDK'da remote config paywalllarının nasıl sunulacağını ve kullanıcı deneyiminin nasıl kişiselleştirileceğini keşfedin." --- Bir paywallı remote config kullanarak özelleştirdiyseniz, kullanıcılara göstermek için mobil uygulama kodunuzda render işlemini kendiniz yapmanız gerekir. Remote config, ihtiyaçlarınıza göre esneklik sunduğundan, paywallınıza nelerin dahil olacağını ve görünümünün nasıl olacağını siz belirlersiniz. Remote config aracılığıyla yapılandırılmış özel paywallınızı gösterebilmek için remote yapılandırmayı çekmeye yarayan bir yöntem sunuyoruz. ## Paywall remote config'ini alın ve sunun \{#get-paywall-remote-config-and-present-it\} Bir paywallın remote config'ini almak için `remoteConfig` özelliğine erişin ve ihtiyaç duyduğunuz değerleri çekin. ```csharp showLineNumbers Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => { if (error != null) { // handle the error return; } // Access remote config dictionary var dictionary = paywall.RemoteConfig?.Dictionary; var headerText = dictionary?["header_text"] as string; // Or access raw JSON data var jsonData = paywall.RemoteConfig?.Data; }); ``` Bu noktada, gerekli tüm değerleri aldıktan sonra bunları görsel açıdan çekici bir sayfaya dönüştürme zamanı gelmiştir. Tasarımın farklı telefon ekranlarına ve yönlendirmelerine uyum sağladığından, tüm cihazlarda sorunsuz ve kullanıcı dostu bir deneyim sunduğundan emin olun. :::warning Adapty analitiğinin huni ve A/B testi verilerini doğru kaydedebilmesi için aşağıda açıklandığı şekilde [paywall görüntüleme etkinliğini kaydettiğinizden](present-remote-config-paywalls-unity#track-paywall-view-events) emin olun. ::: Paywallı göstermeyi tamamladıktan sonra satın alma akışını kurabilirsiniz. Kullanıcı bir satın alma yaptığında, paywallınızdaki ürünle birlikte `.MakePurchase()` yöntemini çağırmanız yeterlidir. `.MakePurchase()` yöntemi hakkında ayrıntılı bilgi için [Satın alma yapma](unity-making-purchases) bölümüne bakın. [Yedek paywall olarak adlandırılan bir fallback paywall oluşturmanızı](unity-use-fallback-paywalls) öneririz. Bu yedek, internet bağlantısı olmadığında veya önbellek mevcut olmadığında kullanıcıya gösterilir ve bu durumlarda bile sorunsuz bir deneyim sağlar. ## Paywall görüntüleme etkinliklerini takip edin \{#track-paywall-view-events\} Adapty, paywalllarınızın performansını ölçmenize yardımcı olur. Satın alma verilerini otomatik olarak toplasak da paywall görüntülemelerini kaydetmek sizin sorumluluğunuzdadır; çünkü bir müşterinin paywallı ne zaman gördüğünü yalnızca siz bilebilirsiniz. Bir paywall görüntüleme etkinliği kaydetmek için `.LogShowPaywall(paywall)` yöntemini çağırmanız yeterlidir; bu işlem, huni ve A/B testi metriklerinize yansıyacaktır. :::important [Paywall Builder](adapty-paywall-builder) ile oluşturulan paywallları gösteriyorsanız `.LogShowPaywall(paywall)` çağrısı yapmanıza gerek yoktur. ::: ```csharp showLineNumbers Adapty.LogShowPaywall(paywall, (error) => { // handle the error }); ``` İstek parametreleri: | Parametre | Zorunluluk | Açıklama | | :---------- | :--------- |:---------------------------------------------------------------| | **paywall** | zorunlu | Bir [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesi. | --- # File: unity-making-purchases --- --- title: "Unity SDK ile mobil uygulamada satın alma yapma" description: "Adapty kullanarak uygulama içi satın almaları ve abonelikleri yönetme kılavuzu." --- Mobil uygulamanızda paywall'ları göstermek, kullanıcılara premium içerik veya hizmetlere erişim sunmanın temel adımlarından biridir. Ancak, paywall'larınızı özelleştirmek için [Paywall Builder](adapty-paywall-builder) kullanıyorsanız, bu paywall'ları yalnızca göstermek satın almaları desteklemek için yeterlidir. Paywall Builder kullanmıyorsanız, satın alma işlemini tamamlamak ve istenen içeriğin kilidini açmak için `.makePurchase()` adlı ayrı bir metot kullanmanız gerekir. Bu metot, kullanıcıların paywall'larla etkileşime geçmesini ve istedikleri işlemleri gerçekleştirmesini sağlayan kapı işlevi görür. Eğer paywallınızda kullanıcının satın almaya çalıştığı ürün için aktif bir promosyon teklifi varsa, Adapty bunu satın alma sırasında otomatik olarak uygular. :::warning Başlangıç teklifinin otomatik olarak uygulanabilmesi için Paywall Builder ile oluşturulmuş paywallları kullanmanız gerektiğini unutmayın. Diğer durumlarda, [iOS'ta kullanıcının başlangıç teklifi için uygunluğunu doğrulamanız](fetch-paywalls-and-products#check-intro-offer-eligibility-on-ios) gerekecektir. Bu adımı atlamak, uygulamanızın yayın sürecinde reddedilmesine yol açabilir. Bunun yanı sıra, başlangıç teklifine uygun olan kullanıcılardan tam fiyat alınmasına neden olabilir. ::: [Başlangıç yapılandırmasını](quickstart) tek bir adımı bile atlamadan tamamladığınızdan emin olun. Bu olmadan satın alımları doğrulayamayız. ## Satın alma yapma \{#make-purchase\} :::note **[Paywall Builder](adapty-paywall-builder) kullanıyor musunuz?** Satın almalar otomatik olarak işlenir—bu adımı atlayabilirsiniz. **Adım adım rehber mi arıyorsunuz?** Tam bağlam içeren uçtan uca uygulama talimatları için [hızlı başlangıç kılavuzuna](unity-implement-paywalls-manually) göz atın. ::: ```csharp showLineNumbers using AdaptySDK; void MakePurchase(AdaptyPaywallProduct product) { Adapty.MakePurchase(product, (result, error) => { switch (result.Type) { case AdaptyPurchaseResultType.Pending: // handle pending purchase break; case AdaptyPurchaseResultType.UserCancelled: // handle purchase cancellation break; case AdaptyPurchaseResultType.Success: var profile = result.Profile; // handle successfull purchase break; default: break; } }); } ``` İstek parametreleri: | Parametre | Varlık | Açıklama | | :---------- | :------- |:---------------------------------------------------------------------------------------------------| | **Product** | gerekli | Paywall'dan alınan bir [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) nesnesi. | Yanıt parametreleri: | Parametre | Açıklama | |---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Profile** |İstek başarılı olursa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) nesnesi, kullanıcının uygulama içindeki access level'ları, abonelikleri ve tek seferlik satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Hâlâ Apple'ın StoreKit v2.0'dan düşük bir sürümünü ve Adapty SDK'nın v2.9.0'dan düşük bir sürümünü kullanıyorsanız, bunun yerine [Apple App Store paylaşılan secret'ı](app-store-connection-configuration#step-5-enter-app-store-shared-secret) sağlamanız gerekir. Bu yöntem Apple tarafından kullanımdan kaldırılmıştır. ::: ## Satın alma sırasında aboneliği değiştirme \{#change-subscription-when-making-a-purchase\} Bir kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu süreç uygulama mağazasına göre farklı işler: - App Store'da abonelik, abonelik grubu içinde otomatik olarak güncellenir. Kullanıcı bir gruptan abonelik satın alırken başka bir gruptan zaten aktif bir aboneliği varsa, her iki abonelik aynı anda aktif olur. - Google Play'de abonelik otomatik olarak güncellenmez. Geçişi, aşağıda açıklandığı gibi mobil uygulama kodunuzda yönetmeniz gerekir. Android'de aboneliği başka biriyle değiştirmek için `.makePurchase()` metodunu ek parametre ile çağırın: ```csharp showLineNumbers // Create subscription update parameters var subscriptionUpdateParams = new AdaptySubscriptionUpdateParameters( "old_product_id", // Product ID of the current subscription AdaptySubscriptionUpdateReplacementMode.WithTimeProration ); Adapty.MakePurchase(product, subscriptionUpdateParams, (profile, error) => { if(error != null) { // Handle the error return; } // successful cross-grade }); ``` Ek istek parametresi: | Parametre | Varlık | Açıklama | | :--------------------------- | :------- |:-------------------------------------------------------------------------------------------------------| | **subscriptionUpdateParams** | zorunlu | bir [`AdaptySubscriptionUpdateParameters`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_subscription_update_parameters.html) nesnesi. | Abonelikler ve değiştirme modları hakkında daha fazla bilgi edinmek için Google Geliştirici belgelerine bakabilirsiniz: - [Değiştirme modları hakkında](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Google'ın değiştirme modları için önerileri](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Değiştirme modu [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Not: Bu yöntem yalnızca abonelik yükseltmeleri için kullanılabilir. Düşürme işlemleri desteklenmez. - Değiştirme modu [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Not: Gerçek abonelik değişikliği yalnızca mevcut abonelik fatura dönemi sona erdiğinde gerçekleşir. ## iOS'ta teklif kodlarını kullanma \{#redeem-offer-codes-in-ios\}Bir [`AdaptyProfile`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) nesnesi. Bu model; access level, abonelik ve abonelik dışı satın alımlara ilişkin bilgileri içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level** durumunu kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: implement-observer-mode-unity --- --- title: "Unity SDK'da Observer modu uygulama" description: "Unity SDK'da kullanıcı abonelik olaylarını izlemek için Adapty'de observer modunu uygulayın." --- Kendi satın alma altyapınız varsa ve Adapty'ye tamamen geçmeye hazır değilseniz, [Observer modu](observer-vs-full-mode)'nu inceleyebilirsiniz. Temel haliyle Observer modu; gelişmiş analitik ve attribution ile analitik sistemlerle sorunsuz entegrasyon sunar. Bu ihtiyaçlarınızı karşılıyorsa yalnızca şunları yapmanız yeterli: 1. Adapty SDK'yı yapılandırırken `observerMode` parametresini `true` olarak ayarlayarak Observer modunu etkinleştirin. Kurulum talimatlarını [Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk) için takip edin. 2. Mevcut satın alma altyapınızdaki işlemleri [Adapty'ye bildirin](report-transactions-observer-mode-unity). ### Observer modu kurulumu \{#observer-mode-setup\} Satın alma ve abonelik durumunu kendiniz yönetiyorsanız ve Adapty'yi yalnızca abonelik olayları ile analitik göndermek için kullanıyorsanız Observer modunu etkinleştirin. :::important Observer modunda çalışırken Adapty SDK hiçbir işlemi kapatmaz; bu nedenle bunu kendiniz yönettiğinizden emin olun. ::: ```csharp showLineNumbers title="C#" using UnityEngine; using AdaptySDK; public class AdaptyListener : MonoBehaviour, AdaptyEventListener { void Start() { DontDestroyOnLoad(this.gameObject); Adapty.SetEventListener(this); var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY") .SetObserverMode(true); // Enable observer mode Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); } public void OnLoadLatestProfile(AdaptyProfile profile) { } public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { } public void OnInstallationDetailsFail(AdaptyError error) { } } ``` Parametreler: | Parametre | Açıklama | |--------------|------------------------------------------------------------------------------------------------------------| | observerMode | [Observer modu](observer-vs-full-mode)'nu kontrol eden boolean değer. Varsayılan değer `false`'tur. | ## Observer Modunda Adapty paywall'larını kullanma \{#using-adapty-paywalls-in-observer-mode\} Adapty'nin paywall'larını ve A/B testi özelliklerini de kullanmak istiyorsanız bunu yapabilirsiniz; ancak Observer modunda birkaç ek adım gerekir. Yukarıdaki adımlara ek olarak şunları yapmanız gerekir: 1. [Remote config paywall'ları](present-remote-config-paywalls-unity) için paywall'ları her zamanki gibi gösterin. 3. Satın alma işlemleriyle [paywall'ları ilişkilendirin](report-transactions-observer-mode-unity). --- # File: report-transactions-observer-mode-unity --- --- title: "Unity SDK'da Observer Mode'da işlemleri raporlama" description: "Unity SDK'da kullanıcı içgörüleri ve gelir takibi için Adapty Observer Mode'da satın alma işlemlerini raporlayın." ---iOS, StoreKit 1 için: [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction) nesnesi.
iOS, StoreKit 2 için: [Transaction](https://developer.apple.com/documentation/storekit/transaction) nesnesi.
Android için: Satın almanın String tanımlayıcısı (purchase.getOrderId); burada satın alma, billing library [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) sınıfının bir örneğidir.
| | variationId | zorunlu | Varyasyonun string tanımlayıcısı. [AdaptyPaywall](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) nesnesinin `variationId` özelliği kullanılarak elde edilebilir. |phoneNumber
firstName
lastName
| String | | gender | Enum, izin verilen değerler: `female`, `male`, `other` | | birthday | Date | ### Özel kullanıcı nitelikleri \{#custom-user-attributes\} Kendi özel niteliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanım şekliyle ilgilidir. Örneğin fitness uygulamaları için haftalık egzersiz sayısı, dil öğrenme uygulamaları için kullanıcının bilgi seviyesi gibi. Bu nitelikleri segmentlerde kullanarak hedefli paywall'lar ve teklifler oluşturabilir; hangi ürün metriklerinin geliri en çok etkilediğini anlamak için de analizlerde kullanabilirsiniz. ```csharp showLineNumbers try { builder = builder.SetCustomStringAttribute("string_key", "string_value"); builder = builder.SetCustomDoubleAttribute("double_key", 123.0f); } catch (Exception e) { // handle the exception } ``` Mevcut bir anahtarı kaldırmak için `.withRemoved(customAttributeForKey:)` metodunu kullanın: ```csharp showLineNumbers try { builder = builder.RemoveCustomAttribute("key_to_remove"); } catch (Exception e) { // handle the exception } ``` Bazen daha önce hangi özel niteliklerin yüklendiğini öğrenmek gerekebilir. Bunun için `AdaptyProfile` nesnesinin `customAttributes` alanını kullanın. :::warning `customAttributes` değerinin güncel olmayabileceğini unutmayın; kullanıcı nitelikleri farklı cihazlardan herhangi bir zamanda gönderilebileceğinden, son senkronizasyondan bu yana sunucudaki nitelikler değişmiş olabilir. ::: ### Sınırlar \{#limits\} - Kullanıcı başına en fazla 30 özel nitelik - Anahtar adları en fazla 30 karakter uzunluğunda olabilir. Anahtar adı alfanümerik karakterler ve şunlardan herhangi birini içerebilir: `_` `-` `.` - Değer, en fazla 50 karakterden oluşan bir string veya float olabilir. --- # File: unity-listen-subscription-changes --- --- title: "Unity SDK'da abonelik durumunu kontrol etme" description: "Unity uygulamanızda müşteri tutundurmasını artırmak için Adapty'de kullanıcı abonelik durumunu takip edin ve yönetin." --- Adapty ile abonelik durumunu takip etmek çok kolay. Ürün ID'lerini kodunuza manuel olarak eklemenize gerek yok. Bunun yerine, aktif bir [access level](access-level) olup olmadığını kontrol ederek kullanıcının abonelik durumunu zahmetsizce doğrulayabilirsiniz.Bir [AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) nesnesi. Genellikle, kullanıcının uygulamaya premium erişimi olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu her zaman API'yi sorgulamaya çalıştığından en güncel sonucu döndürür. Herhangi bir nedenle (örneğin internet bağlantısı yokluğu) Adapty SDK sunucudan bilgi alamazsa önbellekteki veriler döndürülür. Ayrıca Adapty SDK'nın bu bilgileri mümkün olduğunca güncel tutmak için `AdaptyProfile` önbelleğini düzenli aralıklarla güncellediğini de belirtmek gerekir.
| `.getProfile()` metodu, access level durumunu alabileceğiniz kullanıcı profilini sağlar. Uygulama başına birden fazla access level tanımlayabilirsiniz. Örneğin bir gazete uygulamanız varsa ve farklı konulara bağımsız abonelikler satıyorsanız, "sports" ve "science" adında access level'lar oluşturabilirsiniz. Ancak çoğu zaman yalnızca bir access level'a ihtiyaç duyulur; bu durumda varsayılan "premium" access level'ı kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmek için bir örnek: ```csharp showLineNumbers Adapty.GetProfile((profile, error) => { if (error != null) { // handle the error return; } // "premium" is an identifier of default access level var accessLevel = profile.AccessLevels["premium"]; if (accessLevel != null && accessLevel.IsActive) { // grant access to premium features } }); ``` ### Abonelik durumu güncellemelerini dinleme \{#listening-for-subscription-status-updates\} Kullanıcının aboneliği her değiştiğinde Adapty bir olay tetikler. Adapty'den mesaj alabilmek için bazı ek yapılandırmalar yapmanız gerekir: ```csharp showLineNumbers // Extend `AdaptyEventListener ` with `OnLoadLatestProfile ` method: public class AdaptyListener : MonoBehaviour, AdaptyEventListener { public void OnLoadLatestProfile(AdaptyProfile profile) { // handle any changes to subscription state } } ``` Adapty, uygulama başlangıcında da bir olay tetikler. Bu durumda önbellekteki abonelik durumu iletilir. ### Abonelik durumu önbelleği \{#subscription-status-cache\} Adapty SDK'daki önbellek, profilin abonelik durumunu saklar. Bu sayede sunucu kullanılamaz olsa bile profil abonelik durumu hakkında bilgi sağlamak için önbellekteki verilere erişilebilir. Ancak önbellekten doğrudan veri isteği yapılamadığını belirtmek gerekir. SDK, profille ilgili güncelleme veya değişiklikleri kontrol etmek için sunucuyu her dakika periyodik olarak sorgular. Yeni işlemler ya da diğer güncellemeler gibi değişiklikler varsa, sunucuyla senkronizasyonu korumak amacıyla önbellekteki verilere yansıtılır. --- # File: unity-deal-with-att --- --- title: "Unity SDK'da ATT ile Başa Çıkma" description: "Abonelik kurulumu ve yönetimini kolaylaştırmak için Unity'de Adapty'ye başlayın." --- Uygulamanız AppTrackingTransparency çerçevesini kullanıyor ve kullanıcıya uygulama izleme yetkilendirme isteği sunuyorsa, [yetkilendirme durumunu](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) Adapty'ye göndermeniz gerekir. ```csharp showLineNumbers var builder = new Adapty.ProfileParameters.Builder() .SetAppTrackingTransparencyStatus(IOSAppTrackingTransparencyStatus.Authorized); Adapty.UpdateProfile(builder.Build(), (error) => { if(error != null) { // handle the error } }); ``` :::warning Bu değeri, değiştiği anda mümkün olan en erken sürede göndermenizi şiddetle tavsiye ederiz; yalnızca bu durumda veriler, yapılandırdığınız entegrasyonlara zamanında iletilecektir. ::: --- # File: kids-mode-unity --- --- title: "Unity SDK'da Çocuk Modu" description: "Apple ve Google politikalarına uymak için Çocuk Modunu kolayca etkinleştirin. Unity SDK'da IDFA, GAID veya reklam verisi toplanmaz." --- Unity uygulamanız çocuklara yönelikse [Apple](https://developer.apple.com/kids/) ve [Google](https://support.google.com/googleplay/android-developer/answer/9893335) politikalarına uymanız gerekir. Adapty SDK kullanıyorsanız, birkaç basit adımla SDK'yı bu politikalara uygun şekilde yapılandırabilir ve uygulama mağazası incelemelerini geçebilirsiniz. ## Ne yapmanız gerekiyor? \{#whats-required\} Adapty SDK'yı aşağıdakilerin toplanmasını devre dışı bırakacak şekilde yapılandırmanız gerekir: - [IDFA (Reklamverenler için Tanımlayıcı)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Advertising ID (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [IP adresi](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) Bunların yanı sıra, kullanıcı ID'sini dikkatli kullanmanızı öneririz. `isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesi anlamına gelir.
Yerel ayar kodları ve bunların kullanımı hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](flutter-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel veriyi alamayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, dolayısıyla ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında korunduğunu ve yalnızca uygulama yeniden yüklendiğinde ya da manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı almak için CDN, CDN'e erişilemediği durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| | **loadTimeout** | varsayılan: 5 sn |Bu değer, metodun zaman aşımı süresini sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` ile belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özellikler içeren bir [`AdaptyOnboarding`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_onboarding.html) nesnesi. | Onboarding'i aldıktan sonra `CreateOnboardingView` metodunu çağırın. :::warning `CreateOnboardingView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa `CreateOnboardingView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers AdaptyUI.CreateOnboardingView(onboarding, (view, error) => { // handle the result }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |:---------------| :------------- |:-----------------------------------------------------------------------------| | **onboarding** | zorunlu | İstenen onboarding için görünüm elde etmek amacıyla kullanılan `AdaptyOnboarding` nesnesi. | | **externalUrlsPresentation** |isteğe bağlı
varsayılan: `InAppBrowser`
|Onboarding'deki bağlantıların nasıl açıldığını kontrol eder. Mevcut seçenekler:
- `AdaptyWebPresentation.InAppBrowser` - Bağlantıları uygulama içi tarayıcıda açar (varsayılan)
- `AdaptyWebPresentation.ExternalBrowser` - Bağlantıları cihazın harici tarayıcısında açar
Kullanım örnekleri için [Onboarding'lerde bağlantıların nasıl açıldığını özelleştirme](unity-present-onboardings#customize-how-links-open-in-onboardings) sayfasına bakın.
| Onboarding'i ve görünüm yapılandırmasını başarıyla yükledikten sonra [mobil uygulamanızda gösterebilirsiniz](unity-present-onboardings). ## Varsayılan kitle onboarding'i ile onboarding almayı hızlandırın \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Genellikle onboarding'ler neredeyse anında alınır, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve onboarding'iniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, onboarding almak istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir onboarding göstermek isteyebilirsiniz. Bunu çözmek için, **Tüm Kullanıcılar** kitlesi için belirtilen placement'ın onboarding'ini alan `GetOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding Alma](#fetch-onboarding) bölümünde ayrıntılı olarak açıklandığı şekilde `getOnboarding` metoduyla onboarding almak olduğunu anlamak çok önemlidir. :::warning `GetOnboardingForDefaultAudience` yerine `GetOnboarding` kullanmayı düşünün; ikincisinin önemli sınırlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorun yaratabilir; geriye dönük uyumlu tasarımlar yapmanızı veya eski sürümlerin yanlış görüntülenebileceğini kabul etmenizi gerektirir. - **Kişiselleştirme yok**: Yalnızca "Tüm Kullanıcılar" kitlesi için içerik gösterir; ülke, attribution veya özel özniteliklere dayalı hedeflemeyi ortadan kaldırır. Kullanım durumunuzda daha hızlı alma bu dezavantajlardan daha önemli ise, aşağıda gösterildiği gibi `GetOnboardingForDefaultAudience` kullanın. Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı gibi `GetOnboarding` kullanın. ::: ```csharp showLineNumbers Adapty.GetOnboardingForDefaultAudience("YOUR_PLACEMENT_ID", (onboarding, error) => { if (error != null) { // handle the error return; } // the requested onboarding }); ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil için, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesi anlamına gelir.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri varsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en güncel veriyi alamayabilir, ancak internet bağlantısı ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, dolayısıyla ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında korunduğunu ve yalnızca uygulama yeniden yüklendiğinde ya da manuel temizleme yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı almak için CDN, CDN'e erişilemediği durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman onboarding'lerinizin en güncel sürümünü almanızı garantilemek için tasarlanmıştır.
| --- # File: unity-present-onboardings --- --- title: "Unity SDK'da onboarding sunma" description: "Daha fazla dönüşüm elde etmek için onboarding'leri etkili biçimde nasıl sunacağınızı öğrenin." --- Builder'ı kullanarak bir onboarding özelleştirdiyseniz, onu kullanıcıya göstermek için Unity uygulama kodunuzda ayrıca render etmeniz gerekmez. Bu tür bir onboarding, hem onboarding içinde neyin gösterileceğini hem de nasıl gösterileceğini zaten içerir. Başlamadan önce şunları doğrulayın: 1. [Adapty Unity SDK](sdk-installation-unity) 3.14.0 veya daha yeni bir sürümü yüklediniz. 2. [Bir onboarding oluşturdunuz](create-onboarding). 3. Onboarding'i bir [placement](placements)'a eklediniz. Bir onboarding görüntülemek için `CreateOnboardingView` metoduyla oluşturulan `view` üzerinde `view.Present()` metodunu kullanın. Her `view` yalnızca bir kez kullanılabilir. Paywall'ı tekrar görüntülemeniz gerekirse, yeni bir `view` örneği oluşturmak için `CreateOnboardingView` metodunu bir kez daha çağırın. :::warning `view`'ı yeniden oluşturmadan tekrar kullanmak `AdaptyUIError.viewAlreadyPresented` hatasına yol açabilir. ::: ```csharp showLineNumbers title="Unity" view.Present((presentError) => { if (presentError != null) { // handle the error } }; ``` ## iOS sunum stilini yapılandırma \{#configure-ios-presentation-style\} `Present()` metoduna `iosPresentationStyle` parametresini geçerek onboarding'in iOS'ta nasıl sunulacağını yapılandırın. Parametre `AdaptyUIIOSPresentationStyle.FullScreen` (varsayılan) veya `AdaptyUIIOSPresentationStyle.PageSheet` değerlerini kabul eder. ```csharp showLineNumbers title="Unity" view.Present(AdaptyUIIOSPresentationStyle.PageSheet, (error) => { // handle the error }); ``` ## Onboarding'lerde bağlantıların nasıl açılacağını özelleştirin \{#customize-how-links-open-in-onboardings\} :::important Onboarding'lerde bağlantıların nasıl açılacağını özelleştirme özelliği Adapty SDK v3.15 sürümünden itibaren desteklenmektedir. ::: Varsayılan olarak, onboarding'lerdeki bağlantılar uygulama içi tarayıcıda açılır; bu sayede uygulamalar arasında geçiş yapmadan web sayfaları doğrudan uygulamanız içinde gösterilir. Bağlantıları bunun yerine harici bir tarayıcıda açmak için `CreateOnboardingView` metoduna `AdaptyWebPresentation.ExternalBrowser` değerini geçin: ```csharp showLineNumbers title="Unity" AdaptyUI.CreateOnboardingView( onboarding, AdaptyWebPresentation.ExternalBrowser, // default — InAppBrowser (view, error) => { if (error != null) { // handle the error return; } // present the onboarding view view.Present((presentError) => { if (presentError != null) { // handle the error } }); } ); ``` Mevcut seçenekler: - `AdaptyWebPresentation.InAppBrowser` - Bağlantıları uygulama içi tarayıcıda açar (varsayılan) - `AdaptyWebPresentation.ExternalBrowser` - Bağlantıları cihazın harici tarayıcısında açar --- # File: unity-handling-onboarding-events --- --- title: "Unity SDK'da onboarding olaylarını işleme" description: "Adapty kullanarak Unity'de onboarding ile ilgili olayları işleyin." --- Başlamadan önce şunların sağlandığından emin olun: 1. [Adapty Unity SDK](sdk-installation-unity) 3.14.0 veya daha yeni bir sürümünü yüklediniz. 2. [Bir onboarding oluşturdunuz](create-onboarding). 3. Onboarding'i bir [placement](placements)'a eklediniz. Builder ile yapılandırılan onboarding'ler, uygulamanızın yanıt verebileceği olaylar oluşturur. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz. Unity uygulamanızdaki onboarding ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için `AdaptyOnboardingsEventsListener` arayüzünü uygulayın. ## Özel eylemler \{#custom-actions\} Builder'da bir butona **custom** (özel) eylem ekleyip bir ID atayabilirsiniz.
Bu ID'yi kodunuzda kullanarak özel bir eylem olarak işleyebilirsiniz. Örneğin, kullanıcı **Login** veya **Allow notifications** gibi özel bir butona dokunduğunda, `OnboardingViewOnCustomAction` metodu `actionId` parametresiyle tetiklenir; bu parametre builder'daki **Action ID** değerine karşılık gelir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
Onboarding olaylarını yönetmek için `AdaptyOnboardingsEventsListener` arayüzünü uygulayın:
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
void Start()
{
Adapty.SetOnboardingsEventsListener(this);
}
public void OnboardingViewOnCustomAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
if (actionId == "allowNotifications") {
// request notification permissions
}
}
public void OnboardingViewDidFailWithError(
AdaptyUIOnboardingView view,
AdaptyError error
)
{
// handle errors
}
// Implement other required interface methods (see examples below)
}
```
:::important
Kullanıcı onboarding'i kapattığında ne olacağını kendiniz yönetmeniz gerektiğini unutmayın. Örneğin, onboarding'in görüntülenmesini durdurmanız gerekir.
:::
Sınıfınızda `OnboardingViewOnCloseAction` metodunu uygulayın:
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
public void OnboardingViewOnCloseAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
view.Dismiss((error) => {
if (error != null) {
// handle the error
}
});
}
// ... other interface methods
}
```
2. Abonelik grubu adına tıklayın. Ürünlerinizi **Subscriptions** bölümünde göreceksiniz.
3. Test ettiğiniz ürünün **Ready to Submit** olarak işaretlendiğinden emin olun.
4. Tablodaki ürün ID'sini Adapty Kontrol Paneli'ndeki [**Products**](https://app.adapty.io/products) sekmesindekiyle karşılaştırın. ID'ler eşleşmiyorsa ürün ID'sini tablodan kopyalayın ve Adapty Kontrol Paneli'nde bu ID ile [bir ürün oluşturun](create-product).
## Adım 3. Ürün kullanılabilirliğini kontrol edin \{#step-4-check-product-availability\}
1. **App Store Connect**'e geri dönün ve aynı **Subscriptions** bölümünü açın.
2. Ürünlerinizi görüntülemek için abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Availability** bölümüne inin ve gerekli tüm ülke ve bölgelerin listelendiğini doğrulayın.
## Adım 4. Ürün fiyatlarını kontrol edin \{#step-5-check-product-prices\}
1. **App Store Connect**'teki **Monetization** → **Subscriptions** bölümüne gidin.
2. Abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Subscription Pricing** bölümüne inin ve **Current Pricing for New Subscribers** kısmını genişletin.
5. Gerekli tüm fiyatların listelendiğinden emin olun.
## Adım 5. Uygulamanın ücretli durumunu, banka hesabını ve vergi formlarının aktif olduğunu kontrol edin \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. **App Store Connect**](https://appstoreconnect.apple.com/) ana sayfasında **Business** seçeneğine tıklayın.
2. Şirketinizin adını seçin.
3. Aşağı kaydırın ve **Paid Apps Agreement**, **Bank Account** ile **Tax forms** bölümlerinin tümünün **Active** olarak göründüğünü doğrulayın.
Bu adımları izleyerek `InvalidProductIdentifiers` uyarısını çözebilir ve ürünlerinizi mağazada yayına alabilirsiniz.
## Adım 6. Ürün takılı kaldıysa yeniden oluşturun \{#step-6-recreate-the-product-if-its-stuck\}
1–5 arası adımların hepsi geçiyor olabilir — `Approved` durumu, eşleşen Bundle ID, geçerli API anahtarı — ancak SDK yine de `1000 noProductIDsFound` hatası döndürüyor olabilir. Bu durumda ürün, Apple'ın kayıt defterinde takılı kalmış olabilir. Apple'ın ürün kayıt defteri zaman zaman, bir ürünün App Store Connect arayüzünde görünmesine karşın StoreKit arama yoluna açık olmadığı bir duruma girebilir.
Ürünü App Store Connect'te silin ve aynı ürün kimliğiyle yeniden oluşturun. Yeniden oluşturmanın ardından yayılımın tamamlanması için 24 saate kadar bekleyin.
---
# File: cantMakePayments-unity
---
---
title: "Unity SDK'da Code-1003 cantMakePayment hatasının çözümü"
description: "Adapty'de abonelikleri yönetirken oluşan ödeme hatalarını çözün."
---
1003 hatası, `cantMakePayments`, bu cihazda uygulama içi satın alımların yapılamayacağını belirtir.
`cantMakePayments` hatasıyla karşılaşıyorsanız, bu genellikle şu nedenlerden biriyle ilgilidir:
- Cihaz kısıtlamaları: Bu hata Adapty ile ilgili değildir. Aşağıdaki çözüm yollarına bakın.
- Observer mode yapılandırması: `makePurchase` metodu ve observer mode aynı anda kullanılamaz. Aşağıdaki bölüme bakın.
## Sorun: Cihaz kısıtlamaları \{#issue-device-restrictions\}
| Sorun | Çözüm |
|------------------------------|------------------------------------------------------------------------------------------------------------------------------|
| Ekran Süresi kısıtlamaları | [Ekran Süresi](https://support.apple.com/en-us/102470) ayarlarında Uygulama İçi Satın Alım kısıtlamalarını devre dışı bırakın |
| Hesap askıya alındı | Hesap sorunlarını çözmek için Apple Destek ile iletişime geçin |
| Bölgesel kısıtlamalar | Desteklenen bir bölgeden App Store hesabı kullanın |
## Sorun: Observer mode ve makePurchase'ı birlikte kullanmak \{#issue-using-both-observer-mode-and-makepurchase\}
Satın alımları yönetmek için `makePurchases` kullanıyorsanız Observer mode'u kullanmanıza gerek yoktur. [Observer mode](observer-vs-full-mode), yalnızca satın alma mantığını kendiniz uyguladığınızda gereklidir.
Dolayısıyla `makePurchase` kullanıyorsanız, SDK etkinleştirme kodundan Observer mode'u etkinleştiren kısmı güvenle kaldırabilirsiniz.
---
# File: migration-to-unity-sdk-314
---
---
title: "Adapty Unity SDK'yı v3.14'e Taşıma"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Unity SDK v3.14'e geçin."
---
Adapty SDK 3.14.0, bazı geliştirmeler getiren büyük bir sürümdür. Bu geliştirmeler sizin tarafınızdan bazı taşıma adımları gerektirebilir:
1. Paywall olayları için ayrı event listener.
2. `AdaptyUI.CreateView`'i `AdaptyUI.CreatePaywallView` ve ilgili metodlara yeniden adlandırın.
3. `MakePurchase` metodunu bireysel parametreler yerine `AdaptyPurchaseParameters` kullanacak şekilde güncelleyin.
4. `SetFallbackPaywalls`'u `SetFallback` metoduyla değiştirin.
5. Paywall özellik erişimini `AdaptyPlacement` kullanacak şekilde güncelleyin.
6. Remote config erişimini `AdaptyRemoteConfig` nesnesi kullanacak şekilde güncelleyin.
7. `AdaptyPaywall` modelinde `VendorProductIds`'i `ProductIdentifiers` ile değiştirin.
8. `GetPaywall` fetch policy'sini `AdaptyFetchPolicy` kullanacak şekilde güncelleyin.
## Paywall olayları için ayrı olay dinleyicisi \{#separate-event-listener-for-paywall-events\}
[Paywall Builder](adapty-paywall-builder) ile tasarlanmış paywallları görüntülüyorsanız, paywall görünüm olayları artık özel `AdaptyPaywallsEventsListener` arayüzünü ve `SetPaywallsEventsListener` metodunu kullanmaktadır. `AdaptyEventListener` arayüzü ise profil güncellemeleri ve kurulum detayları için kullanılmaya devam etmektedir.
```diff showLineNumbers
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour,
- AdaptyEventListener {
+ AdaptyEventListener,
+ AdaptyPaywallsEventsListener {
void Start() {
Adapty.SetEventListener(this);
+ Adapty.SetPaywallsEventsListener(this);
}
// AdaptyEventListener methods
public void OnLoadLatestProfile(AdaptyProfile profile) { }
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
+ // AdaptyPaywallsEventsListener methods
+ // Implement paywall event handlers here
}
```
[Paywall olaylarını işleme hakkında daha fazla bilgi edinin](unity-handling-events).
## Görünüm oluşturma ve sunum metodlarını yeniden adlandırın \{#rename-view-creation-and-presentation-methods\}
Görünüm oluşturma ve sunum metodları yeniden adlandırıldı:
```diff showLineNumbers
using AdaptySDK;
- AdaptyUI.CreateView(paywall, parameters, (view, error) => {
+ AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if (error != null) {
// handle the error
return;
}
- AdaptyUI.PresentView(view, (error) => {
+ AdaptyUI.PresentPaywallView(view, (error) => {
// handle the error
});
});
}
```
Benzer şekilde, kapatma metodu da yeniden adlandırıldı:
```diff showLineNumbers
- AdaptyUI.DismissView(view, (error) => {
+ AdaptyUI.DismissPaywallView(view, (error) => {
// handle the error
});
```
## MakePurchase yöntemini güncelleme \{#update-makepurchase-method\}
`MakePurchase` yöntemi artık ayrı `subscriptionUpdateParams` ve `isOfferPersonalized` argümanları yerine `AdaptyPurchaseParameters` kullanıyor. Bu, daha iyi tür güvenliği sağlar ve gelecekte satın alma parametrelerinin genişletilebilmesine olanak tanır.
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(
AdaptyPaywallProduct product,
AdaptySubscriptionUpdateParameters subscriptionUpdate,
bool? isOfferPersonalized
) {
- Adapty.MakePurchase(product, subscriptionUpdate, isOfferPersonalized, (result, error) => {
+ var parameters = new AdaptyPurchaseParametersBuilder()
+ .SetSubscriptionUpdateParams(subscriptionUpdate)
+ .SetIsOfferPersonalized(isOfferPersonalized)
+ .Build();
+
+ Adapty.MakePurchase(product, parameters, (result, error) => {
switch (result.Type) {
case AdaptyPurchaseResultType.Pending:
// handle pending purchase
break;
case AdaptyPurchaseResultType.UserCancelled:
// handle purchase cancellation
break;
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// handle successful purchase
break;
default:
break;
}
});
}
```
Ek parametreye ihtiyaç duyulmuyorsa şunu kullanabilirsiniz:
```csharp showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
// handle purchase result
});
}
```
## Yedek paywall yöntemini güncelleme \{#update-fallback-method\}
:::important
Unity SDK 3.14 sürümüne yükseltirken, Adapty Kontrol Paneli'nden yeni yedek dosyaları indirip projenizdeki mevcut dosyaların yerine koymanız gerekecektir.
:::
Yedekleri ayarlama yöntemi güncellendi. `SetFallbackPaywalls` yöntemi `SetFallback` olarak yeniden adlandırıldı:
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
#if UNITY_IOS
var assetId = "adapty_fallback_ios.json";
#elif UNITY_ANDROID
var assetId = "adapty_fallback_android.json";
#else
var assetId = "";
#endif
- Adapty.SetFallbackPaywalls(assetId, (error) => {
+ Adapty.SetFallback(assetId, (error) => {
// handle the error
});
}
```
Son kod örneğini [Unity'de yedek paywall kullanımı](unity-use-fallback-paywalls) sayfasında inceleyebilirsiniz.
## Paywall özellik erişimini güncelleme \{#update-paywall-property-access\}
Aşağıdaki özellikler `AdaptyPaywall`'dan `AdaptyPlacement`'a taşındı:
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywall(AdaptyPaywall paywall) {
- var abTestName = paywall.ABTestName;
- var audienceName = paywall.AudienceName;
- var revision = paywall.Revision;
- var placementId = paywall.PlacementId;
+ var abTestName = paywall.Placement.ABTestName;
+ var audienceName = paywall.Placement.AudienceName;
+ var revision = paywall.Placement.Revision;
+ var placementId = paywall.Placement.Id;
}
```
## Remote config erişimini güncelleme \{#update-remote-config-access\}
Remote config özellikleri, daha iyi bir yapı için `AdaptyRemoteConfig` nesnesi altında yeniden düzenlendi:
```diff showLineNumbers
using AdaptySDK;
void ProcessRemoteConfig(AdaptyPaywall paywall) {
- var remoteConfigString = paywall.RemoteConfigString;
- var locale = paywall.Locale;
- var remoteConfigDict = paywall.RemoteConfig;
+ var remoteConfigString = paywall.RemoteConfig.Data;
+ var locale = paywall.RemoteConfig.Locale;
+ var remoteConfigDict = paywall.RemoteConfig.Dictionary;
}
```
## AdaptyPaywall model kullanımını güncelleme \{#update-adaptypaywall-model-usage\}
`VendorProductIds` özelliği kullanımdan kaldırılmış olup yerine `ProductIdentifiers` geçmiştir. Yeni özellik, basit string'ler yerine `AdaptyProductIdentifier` nesneleri döndürerek daha yapılandırılmış ürün bilgisi sağlar.
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywallProducts(AdaptyPaywall paywall) {
- var productIds = paywall.VendorProductIds;
- foreach (var vendorId in productIds) {
- // use vendorId
- }
+ var productIdentifiers = paywall.ProductIdentifiers;
+ foreach (var productId in productIdentifiers) {
+ var vendorId = productId.VendorProductId;
+ // use vendorId
+ }
}
```
`AdaptyProductIdentifier` nesnesi, `VendorProductId` özelliği aracılığıyla satıcı ürün kimliğine erişim sağlar; aynı işlevselliği korurken gelecekteki geliştirmeler için daha iyi bir yapı sunar.
## GetPaywall fetch policy'sini güncelleme \{#update-getpaywall-fetch-policy\}
`GetPaywall` metodundaki `fetchPolicy` parametre türü `AdaptyPaywallFetchPolicy`'den `AdaptyPlacementFetchPolicy`'ye değiştirildi. Bu değişiklik, SDK genelinde fetch policy kullanımını birleştiriyor.
```diff showLineNumbers
using AdaptySDK;
void GetPaywall(string placementId) {
- Adapty.GetPaywall(placementId, AdaptyPaywallFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
+ Adapty.GetPaywall(placementId, AdaptyPlacementFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
// handle the result
});
}
```
---
# File: migration-to-unity-sdk-34
---
---
title: "Adapty Unity SDK'yı v3.4'e Taşıma"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Unity SDK v3.4'e geçiş yapın."
---
Adapty SDK 3.4.0, sizin tarafınızdan geçiş adımları gerektiren iyileştirmeler sunan büyük bir sürümdür.
## Yedek paywall dosyalarını güncelleme \{#update-fallback-paywall-files\}
Yeni SDK sürümüyle uyumluluğu sağlamak için yedek paywall dosyalarınızı güncelleyin:
1. Adapty Kontrol Paneli'nden [güncellenmiş yedek paywall dosyalarını indirin](fallback-paywalls).
2. Mobil uygulamanızdaki [mevcut yedek paywallları yeni dosyalarla değiştirin](unity-use-fallback-paywalls).
## Observer Mode uygulamasını güncelleme \{#update-implementation-of-observer-mode\}
Observer Mode kullanıyorsanız, uygulamasını güncellediğinizden emin olun.
Daha önce, işlemleri Adapty'ye bildirmek için farklı yöntemler kullanılıyordu. Yeni sürümde, hem Android hem de iOS'ta tutarlı biçimde `reportTransaction` yöntemi kullanılmalıdır. Bu yöntem, her işlemi açıkça Adapty'ye bildirir ve işlemin tanınmasını sağlar. Bir paywall kullanıldıysa, işlemi bununla ilişkilendirmek için variation ID'yi iletin.
:::warning
**İşlem bildirmeyi atlayın!**
`reportTransaction` çağrısını yapmazsanız Adapty işlemi tanımaz, işlem analizlerde görünmez ve entegrasyonlara gönderilmez.
:::
```diff showLineNumbers
- #if UNITY_ANDROID && !UNITY_EDITOR
- Adapty.RestorePurchases((profile, error) => {
- // handle the error
- });
- #endif
Adapty.ReportTransaction(
"YOUR_TRANSACTION_ID",
"PAYWALL_VARIATION_ID", // optional
(error) => {
// handle the error
});
```
---
# File: migration-to-unity330
---
---
title: "Adapty Unity SDK'yı v3.3'e Geçirme"
description: "Daha iyi performans ve yeni para kazanma özellikleri için Adapty Unity SDK v3.3'e geçin."
---
Adapty SDK 3.3.0, bazı iyileştirmeler getiren büyük bir sürümdür; ancak bu iyileştirmeler sizin tarafınızdan bazı geçiş adımları gerektirebilir.
1. Adapty SDK v3.3.x sürümüne yükseltin.
2. Adapty SDK'nın Adapty ve AdaptyUI modüllerindeki birden fazla sınıf, özellik ve yöntem yeniden adlandırıldı.
3. Artık `SetLogLevel` yöntemi bir callback'i argüman olarak kabul etmektedir.
4. Artık `PresentCodeRedemptionSheet` yöntemi bir callback'i argüman olarak kabul etmektedir.
5. Paywall görünümünün oluşturulma şeklini değiştirin.
6. `GetProductsIntroductoryOfferEligibility` yöntemini kaldırın.
7. Yedek paywallları `Assets/StreamingAssets/` dizininde ayrı dosyalara (platform başına bir tane) kaydedin ve dosya adlarını `SetFallbackPaywalls` yöntemine iletin.
8. Satın alma işlemini güncelleyin.
9. Paywall Builder olaylarının işlenmesini güncelleyin.
10. Paywall Builder paywall hatalarının işlenmesini güncelleyin.
11. Adjust, Amplitude, AppMetrica, Appsflyer, Branch, Firebase ve Google Analytics, Mixpanel, OneSignal, Pushwoosh için entegrasyon yapılandırmalarını güncelleyin.
13. Observer modu uygulamasını güncelleyin.
14. Unity eklentisi başlatmasını açık bir `Activate` çağrısıyla güncelleyin.
## Adapty Unity SDK'yı 3.3.x Sürümüne Yükseltin \{#upgrade-adapty-unity-sdk-to-33x\}
Bu sürüme kadar Adapty SDK, uygulamanızda Adapty'nin düzgün çalışması için zorunlu olan temel SDK'ydi; AdaptyUI SDK ise yalnızca Adapty Paywall Builder kullanıyorsanız gerekli hale gelen isteğe bağlı bir SDK'ydı.
3.3.0 sürümüyle birlikte AdaptyUI SDK kullanımdan kaldırılmış ve AdaptyUI, Adapty SDK'ya bir modül olarak dahil edilmiştir. Bu değişiklikler nedeniyle AdaptyUI SDK'yı kaldırıp AdaptySDK'yı yeniden yüklemeniz gerekmektedir.
1. **AdaptySDK** ve **AdaptyUISDK** paket bağımlılıklarını projenizden kaldırın.
2. **AdaptySDK** ve **AdaptyUISDK** klasörlerini silin.
3. AdaptySDK paketini [Unity için Adapty SDK kurulumu ve yapılandırması](sdk-installation-unity) sayfasında açıklandığı gibi yeniden içe aktarın.
## Yeniden Adlandırmalar \{#renamings\}
1. Adapty modülünde yeniden adlandır:
| Eski sürüm | Yeni sürüm |
| ------------------------- | ------------------------ |
| Adapty.sdkVersion | Adapty.SDKVersion |
| Adapty.LogLevel | AdaptyLogLevel |
| Adapty.Paywall | AdaptyPaywall |
| Adapty.PaywallFetchPolicy | AdaptyPaywallFetchPolicy |
| PaywallProduct | AdaptyPaywallProduct |
| Adapty.Profile | AdaptyProfile |
| Adapty.ProfileParameters | AdaptyProfileParameters |
| ProfileGender | AdaptyProfileGender |
| Error | AdaptyError |
2. AdaptyUI modülünde yeniden adlandırmalar:
| Eski versiyon | Yeni versiyon |
| ------------------ | ------------------ |
| CreatePaywallView | CreateView |
| PresentPaywallView | PresentView |
| DismissPaywallView | DismissView |
| AdaptyUI.View | AdaptyUIView |
| AdaptyUI.Action | AdaptyUIUserAction |
## SetLogLevel Metodunu Güncelleme \{#change-the-setloglevel-method\}
Artık `SetLogLevel` metodu bir callback kabul etmektedir.
```diff showLineNumbers
- Adapty.SetLogLevel(Adapty.LogLevel.Verbose);
+ Adapty.SetLogLevel(Adapty.LogLevel.Verbose, null); // or you can pass the callback to handle the possible error
```
## PresentCodeRedemptionSheet Metodunu Güncelleme \{#change-the-presentcoderedemptionsheet-method\}
Artık `PresentCodeRedemptionSheet` metodu bir callback kabul etmektedir.
```diff showLineNumbers
- Adapty.PresentCodeRedemptionSheet();
+ Adapty.PresentCodeRedemptionSheet(null); // or you can pass the callback to handle the possible error
```
## Paywall Görünümünün Oluşturulma Şeklini Değiştirme \{#change-how-the-paywall-view-is-created\}
Tam kod örneği için [Paywall Builder ile tasarlanan paywall'ın görünüm yapılandırmasını getirme](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) bölümüne bakın.
```diff showLineNumbers
+ var parameters = new AdaptyUICreateViewParameters()
+ .SetPreloadProducts(true);
- AdaptyUI.CreatePaywallView(
+ AdaptyUI.CreateView(
paywall,
- preloadProducts: true,
+ parameters,
(view, error) => {
// use the view
});
```
## GetProductsIntroductoryOfferEligibility Metodunu Kaldırma \{#remove-the-getproductsintroductoryoffereligibility-method\}
Adapty iOS SDK 3.3.0 öncesinde, ürün nesnesi kullanıcının uygun olup olmadığından bağımsız olarak her zaman teklifleri içeriyordu. Teklifi kullanmadan önce uygunluğu manuel olarak kontrol etmeniz gerekiyordu.
Artık ürün nesnesi yalnızca kullanıcı uygunsa teklif içermektedir. Bu sayede uygunluğu ayrıca kontrol etmenize gerek kalmaz; bir teklif mevcutsa kullanıcı zaten uygundur.
## Yedek paywall sağlama yöntemi güncellendi \{#update-method-for-providing-fallback-paywalls\}
Bu sürüme kadar yedek paywall'lar serileştirilmiş JSON olarak iletiliyordu. v 3.3.0 itibarıyla mekanizma değişti:
1. Yedek paywall'ları `/Assets/StreamingAssets/` dizinindeki dosyalara kaydedin; Android için bir dosya, iOS için ayrı bir dosya.
2. Dosya adlarını `SetFallbackPaywalls` metoduna geçirin.
Kodunuz şu şekilde değişecek:
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
+ #if UNITY_IOS
+ var assetId = "adapty_fallback_ios.json";
+ #elif UNITY_ANDROID
+ var assetId = "adapty_fallback_android.json";
+ #else
+ var assetId = "";
+ #endif
- Adapty.SetFallbackPaywalls("FALLBACK_PAYWALLS_JSON_STRING", (error) => {
+ Adapty.SetFallbackPaywalls(assetId, (error) => {
// handle the error
});
}
```
Son kod örneğini [Unity'de yedek paywall kullanımı](unity-use-fallback-paywalls) sayfasında inceleyebilirsiniz.
## Satın alma güncelleme \{#update-making-purchase\}
Daha önce iptal edilen ve beklemedeki satın almalar hata olarak değerlendirilir ve sırasıyla `PaymentCancelled` ve `PendingPurchase` kodlarını döndürürdü.
Artık iptal edilen, başarılı ve beklemedeki satın almaları işlemek için yeni bir `AdaptyPurchaseResultType` sınıfı kullanılıyor. Satın alma kodunu aşağıdaki şekilde güncelleyin:
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
- Adapty.MakePurchase(product, (profile, error) => {
- // handle successfull purchase
+ Adapty.MakePurchase(product, (result, error) => {
+ switch (result.Type) {
+ case AdaptyPurchaseResultType.Pending:
+ // handle pending purchase
+ break;
+ case AdaptyPurchaseResultType.UserCancelled:
+ // handle purchase cancellation
+ break;
+ case AdaptyPurchaseResultType.Success:
+ var profile = result.Profile;
+ // handle successful purchase
+ break;
+ default:
+ break;
}
});
}
```
Lütfen çevirmek istediğiniz MDX belgesini paylaşın.
## Paywall Builder olaylarının işlenmesini güncelleme \{#update-handling-of-paywall-builder-events\}
İptal edilen ve bekleyen satın almalar artık hata olarak değerlendirilmiyor; tüm bu durumlar `PaywallViewDidFinishPurchase` metodu ile işleniyor.
1. İptal edilen satın alma olayının işlenmesini silin.
2. Başarılı satın alma olayının işlenmesini aşağıdaki şekilde güncelleyin:
```diff showLineNumbers
- public void OnFinishPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Profile profile
- ) { }
+ public void PaywallViewDidFinishPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyPurchaseResult purchasedResult
+ ) { }
```
3. Aksiyon işlemeyi güncelleyin:
```diff showLineNumbers
- public void OnPerformAction(
- AdaptyUI.View view,
- AdaptyUI.Action action
- ) {
+ public void PaywallViewDidPerformAction(
+ AdaptyUIView view,
+ AdaptyUIUserAction action
+ ) {
switch (action.Type) {
- case AdaptyUI.ActionType.Close:
+ case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
- case AdaptyUI.ActionType.OpenUrl:
+ case AdaptyUIUserActionType.OpenUrl:
var urlString = action.Value;
if (urlString != null {
Application.OpenURL(urlString);
}
default:
// handle other events
break;
}
}
```
4. Başlatılan satın alma işleminin yönetimini güncelleyin:
```diff showLineNumbers
- public void OnSelectProduct(
- AdaptyUI.View view,
- Adapty.PaywallProduct product
- ) { }
+ public void PaywallViewDidSelectProduct(
+ AdaptyUIView view,
+ string productId
+ ) { }
```
5. Başarısız satın alma işleminin yönetimini güncelleyin:
```diff showLineNumbers
- public void OnFailPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyError error
+ ) { }
```
6. Başarılı geri yükleme olayının işlenmesini güncelleyin:
Check out the final code example in the [Handle paywall events](unity-handling-events) page.
## Paywall Builder paywall hatalarının işlenmesini güncelleyin \{#update-handling-of-paywall-builder-paywall-errors\}
Hata işleme yöntemi de değiştirildi; lütfen aşağıdaki rehbere göre kodunuzu güncelleyin.
1. Ürün yükleme hatalarının işlenmesini güncelleyin:
```diff showLineNumbers
- public void OnFailLoadingProducts(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailLoadingProducts(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
2. Render hatalarının işlenmesini güncelleyin:
```diff showLineNumbers
- public void OnFailRendering(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailRendering(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
## Üçüncü Taraf Entegrasyon SDK Yapılandırmasını Güncelleme \{#update-third-party-integration-sdk-configuration\}
Adapty Unity SDK 3.3.0'dan itibaren `updateAttribution` metodunun genel API'si güncellendi. Daha önce `[AnyHashable: Any]` sözlüğü kabul ediyordu ve attribution nesnelerini çeşitli servislerden doğrudan geçirmenize olanak tanıyordu. Artık `[String: any Sendable]` gerektirmektedir, bu nedenle attribution nesnelerini geçirmeden önce dönüştürmeniz gerekecektir.
Aşağıdaki entegrasyonların Adapty Unity SDK 3.3.0 ve sonrasıyla düzgün çalışmasını sağlamak için SDK yapılandırmalarınızı aşağıdaki bölümlerde açıklandığı şekilde güncelleyin.
### Adjust
Mobil uygulama kodunuzu aşağıdaki gibi güncelleyin. Tam kod örneği için [Adjust entegrasyonu için SDK yapılandırması](adjust#connect-your-app-to-adjust) sayfasına bakın.
```diff showLineNumbers
- using static AdaptySDK.Adapty;
using AdaptySDK;
Adjust.GetAdid((adid) => {
- Adjust.GetAttribution((attribution) => {
- Dictionary