---
title: "iOS SDK'da remote config paywallları için paywall ve ürün bilgilerini çekme"
description: "Kullanıcı monetizasyonunu artırmak için Adapty iOS SDK'da paywall ve ürün bilgilerini çekin."
---

Remote config ve özel paywallları göstermeden önce, bunlara ait bilgileri çekmeniz gerekir. Bu konunun yalnızca remote config ve özel paywall'larla ilgili olduğunu unutmayın. Paywall Builder ile özelleştirilmiş paywalllar için bilgi çekme adımlarına ulaşmak istiyorsanız <InlineTooltip tooltip="guides on how to fetch Paywall Builder paywalls in your app">[iOS](get-pb-paywalls), [Android](android-get-pb-paywalls), [React Native](react-native-get-pb-paywalls), [Flutter](flutter-get-pb-paywalls) ve [Unity](unity-get-pb-paywalls)</InlineTooltip> belgelerine 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.

:::

<details>
   <summary>Mobil uygulamanızda paywall ve ürün bilgilerini çekmeye başlamadan önce (genişletmek için tıklayın)</summary>

   1. Adapty Kontrol Paneli'nde [ürünlerinizi oluşturun](create-product).

2. Adapty Kontrol Paneli'nde [bir paywall oluşturun ve ürünleri bu paywall'a ekleyin](create-paywall).

3. Adapty Kontrol Paneli'nde [placement'lar oluşturun ve paywall'ınızı bir placement'a ekleyin](create-placement).

4. Mobil uygulamanıza [Adapty SDK'yı kurun](sdk-installation-ios).
</details>

## Paywall bilgilerini çekme \{#fetch-paywall-information\}

Adapty'de bir [ürün](product), hem App Store hem de Google Play'den ürünlerin birleşimini temsil eder. Bu çapraz platform ürünler, belirli mobil uygulama placement'larında gösterebilmek için paywallara entegre edilir.

Ürünleri gösterebilmek için `getPaywall` metodunu kullanarak [placement](placements)'larınızdan birinden bir [Paywall](paywalls) almanız gerekir.

:::important
**Ürün ID'lerini koda gömmayın.** Koda gömmeniz gereken tek ID, placement ID'sidir. Paywalllar uzaktan yapılandırıldığından, ürün sayısı ve mevcut teklifler her an değişebilir. Uygulamanız bu değişiklikleri dinamik olarak yönetebilmeli; bugün iki ürün döndüren bir paywall yarın üç ürün döndürüyorsa, kod değişikliğine gerek kalmadan hepsini göstermelidir.
:::

<Tabs group="current-os">
<TabItem value="swift" label="Swift">
```swift showLineNumbers
do {
    let paywall = try await Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID")
    // the requested paywall
} catch {
    // handle the error
}
```

</TabItem>
<TabItem value="callback" label="Swift-Callback">

```swift showLineNumbers
Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in
    switch result {
        case let .success(paywall):
            // the requested paywall
        case let .failure(error):
            // handle the error
    }
}
```

</TabItem>
</Tabs>

| Parametre | Zorunluluk | Açıklama |
|---------|--------|-----------|
| **placementId** | zorunlu | [Placement](placements)'ın tanımlayıcısı. Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. |
| **locale** | <p>isteğe bağlı</p><p>varsayılan: `en`</p> | <p>[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.</p><p></p><p>Örnek: `en` İngilizce anlamına gelir; `pt-br` Brezilya Portekizcesini temsil eder.</p><p></p><p>Yerel ayar kodları ve kullanım önerileri hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.</p> |
| **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` | <p>SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye ulaşmasını sağladığından bu seçeneği öneriyoruz.</p><p></p><p>Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en güncel veriye her zaman ulaşamayabilir, ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum sırasında gereksiz ağ isteklerinden kaçınmak için güvenle kullanılabilir.</p><p></p><p>Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.</p><p></p><p>Adapty SDK, paywallları iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı çekmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanılır. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile paywalllarınızın en güncel sürümünü almanızı sağlamak için tasarlanmıştır.</p> |
| **loadTimeout** | varsayılan: 5 sn | <p>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.</p><p></p><p>Nadir durumlarda bu metod, işlem arka planda farklı isteklerden oluşabileceğinden `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabilir.</p> |

Ürün ID'lerini koda gömmayın! Paywalllar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları ele aldığından emin olun.  
Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız o 2 ürünü göstermelidir. Ancak daha sonra 3 ürün geliyorsa, herhangi bir kod değişikliği gerektirmeden 3'ünü de göstermelidir. Koda gömmeniz gereken tek şey placement ID'sidir.

Yanıt parametreleri:

| Parametre | Açıklama |
| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Paywall   | Ürün ID'leri listesi, paywall tanımlayıcısı, remote config ve diğer çeşitli özellikler içeren bir [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) nesnesi. |

## Ürünleri çekme \{#fetch-products\}

Paywall'ı aldıktan sonra, ona karşılık gelen ürün dizisini sorgulayabilirsiniz:

<Tabs group="current-os">
<TabItem value="swift" label="Swift">
```swift showLineNumbers
do {
    let products = try await Adapty.getPaywallProducts(paywall: paywall)
    // the requested products array
} catch {
    // handle the error
}
```

</TabItem>
<TabItem value="callback" label="Swift-Callback">

```swift showLineNumbers
Adapty.getPaywallProducts(paywall: paywall) { result in    
    switch result {
    case let .success(products):
        // the requested products array
    case let .failure(error):
        // handle the error
    }
}
```
</TabItem>
</Tabs>

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 özellikler içeren [`AdaptyPaywallProduct`](https://swift.adapty.io/documentation/adapty/adaptypaywallproduct) nesnelerinin listesi. |

Kendi paywall tasarımınızı uygularken [`AdaptyPaywallProduct`](https://swift.adapty.io/documentation/adapty/adaptypaywallproduct) nesnesindeki bu özelliklere ihtiyaç duyacaksınız. Aşağıda en sık kullanılan özellikler açıklanmaktadır; tüm mevcut özellikler için bağlantılı belgeye bakın.

| Özellik | Açıklama |
|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Title** | Ürünün başlığını göstermek için `product.localizedTitle` kullanın. Yerelleştirmenin cihazın dilini değil, kullanıcının seçtiği mağaza ülkesini baz aldığını unutmayın. |
| **Price** | Fiyatın yerelleştirilmiş sürümünü göstermek için `product.localizedPrice` kullanın. Bu yerelleştirme cihazın yerel ayar bilgisine göre yapılır. Fiyata sayısal olarak `product.price` üzerinden de erişebilirsiniz. Değer yerel para biriminde verilir. İlgili para birimi sembolünü almak için `product.currencySymbol` kullanın. |
| **Subscription Period** | Periyodu (hafta, ay, yıl vb.) göstermek için `product.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme cihazın yerel ayarına göre yapılır. Abonelik periyoduna programatik olarak erişmek için `product.subscriptionPeriod` kullanın. Buradan süreyi almak için `unit` enum'una (gün, hafta, ay, yıl veya bilinmiyor) erişebilirsiniz. `numberOfUnits` değeri, periyot birimi sayısını verir. Örneğin üç aylık bir abonelik için unit özelliğinde `.month`, numberOfUnits'te ise `3` görürsünüz. |
| **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerip içermediğini göstermek için `product.subscriptionOffer` özelliğine bakın. Bu nesne aşağıdaki yararlı özellikleri içerir:<br/>• `offerType`: `introductory`, `promotional` ve `winBack` değerlerini alan bir enum. Ücretsiz denemeler ve başlangıç indirimli abonelikler `introductory` türündedir.<br/>• `price`: İndirimli fiyat, sayısal olarak. Ücretsiz denemeler için burada `0` değerini arayın.<br/>• `localizedPrice`: Kullanıcının yerel ayarına göre biçimlendirilmiş indirim fiyatı.<br/>• `localizedNumberOfPeriods`: Teklifin süresini cihazın yerel ayarıyla yerelleştirilmiş olarak açıklayan bir dize. Örneğin üç günlük deneme teklifi bu alanda `3 days` olarak görünür.<br/>• `subscriptionPeriod`: Teklif periyodunun ayrıntılarına bu özellik aracılığıyla da erişebilirsiniz; önceki bölümde açıklandığı gibi çalışır.<br/>• `localizedSubscriptionPeriod`: Kullanıcının yerel ayarına göre biçimlendirilmiş indirim abonelik periyodu. |

## iOS'ta başlangıç teklifi uygunluğunu kontrol etme \{#check-intro-offer-eligibility-on-ios\}

`getPaywallProducts` metodu varsayılan olarak başlangıç, promosyon ve geri kazanma teklifleri için uygunluğu kontrol eder. SDK teklif uygunluğunu belirlemeden önce ürünleri göstermeniz gerekiyorsa, bunun yerine `getPaywallProductsWithoutDeterminingOffer` metodunu kullanın.

:::note
İlk ürünleri gösterdikten sonra, ürünleri doğru teklif uygunluk bilgileriyle güncellemek için normal `getPaywallProducts` metodunu çağırmayı unutmayın.
:::

<Tabs group="current-os">
<TabItem value="swift" label="Swift">
```swift showLineNumbers
do {
    let products = try await Adapty.getPaywallProductsWithoutDeterminingOffer(paywall: paywall)
    // the requested products array without subscriptionOffer
} catch {
    // handle the error
}
```
</TabItem>
<TabItem value="callback" label="Swift-Callback">

```swift showLineNumbers
Adapty.getPaywallProductsWithoutDeterminingOffer(paywall: paywall) { result in    
    switch result {
    case let .success(products):
        // the requested products array without subscriptionOffer
    case let .failure(error):
        // handle the error
    }
}
```
</TabItem>
</Tabs>

## Varsayılan kitle paywall'ı ile paywall çekmeyi hızlandırma \{#speed-up-paywall-fetching-with-default-audience-paywall\}

Paywalllar genellikle neredeyse anında çekilir, bu yüzden bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve paywall'ınız varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, paywall çekme işlemi beklenenden daha uzun sürebilir. Böyle durumlarda hiç paywall göstermemek yerine kullanıcı deneyimini sorunsuz tutmak için varsayılan bir paywall görüntülemek isteyebilirsiniz.

Bu sorunu çözmek için **All Users** kitlesine ait belirtilen placement'ın paywall'ını çeken `getPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Paywall Bilgilerini Çekme](fetch-paywalls-and-products#fetch-paywall-information) bölümünde açıklandığı gibi `getPaywall` metodunu kullanmak olduğunu bilmeniz önemlidir.

:::warning
Neden `getPaywall` kullanmanızı öneriyoruz

`getPaywallForDefaultAudience` metodunun bazı önemli dezavantajları vardır:

- **Geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri için farklı paywalllar göstermeniz gerekiyorsa zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywalllar tasarlamanız ya da mevcut (eski) sürümdeki kullanıcıların düzgün render edilemeyen paywalllarla karşılaşabileceğini kabul etmeniz gerekir.
- **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görür; bu da ülkeye, pazarlama attribution'ına veya kendi özel niteliklerinize dayalı kişiselleştirilmiş hedeflemeyi kaybetmeniz anlamına gelir.

Bu dezavantajları kabul ederek daha hızlı paywall çekme avantajından yararlanmak istiyorsanız `getPaywallForDefaultAudience` metodunu aşağıdaki gibi kullanabilirsiniz. Aksi hâlde [yukarıda](fetch-paywalls-and-products#fetch-paywall-information) açıklanan `getPaywall` metodunu kullanmaya devam edin.
:::

<Tabs group="current-os">
<TabItem value="swift" label="Swift">
```swift showLineNumbers
do {
    let paywall = try await Adapty.getPaywallForDefaultAudience("YOUR_PLACEMENT_ID")
   // the requested paywall
} catch {
    // handle the error
}
```

</TabItem>
<TabItem value="callback" label="Swift-Callback">

```swift showLineNumbers
Adapty.getPaywallForDefaultAudience(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in
    switch result {
        case let .success(paywall):
            // the requested paywall
        case let .failure(error):
            // handle the error
    }
}
```
</TabItem>
</Tabs>

:::note
`getPaywallForDefaultAudience` metodu iOS SDK 2.11.2 sürümünden itibaren kullanılabilir.
:::

| Parametre | Zorunluluk | Açıklama |
|---------|--------|-----------|
| **placementId** | zorunlu | [Placement](placements)'ın tanımlayıcısı. Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. |
| **locale** | <p>isteğe bağlı</p><p>varsayılan: `en`</p> | <p>[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dili, ikincisi ise bölgeyi belirtir.</p><p></p><p>Örnek: `en` İngilizce anlamına gelir; `pt-br` Brezilya Portekizcesini temsil eder.</p><p></p><p>Yerel ayar kodları ve kullanım önerileri hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.</p> |
| **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` | <p>SDK varsayılan olarak sunucudan veri yüklemeye çalışır; başarısız olursa önbellekteki veriyi döndürür. Kullanıcılarınızın her zaman en güncel veriye ulaşmasını sağladığından bu seçeneği öneriyoruz.</p><p></p><p>Ancak kullanıcılarınızın internet bağlantısının kararsız olduğunu düşünüyorsanız, önbellekte veri varsa onu döndürmek için `.returnCacheDataElseLoad` seçeneğini kullanabilirsiniz. Bu durumda kullanıcılar en güncel veriye her zaman ulaşamayabilir, ancak internet bağlantısından bağımsız olarak daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir; bu nedenle oturum sırasında gereksiz ağ isteklerinden kaçınmak için güvenle kullanılabilir.</p><p></p><p>Önbelleğin uygulama yeniden başlatıldığında silinmediğini, yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.</p> |