### Giriş/kayıt sırasında \{#during-loginsignup\}
Kullanıcıları uygulama başlatıldıktan sonra tanımlıyorsanız (örneğin, uygulamanıza giriş yaptıktan veya kayıt olduktan sonra), customer user ID'yi ayarlamak için `identify` metodunu kullanın.
- Bu customer user ID'yi **daha önce kullanmadıysanız**, Adapty onu otomatik olarak mevcut profile bağlar.
- Bu customer user ID'yi **daha önce kullanıcıyı tanımlamak için kullandıysanız**, Adapty bu customer user ID ile ilişkili profille çalışmaya geçer.
:::important
Müşteri kullanıcı kimlikleri her kullanıcı için benzersiz olmalıdır. Parametre değerini sabit kodlarsanız, tüm kullanıcılar aynı kişi olarak değerlendirilir.
:::
Diğer SDK metodlarını çağırmadan önce her zaman `identify` işlemini `await` ile bekleyin. Eş zamanlı çağrılar `#3006 profileWasChanged` hatasına yol açar ya da anonim profile düşer. Bkz. [React Native SDK'da çağrı sırası](react-native-sdk-call-order).
```typescript showLineNumbers
try {
await adapty.identify("YOUR_USER_ID"); // Her kullanıcı için benzersiz
// successfully identified
} catch (error) {
// handle the error
}
```
### SDK etkinleştirme sırasında \{#during-the-sdk-activation\}
SDK'yı etkinleştirdiğinizde zaten bir customer user ID biliyorsanız, `identify`'ı ayrıca çağırmak yerine bunu `activate` metodunda gönderebilirsiniz.
Customer user ID biliyorsanız ancak bunu yalnızca etkinleştirmeden sonra ayarlıyorsanız, etkinleştirme sırasında Adapty yeni bir anonim profil oluşturacak ve `identify` çağrısından sonra mevcut profile geçecektir.
Mevcut bir customer user ID (daha önce kullandığınız) veya yeni bir tane gönderebilirsiniz. Yeni bir tane gönderirseniz, etkinleştirme sırasında oluşturulan yeni profil otomatik olarak customer user ID'ye bağlanır.
:::note
Varsayılan olarak, anonim profil oluşturma, kurulumlar cihaz ID'lerine göre sayıldığı için analitik panolarını etkilemez.
Bir cihaz ID'si, cihazdaki mağazadan yapılan tek bir uygulama kurulumunu temsil eder ve yalnızca uygulama yeniden yüklendikten sonra yeniden oluşturulur.
Bu, bunun ilk mi yoksa tekrar mı yükleme olduğundan ya da mevcut bir customer user ID kullanılıp kullanılmadığından bağımsızdır.
Profil oluşturma (SDK etkinleştirme veya oturum kapatma sırasında), giriş yapma veya uygulamayı yeniden yüklemeden yükseltme, ek kurulum olayı oluşturmaz.
Kurulumları cihazlar yerine benzersiz kullanıcılara göre saymak istiyorsanız, **App settings** bölümüne gidin ve [**Installs definition for analytics**](general#4-installs-definition-for-analytics) ayarını yapılandırın.
:::
```typescript showLineNumbers
adapty.activate("PUBLIC_SDK_KEY", {
customerUserId: "YOUR_USER_ID" // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
});
```
### Kullanıcıların oturumunu kapatma \{#log-users-out\}
Kullanıcıların oturumunu kapatmak için bir butonunuz varsa, `logout` metodunu kullanın.
:::important
Kullanıcının oturumunu kapatmak, kullanıcı için yeni bir anonim profil oluşturur.
:::
```typescript showLineNumbers
try {
await adapty.logout();
// successful logout
} catch (error) {
// handle the error
}
```
:::info
Kullanıcıları uygulamaya tekrar giriş yaptırmak için `identify` metodunu kullanın.
:::
### Giriş yapmadan satın almaya izin verme \{#allow-purchases-without-login\}
Kullanıcılarınız uygulamanıza giriş yapmadan önce ve sonra satın alma yapabiliyorsa, giriş yaptıktan sonra erişimlerini koruyacaklarından emin olmanız gerekir:
1. Oturumu kapalı bir kullanıcı satın alma yaptığında, Adapty bunu anonim profil ID'siyle ilişkilendirir.
2. Kullanıcı hesabına giriş yaptığında, Adapty tanımlanmış profiliyle çalışmaya geçer.
- Yeni bir customer user ID ise (örneğin, satın alma kayıt öncesinde yapıldıysa), Adapty customer user ID'yi mevcut profile atar ve tüm satın alma geçmişi korunur.
- Mevcut bir customer user ID ise (customer user ID zaten bir profille bağlantılıysa), profil değişikliğinden sonra gerçek access level'ı almanız gerekir. Tanımlamanın hemen ardından [`getProfile`](react-native-check-subscription-status) çağırabilir veya verilerin otomatik senkronize edilmesi için [profil güncellemelerini dinleyebilirsiniz](react-native-check-subscription-status).
## Sonraki adımlar \{#next-steps\}
Tebrikler! Uygulamanızda uygulama içi ödeme mantığını hayata geçirdiniz! Uygulama monetizasyonunuzda başarılar dileriz!
Adapty'den daha fazla yararlanmak için şu konuları inceleyebilirsiniz:
- [**Test etme**](troubleshooting-test-purchases): Her şeyin beklendiği gibi çalıştığından emin olun
- [**Onboarding'ler**](react-native-onboardings): Onboarding'lerle kullanıcıları etkileyin ve elde tutma oranını artırın
- [**Entegrasyonlar**](configuration): Tek satır kodla pazarlama attribution ve analitik hizmetleriyle entegre olun
- [**Özel profil özellikleri ayarlama**](react-native-setting-user-attributes): Kullanıcı profillerine özel özellikler ekleyin ve segmentler oluşturun; böylece A/B testleri başlatabilir veya farklı kullanıcılara farklı paywall'lar gösterebilirsiniz
---
# File: adapty-sdk-integration-skill-react-native
---
---
title: "SDK entegrasyon becerisini kullanarak Adapty'yi React Native uygulamanıza entegre edin"
description: "Adapty SDK'sını React Native uygulamanıza baştan sona entegre etmek için AI kodlama aracınızla adapty-sdk-integration becerisini kullanın."
---
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
:::important
Bu beceri beta aşamasındadır. Takılı kalır veya beklenmedik şekilde davranırsa, [adım adım entegrasyon kılavuzunu](adapty-cursor-react-native) takip edin — AI aracınızı her aşamada doğru belgelerle yönlendirir.
:::
[adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill), Adapty entegrasyonunu uçtan uca otomatikleştirir: kontrol paneli kurulumu, SDK kurulumu, paywall ve her aşama için doğrulama. Platformunuzu otomatik olarak algılar ve her aşamada ilgili Adapty dokümanlarını getirir.
**Desteklenen araçlar**: Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Kurulum için aracınıza uygun formu seçin. Tam liste [skill README](https://github.com/adaptyteam/adapty-sdk-integration-skill) dosyasında yer almaktadır.
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex veya başka bir araç** — [skills CLI](https://skills.sh)'yi kullanın (bu şekilde kurulan skill'ler otomatik olarak güncellenmez):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Alternatif olarak, repo'yu klonlayıp `skills/adapty-sdk-integration/` dizinini aracınızın skill'ler klasörüne kopyalayabilirsiniz.
Kurulumdan sonra skill'i projenizde çalıştırın:
```
/adapty-sdk-integration
```
Skill birkaç kurulum sorusu sorar, ardından kontrol paneli kurulumu, SDK kurulumu, paywall ve doğrulama adımlarında sizi yönlendirir.
---
# File: adapty-cursor-react-native
---
---
title: "Adapty'yi AI yardımıyla React Native uygulamanıza entegre edin"
description: "Cursor, Context7, ChatGPT, Claude veya diğer AI araçlarını kullanarak Adapty'yi React Native uygulamanıza adım adım entegre etme kılavuzu."
---
Bu kılavuz, bir yapay zeka kodlama aracıyla React Native uygulamanıza Adapty'yi adım adım entegre etmenizi anlatıyor — doğru Adapty dokümanlarını doğru sırayla besleyerek ilerleyebilirsiniz.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Başlamadan önce: kontrol paneli kurulumu \{#before-you-start-dashboard-setup\}
Adapty, herhangi bir SDK kodu yazmadan önce kontrol panelinde bazı yapılandırmalar yapılmasını gerektirir. Bunu etkileşimli bir LLM aracıyla ya da Kontrol Paneli üzerinden manuel olarak yapabilirsiniz.
### Skill yaklaşımı (önerilen) \{#skill-approach-recommended\}
Adapty CLI skill, LLM'inizin uygulamanızı, ürünlerinizi, access level'larınızı, paywall'larınızı ve placement'larınızı doğrudan ayarlamasını sağlar — her adım için Kontrol Paneli'ni açmanıza gerek kalmaz. Yalnızca Kontrol Paneli'nde [mağazalarınızı bağlamanız](integrate-payments) yeterlidir.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Skill eklendikten sonra agent'ınızda `/adapty-cli` komutunu çalıştırın. Mağazalarınızı bağlamak için Kontrol Paneli'ni ne zaman açmanız gerektiği de dahil olmak üzere her adımda sizi yönlendirecektir.
### Kontrol Paneli Yaklaşımı \{#dashboard-approach\}
Her şeyi manuel olarak yapılandırmayı tercih ediyorsanız, herhangi bir kod yazmadan önce bunlara ihtiyacınız var. LLM'iniz kontrol paneli değerlerini sizin için bulamaz; bunları kendiniz sağlamanız gerekir.
1. **Uygulama mağazalarınızı bağlayın**: Adapty Kontrol Paneli'nde **App settings → General** bölümüne gidin. Uygulamanız her iki platformu da hedefliyorsa App Store ve Google Play'i bağlayın. Satın almaların çalışması için bu gereklidir.
[Uygulama mağazalarını bağla](integrate-payments)
2. **Public SDK anahtarınızı kopyalayın**: Adapty Kontrol Paneli'nde **App settings → General** sayfasına gidin ve **API keys** bölümünü bulun. Kodda bu, `adapty.activate("YOUR_PUBLIC_SDK_KEY")` çağrısına geçirdiğiniz string'dir.
3. **En az bir ürün oluşturun**: Adapty Kontrol Paneli'nde **Products** sayfasına gidin. Ürünlere koddan doğrudan erişmenize gerek yok — Adapty bunları paywall'lar aracılığıyla iletir.
[Ürün ekle](quickstart-products)
4. **Paywall ve placement oluşturun**: Adapty Kontrol Paneli'nde **Paywalls** sayfasında bir paywall oluşturun, ardından **Placements** sayfasında bir placement'a atayın. Kodda, placement ID'si `adapty.getPaywall("YOUR_PLACEMENT_ID")` fonksiyonuna geçirdiğiniz string değerdir.
[Paywall oluştur](quickstart-paywalls)
5. **Access level'ları ayarlayın**: Adapty Kontrol Paneli'nde, **Products** sayfasından her ürün için yapılandırın. Kodda, `profile.accessLevels['premium']?.isActive` içinde kontrol edilen string'dir. Varsayılan `premium` access level çoğu uygulama için yeterlidir. Ödeme yapan kullanıcılar ürüne göre farklı özelliklere erişiyorsa (örneğin `basic` plan ile `pro` plan), kodlamaya başlamadan önce [ek access level'lar oluşturun](assigning-access-level-to-a-product).
:::tip
Beşine de sahip olduğunuzda, kod yazmaya hazırsınız. LLM'inize şunu söyleyin: "Public SDK anahtarım X, placement ID'im Y" — böylece doğru başlatma ve paywall çekme kodunu üretebilir.
:::
### Hazır olduğunuzda kurulum \{#set-up-when-ready\}
Kodlamaya başlamak için bunlar gerekli değildir, ancak entegrasyonunuz olgunlaştıkça bunlara ihtiyaç duyacaksınız:
- **A/B testleri**: **Placements** sayfasından yapılandırın. Kod değişikliği gerekmez.
[A/B testleri](ab-tests)
- **Ek paywall'lar ve placement'lar**: Farklı placement ID'leriyle daha fazla `getPaywall` çağrısı ekleyin.
- **Analitik entegrasyonlar**: **Integrations** sayfasından yapılandırın. Kurulum entegrasyona göre değişir. Bkz. [analitik entegrasyonlar](analytics-integration) ve [attribution entegrasyonlar](attribution-integration).
## LLM'inize Adapty Dokümanlarını Besleyin \{#feed-adapty-docs-to-your-llm\}
### Context7'yi Kullanın (önerilen)
[Context7](https://context7.com), LLM'inizin güncel Adapty belgelerine doğrudan erişmesini sağlayan bir MCP sunucusudur. LLM'iniz, sorduğunuz şeye göre doğru belgeleri otomatik olarak getirir — URL yapıştırmanıza gerek kalmaz.
Context7; **Cursor**, **Claude Code**, **Windsurf** ve diğer MCP uyumlu araçlarla çalışır. Kurulum için şunu çalıştırın:
```
npx ctx7 setup
```
Bu komut, kullandığınız editörü algılar ve Context7 sunucusunu yapılandırır. Manuel kurulum için [Context7 GitHub deposuna](https://github.com/upstash/context7) bakın.
Yapılandırıldıktan sonra, Adapty kütüphanesine prompt'larınızda şu şekilde referans verin:
```
Use the adaptyteam/adapty-docs library to look up how to install the React Native SDK
```
:::warning
Context7, dok bağlantılarını elle yapıştırma ihtiyacını ortadan kaldırsa da uygulama sırası önemlidir. Her şeyin düzgün çalıştığından emin olmak için aşağıdaki [uygulama adımlarını](#implementation-walkthrough) sırayla takip edin.
:::
### Düz metin dokümanları kullanın \{#use-plain-text-docs\}
Her Adapty dokümanına düz metin Markdown olarak erişebilirsiniz. URL'nin sonuna `.md` ekleyin ya da makale başlığının altındaki **Copy for LLM** butonuna tıklayın. Örnek: [adapty-cursor-react-native.md](https://adapty.io/docs/tr/adapty-cursor-react-native.md).
Aşağıdaki [uygulama adım adım rehberindeki](#implementation-walkthrough) her adım, yapıştırabileceğiniz `.md` bağlantılarını içeren "LLM'inize gönderin" bloğu içerir.
Daha fazla dokümanı aynı anda görüntülemek için aşağıdaki [indeks dosyaları ve platforma özgü alt kümeler](#plain-text-doc-index-files) bölümüne bakın.
## Uygulama adım adım rehberi \{#implementation-walkthrough\}
Bu rehberin geri kalanı, Adapty entegrasyonunu uygulama sırasına göre adım adım ele alır. Her aşamada LLM'inize göndereceğiniz belgeler, tamamlandığında ne görmeniz gerektiği ve sık karşılaşılan sorunlar açıklanmaktadır.
### Entegrasyonunuzu planlayın \{#plan-your-integration\}
Koda geçmeden önce, LLM'inizden projenizi analiz etmesini ve bir uygulama planı oluşturmasını isteyin. AI aracınız bir planlama modunu destekliyorsa (Cursor'ın veya Claude Code'un plan modu gibi), LLM'nin herhangi bir kod yazmadan önce hem proje yapınızı hem de Adapty dokümanlarını okuyabilmesi için bunu kullanın.
LLM'inize satın almalar için hangi yaklaşımı kullandığınızı söyleyin — bu, izlemesi gereken kılavuzları etkiler:
- [**Adapty Paywall Builder**](adapty-paywall-builder): Adapty'nin no-code builder'ında paywall'lar oluşturursunuz ve SDK bunları otomatik olarak render eder.
- [**Manuel oluşturulan paywall'lar**](react-native-making-purchases): Kendi paywall arayüzünüzü kodla oluşturursunuz, ancak ürünleri almak ve satın almaları yönetmek için yine de Adapty'yi kullanırsınız.
- [**Observer mode**](observer-vs-full-mode): Mevcut satın alma altyapınızı korur ve Adapty'yi yalnızca analitik ve entegrasyonlar için kullanırsınız.
Hangisini seçeceğinizden emin değil misiniz? [Hızlı başlangıçtaki karşılaştırma tablosunu](react-native-quickstart-paywalls) okuyun.
### SDK'yı yükleyin ve yapılandırın \{#install-and-configure-the-sdk\}
Adapty SDK bağımlılığını npm (veya yarn) ile ekleyin ve Public SDK anahtarınızla etkinleştirin. Bu, temel adımdır — geri kalan her şey buna bağlıdır.
Expo ve saf React Native projeleri için ayrı kurulum kılavuzlarımız var — kurulumunuza uyan kılavuzu seçin.
**Kılavuzlar:**
- [Expo ile kurulum](sdk-installation-react-native-expo)
- [Saf React Native ile kurulum](sdk-installation-react-native-pure)
:::tip[Checkpoint]
- **Beklenen:** Uygulama hem iOS hem Android'de derleniyor ve çalışıyor. Metro bundler loglarında Adapty aktivasyon logu görünüyor.
- **Dikkat:** "Public API key is missing" → **App settings** bölümündeki gerçek anahtarınızla placeholder'ı değiştirdiğinizi kontrol edin.
:::
### Paywallları göster ve satın almaları yönet \{#show-paywalls-and-handle-purchases\}
Placement ID ile bir paywall getir, göster ve satın alma olaylarını yönet. İhtiyacın olan kılavuzlar, satın almaları nasıl yönettiğine göre değişir.
Her satın almayı ilerlerken sandbox'ta test et — sona bırakma. Kurulum talimatları için [Sandbox'ta satın almaları test et](test-purchases-in-sandbox) sayfasına bak.
Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
Adapty SDK, paywall'ları yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](fallback-paywalls). Ayrıca paywall'ları daha hızlı getirmek için CDN'i ve CDN erişilemez olduğunda bağımsız bir yedek sunucuyu kullanırız. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman paywall'larınızın en son sürümünü almanızı garanti etmek için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, bu metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa, önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun, işlem alt katmanda farklı isteklerden oluşabileceği için `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın.
Android için: `TimeInterval`'ı uzantı fonksiyonlarıyla (`5.seconds` gibi, burada `.seconds`, `import com.adapty.utils.seconds`'ten gelir) veya `TimeInterval.seconds(5)` ile oluşturabilirsiniz. Sınırlama olmaması için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | Flow'un tanımlayıcılarını (`id`, `variationId`), adını, placement'ını, paywall varyasyonlarını (`paywalls`) ve varsa remote config'lerini (`remoteConfigs`) içeren bir `AdaptyFlow` nesnesi. | ## View yapılandırmasını getirme \{#fetch-the-view-configuration\} :::important Builder'da **Show on device** geçiş düğmesini etkinleştirdiğinizden emin olun. Bu seçenek açık değilse, view yapılandırması alınamaz. ::: Placement **Flow Builder**'da veya **Paywall Builder**'da tasarlandıysa, Adapty arayüzü sizin için render eder. View'i `createFlowView` ile oluşturun, ardından [flow veya paywall'ı sunun](react-native-present-paywalls). Placement, Builder arayüzü olmayan özel bir paywall ise, bunun yerine [onu bir remote config paywall'ı olarak yönetin](present-remote-config-paywalls-react-native). React Native SDK'da `createFlowView`'u doğrudan çağırın — önce view yapılandırmasını getirmenize gerek yoktur. :::warning `createFlowView` metodunun sonucu yalnızca bir kez kullanılabilir. Onu tekrar kullanmanız gerekirse, `createFlowView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak, `AdaptyUIError.viewAlreadyPresented` hatasıyla sonuçlanabilir. ::: ```typescript showLineNumbers try { const view = await createFlowView(flow); } catch (error) { // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | zorunlu | İstenen flow/paywall için bir controller elde etmek amacıyla kullanılan `AdaptyFlow` nesnesi. | | **customTags** | isteğe bağlı | Özel etiketler ve çözümlenmiş değerlerinden oluşan bir sözlük tanımlar. Özel etiketler içerikte yer tutucu işlevi görür; flow/paywall içinde kişiselleştirilmiş içerik sunmak için belirli dizelerle dinamik olarak değiştirilir. Daha fazla bilgi için Paywall Builder'da özel etiketler konusuna bakın. | | **prefetchProducts** | isteğe bağlı | Ekrandaki ürünlerin görüntülenme zamanlamasını optimize etmek için etkinleştirin. `true` olarak ayarlandığında AdaptyUI gerekli ürünleri otomatik olarak çeker. Varsayılan: `false`. | | **android.enableSafeArea** | isteğe bağlı | Yalnızca Android (iOS'ta yoksayılır). İç içe nesne olarak geçirin: `android: { enableSafeArea: true }`. `true` olduğunda flow görünümü güvenli alan dolguları uygular. Modal sunum için varsayılan `true`'dur (`createFlowView` + `present()`), yerleşik `AdaptyFlowView` bileşeni için ise `false`'tur. Varsayılan değer çoğu durum için uygundur. | :::note Birden fazla dil kullanıyorsanız, bir [flow yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi ve locale kodlarını doğru şekilde kullanmayı [buradan](react-native-localizations-and-locale-codes) öğrenin. ::: View'e sahip olduğunuzda, [flow/paywall'ı sunun](react-native-present-paywalls). ## Daha hızlı getirmek için varsayılan bir kitle için flow veya paywall alma \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle flow'lar ve paywall'lar neredeyse anında getirilir, bu yüzden bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitleniz ve placement'ınız olduğu ve kullanıcılarınızın zayıf internet bağlantısı olduğu durumlarda, bir flow veya paywall'ı getirmek istediğinizden daha uzun sürebilir. Bu tür durumlarda, hiçbir şey göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir flow veya paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın flow veya paywall'ını **All Users** kitlesi için getiren `getFlowForDefaultAudience` metodunu kullanabilirsiniz. Ancak, önerilen yaklaşımın yukarıdaki [Flow/paywall getirme](#fetch-flowpaywall) bölümünde ayrıntılı olarak açıklandığı gibi flow veya paywall'ı `getFlow` metoduyla getirmek olduğunu anlamak çok önemlidir. :::warning `getFlow` kullanmanızı neden öneriyoruz `getFlowForDefaultAudience` metodu birkaç önemli dezavantajla birlikte gelir: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri (mevcut ve gelecekteki) için farklı paywall'lar göstermeniz gerekiyorsa, zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywall'lar tasarlamanız ya da mevcut (eski) sürüme sahip kullanıcıların render edilmemiş paywall'larla sorun yaşayabileceğini kabul etmeniz gerekir. - **Hedefleme kaybı**: Tüm kullanıcılar **All Users** kitlesi için tasarlanmış aynı paywall'ı görür; bu da kişiselleştirilmiş hedeflemeyi kaybettiğiniz anlamına gelir (ülkelere, pazarlama attribution'ına veya kendi özel niteliklerinize dayalı olanlar dahil). Daha hızlı flow veya paywall getirmeden yararlanmak için bu dezavantajları kabul etmeye istekliyseniz, `getFlowForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde, [yukarıda](#fetch-flowpaywall) açıklanan `getFlow`'a bağlı kalın. ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const flow = await adapty.getFlowForDefaultAudience(id); // the requested flow/paywall } catch (error) { // handle the error } ``` | Parametre | Zorunlu | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | gerekli | [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nizde bir placement oluştururken belirttiğiniz değerdir. | | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
| ## Asset'leri özelleştirme \{#customize-assets\} Flow/paywall'ınızdaki görselleri ve videoları özelleştirmek için özel asset'leri uygulayın. Hero görsellerinin ve videolarının önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir asset paketinde, bu öğeleri ID'leriyle hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için, Adapty kontrol panelinde [özel bir ID ayarlamanız](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterme. - Uzak bir ana görsel yüklenirken yerel bir önizleme görseli gösterme. - Bir videoyu çalıştırmadan önce bir önizleme görseli gösterme. :::important Bu özelliği kullanmak için Adapty React Native SDK'yı 3.8.0 veya daha yüksek bir sürüme güncelleyin. ::: Basit bir sözlük aracılığıyla özel varlıkları nasıl sağlayabileceğinize dair bir örnek: ```javascript const customAssets: Recordisteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-paywall-locale-in-adapty-paywall-builder) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) konusuna bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere sahip olmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internetle karşılaştığını düşünüyorsanız, önbellekte veri varsa önbelleğe alınmış verileri döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süresi yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
Adapty SDK, paywallları yerel olarak iki katmanda depolar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywalllar](fallback-paywalls). Paywallları daha hızlı almak için CDN ve CDN'e ulaşılamadığı durumlarda bağımsız bir yedek sunucu da kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken paywalllarınızın her zaman en son sürümünü almanızı sağlamak için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, bu metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa, önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem perde arkasında farklı isteklerden oluşabilir.
Android için: `TimeInterval`'ı uzantı fonksiyonlarıyla oluşturabilirsiniz (örneğin `5.seconds`, `.seconds` burada `import com.adapty.utils.seconds` içindendir) veya `TimeInterval.seconds(5)`. Sınırlama olmadan ayarlamak için `TimeInterval.INFINITE` kullanın.
| Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Ürün ID'lerinin listesini, paywall tanımlayıcısını, remote config'i ve diğer çeşitli özellikleri içeren bir [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) nesnesi. | ## Paywall Builder kullanılarak tasarlanan paywallın görünüm yapılandırmasını çekme \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Paywall builder'da **Show on device** geçişinin etkin olduğundan emin olun. Bu seçenek açık değilse, görünüm yapılandırması alınamaz. ::: Paywall'u çektikten sonra, Paywall Builder kullanılarak oluşturulduğunu gösteren bir `ViewConfiguration` içerip içermediğini kontrol edin. Bu, paywallı nasıl görüntüleyeceğiniz konusunda size rehberlik edecektir. `ViewConfiguration` mevcutsa, bunu bir Paywall Builder paywall'u olarak ele alın; değilse, [bunu bir remote config paywall'u olarak işleyin](present-remote-config-paywalls-react-native). React Native SDK'da, görünüm yapılandırmasını manuel olarak önceden çekmeden doğrudan `createPaywallView` metodunu çağırın. :::warning `createPaywallView` metodunun sonucu yalnızca bir kez kullanılabilir. Tekrar kullanmanız gerekiyorsa, `createPaywallView` metodunu yeniden çağırın. Yeniden oluşturmadan iki kez çağırmak `AdaptyUIError.viewAlreadyPresented` hatasına neden olabilir. ::: ```typescript showLineNumbers // for the Adapty SDK < 3.14 – import {createPaywallView} from 'react-native-adapty/dist/ui'; if (paywall.hasViewConfiguration) { try { const view = await createPaywallView(paywall); } catch (error) { // handle the error } } else { //use your custom logic } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | | :------------------- | :------- | :----------------------------------------------------------- | | **paywall** | zorunlu | İstenen paywall için bir controller almak üzere kullanılan `AdaptyPaywall` nesnesi. | | **customTags** | isteğe bağlı | Özel etiketlerin ve çözümlenmiş değerlerinin bir sözlüğünü tanımlar. Özel etiketler, paywall içeriğinde yer tutucu olarak kullanılır ve paywall içinde kişiselleştirilmiş içerik sağlamak amacıyla belirli dizelerle dinamik olarak değiştirilir. Daha fazla ayrıntı için Paywall Builder'da Özel Etiketler konusuna bakın. | | **prefetchProducts** | isteğe bağlı | Ekrandaki ürünlerin görüntülenme zamanlamasını optimize etmek için etkinleştirin. `true` olarak ayarlandığında AdaptyUI, gerekli ürünleri otomatik olarak getirir. Varsayılan: `false`. | :::note Birden fazla dil kullanıyorsanız, [Paywall Builder yerelleştirmesi](add-paywall-locale-in-adapty-paywall-builder) eklemeyi ve yerel ayar kodlarını doğru şekilde nasıl kullanacağınızı [buradan](react-native-localizations-and-locale-codes) öğrenin. ::: Görünümü aldıktan sonra, [paywall'u sunun](react-native-present-paywalls). ## Daha hızlı çekmek için varsayılan kitle için paywall alma \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} Genellikle paywalllar neredeyse anında çekilir, dolayısıyla bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitle ve paywallınız olduğu ve kullanıcılarınızın zayıf bir internet bağlantısına sahip olduğu durumlarda, bir paywall çekmek istediğinizden daha uzun sürebilir. Bu gibi durumlarda, hiç paywall göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir paywall görüntülemek isteyebilirsiniz. Bunu çözmek için, belirtilen placement'ın paywallını **Tüm Kullanıcılar** kitlesi için çeken `getPaywallForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Paywall Bilgilerini Çekme](#fetch-paywall-designed-with-paywall-builder) bölümünde ayrıntılandırıldığı gibi `getPaywall` metoduyla paywall çekmek olduğunu anlamak önemlidir. :::warning `getPaywall` kullanmanızı neden öneriyoruz `getPaywallForDefaultAudience` metodu birkaç önemli dezavantajla birlikte gelir: - **Olası geriye dönük uyumluluk sorunları**: Farklı uygulama sürümleri için (mevcut ve gelecekteki) farklı paywalllar göstermeniz gerekiyorsa, zorluklarla karşılaşabilirsiniz. Ya mevcut (eski) sürümü destekleyen paywalllar tasarlamak zorunda kalacaksınız ya da mevcut (eski) sürüme sahip kullanıcıların render edilmemiş paywalllarla sorun yaşayabileceğini kabul edeceksiniz. - **Hedefleme kaybı**: Tüm kullanıcılar **Tüm Kullanıcılar** kitlesi için tasarlanmış aynı paywall'u görecek; bu da kişiselleştirilmiş hedeflemeyi (ülkeler, pazarlama attribution veya kendi özel özelliklerinize dayalı hedefleme dahil) kaybetmeniz anlamına gelir. Daha hızlı paywall çekme avantajından yararlanmak için bu dezavantajları kabul etmeye hazırsanız, `getPaywallForDefaultAudience` metodunu aşağıdaki gibi kullanın. Aksi takdirde [yukarıda](#fetch-paywall-designed-with-paywall-builder) açıklanan `getPaywall` metoduna bağlı kalın. ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const paywall = await adapty.getPaywallForDefaultAudience(id, locale); // the requested paywall } catch (error) { // handle the error } ``` :::note `getPaywallForDefaultAudience` metodu, React Native SDK 2.11.2 sürümünden itibaren kullanılabilir. ::: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | [Placement](placements)'ın tanımlayıcısı. Bu, Adapty Kontrol Paneli'nde bir placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametrenin, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiketten oluşan bir dil kodu olması beklenir. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](react-native-localizations-and-locale-codes) konusuna bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Kullanıcılarınızın her zaman en güncel verilere sahip olmasını sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internetle karşılaştığını düşünüyorsanız, önbellekte veri varsa önbelleğe alınmış verileri döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar en güncel verileri alamayabilir, ancak internet bağlantıları ne kadar kesintili olursa olsun daha hızlı yükleme süresi yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerini önlemek için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizleme yoluyla silindiğini unutmayın.
| ## Varlıkları özelleştirme \{#customize-assets\} Paywallınızdaki görselleri ve videoları özelleştirmek için özel varlıkları uygulayın. Hero görselleri ve videolarının önceden tanımlanmış ID'leri vardır: `hero_image` ve `hero_video`. Özel bir varlık paketinde, bu öğeleri ID'leri aracılığıyla hedefler ve davranışlarını özelleştirirsiniz. Diğer görseller ve videolar için Adapty kontrol panelinde [özel bir ID ayarlamanız](custom-media) gerekir. Örneğin şunları yapabilirsiniz: - Bazı kullanıcılara farklı bir görsel veya video gösterme. - Uzak ana görsel yüklenirken yerel bir önizleme görseli gösterme. - Bir video çalıştırmadan önce önizleme görseli gösterme. :::important Bu özelliği kullanmak için, Adapty React Native SDK'yı sürüm 3.8.0 veya üzerine güncelleyin. ::: Özel asset'leri basit bir sözlük aracılığıyla nasıl sağlayabileceğinize dair bir örnek: ```javascript const customAssets: Record
## Paywall görüntüleme sayısı çok yüksek \{#the-paywall-view-number-is-too-big\}
**Sorun**: Paywall görüntüleme sayısı beklenenin iki katını gösteriyor.
**Neden**: Kodunuzda `logShowFlow` (React Native SDK v4+) / `logShowPaywall` çağırıyor olabilirsiniz; bu, Paywall Builder veya Flow Builder kullanıyorsanız görüntüleme sayısını ikiye katlar. Bu araçlarla oluşturulmuş flow'lar ve paywall'lar için analizler otomatik olarak izlenir, bu yüzden bu metodu kullanmanıza gerek yoktur.
**Çözüm**: Paywall Builder veya Flow Builder kullanıyorsanız, kodunuzda `logShowFlow` (React Native SDK v4+) / `logShowPaywall` çağırmadığınızdan emin olun.
## Diğer sorunlar \{#other-issues\}
**Sorun**: Yukarıda ele alınmayan başka Paywall Builder sorunları yaşıyorsunuz.
**Çözüm**: Gerekirse [migration kılavuzlarını](react-native-sdk-migration-guides) kullanarak SDK'yı en son sürüme güncelleyin. Pek çok sorun yeni SDK sürümlerinde çözülmüştür.
---
# File: react-native-quickstart-manual
---
---
title: "React Native SDK'da özel paywall'ınızda satın almaları etkinleştirme"
description: "Uygulama içi satın almaları etkinleştirmek için Adapty SDK'yı özel React Native paywall'larınıza entegre edin."
---
Bu rehber, Adapty'yi özel paywall'larınıza nasıl entegre edeceğinizi açıklar. Paywall uygulamanız üzerinde tam kontrolü elinizde tutarken, Adapty SDK ürünleri getirir, yeni satın almaları yönetir ve önceki satın almaları geri yükler.
:::important
**Bu rehber, özel paywall'lar geliştiren geliştiriciler içindir.** Satın almaları etkinleştirmenin en kolay yolunu istiyorsanız, [Adapty Flow Builder](react-native-quickstart-paywalls)'ı kullanın. Flow Builder ile flow'ları kod gerektirmeyen görsel bir editörde oluşturursunuz, Adapty tüm satın alma mantığını otomatik olarak yönetir ve farklı tasarımları uygulamanızı yeniden yayınlamadan test edebilirsiniz.
:::
## Başlamadan önce \{#before-you-start\}
### Ürünleri ayarlayın \{#set-up-products\}
Uygulama içi satın almaları etkinleştirmek için üç temel kavramı anlamanız gerekir:
- [**Ürünler**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Paywalllar**](paywalls) – hangi ürünlerin sunulacağını tanımlayan yapılandırmalar. Adapty'de paywalllar, ürünleri almanın tek yoludur; ancak bu tasarım sayesinde uygulama kodunuza dokunmadan ürünleri, fiyatları ve teklifleri değiştirebilirsiniz.
- [**Placement'lar**](placements) – uygulamanızda paywallları nerede ve ne zaman göstereceğiniz (`main`, `onboarding`, `settings` gibi). Kontrol panelinde placement'lar için paywalllar ayarlarsınız, ardından kodunuzda placement ID'si ile bunları talep edersiniz. Bu, A/B testleri yapmanızı ve farklı kullanıcılara farklı paywalllar göstermenizi kolaylaştırır.
Özel paywall üzerinde çalışıyor olsanız bile bu kavramları anladığınızdan emin olun. Temel olarak bunlar, uygulamanızda sattığınız ürünleri yönetme yönteminizdir.
Özel paywallinizi uygulamak için bir **paywall** oluşturmanız ve bunu bir **placement**'a eklemeniz gerekir. Bu yapılandırma, ürünlerinizi almanıza olanak tanır. Kontrol panelinde ne yapmanız gerektiğini anlamak için [buradaki](quickstart) hızlı başlangıç kılavuzunu takip edin.
### Kullanıcıları yönetin \{#manage-users\}
Kendi tarafınızda backend kimlik doğrulaması ile veya olmadan çalışabilirsiniz.
Ancak Adapty SDK, anonim ve kimliği doğrulanmış kullanıcıları farklı şekilde ele alır. Ayrıntıları anlamak ve kullanıcılarla doğru şekilde çalıştığınızdan emin olmak için [kimlik doğrulama hızlı başlangıç kılavuzunu](react-native-quickstart-identify) okuyun.
## Adım 1. Ürünleri getirin \{#step-1-get-products\}
Özel paywall'ınız için ürünleri getirmek üzere şunları yapmanız gerekir:
1. `getFlow` metoduna [placement](placements) ID'sini geçirerek `flow` nesnesini alın.
2. `getPaywallProducts` metodunu kullanarak bu flow için ürünler dizisini alın.
```typescript showLineNumbers
async function loadPaywall() {
try {
const flow: AdaptyFlow = await adapty.getFlow('YOUR_PLACEMENT_ID');
const products: AdaptyPaywallProduct[] = await adapty.getPaywallProducts(flow);
// Use products to build your custom paywall UI
} catch (error) {
// Handle the error
}
}
```
## Adım 2. Satın almaları kabul edin \{#step-2-accept-purchases\}
Kullanıcı özel paywallınızdaki bir ürüne dokunduğunda, seçilen ürünle birlikte `makePurchase` metodunu çağırın. Bu işlem satın alma akışını yönetir ve güncellenmiş profili döndürür.
```typescript showLineNumbers
async function purchaseProduct(product: AdaptyPaywallProduct) {
try {
const purchaseResult: AdaptyPurchaseResult = await adapty.makePurchase(product);
switch (purchaseResult.type) {
case 'success':
// Purchase successful, profile updated
break;
case 'user_cancelled':
// User canceled the purchase
break;
case 'pending':
// Purchase is pending (e.g., user will pay offline with cash)
break;
}
} catch (error) {
// Handle the error
}
}
```
## Adım 3. Satın almaları geri yükleyin \{#step-3-restore-purchases\}
Uygulama mağazaları, abonelik sunan tüm uygulamaların kullanıcılara satın almalarını geri yükleyebilecekleri bir yol sağlamasını zorunlu kılar.
Kullanıcı geri yükle düğmesine dokunduğunda `restorePurchases` metodunu çağırın. Bu işlem, satın alma geçmişlerini Adapty ile senkronize eder ve güncellenmiş profili döndürür.
```typescript showLineNumbers
async function restorePurchases() {
try {
const profile: AdaptyProfile = await adapty.restorePurchases();
// Restore successful, profile updated
} catch (error) {
// Handle the error
}
}
```
## Sonraki adımlar \{#next-steps\}
:::tip
Sorularınız mı var ya da sorunlarla mı karşılaşıyorsunuz? Sık sorulan soruların yanıtlarını bulabileceğiniz veya kendi sorularınızı sorabileceğiniz [destek forumumuza](https://adapty.featurebase.app/) göz atın. Ekibimiz ve topluluğumuz yardımcı olmak için burada!
:::
Paywallınız uygulamada gösterilmeye hazır. [App Store sandbox](test-purchases-in-sandbox) ortamında veya [Google Play Store](testing-on-android)'da satın almalarınızı test ederek paywall üzerinden bir test satın almasını tamamlayabildiğinizden emin olun. Bunun üretime hazır bir uygulamada nasıl çalıştığını görmek için örnek uygulamamızdaki [CustomPurchaseScreen.tsx](https://github.com/adaptyteam/AdaptySDK-React-Native/blob/master/examples/ExpoGoWebMock/src/CustomPurchaseScreen.tsx) dosyasına göz atın; bu dosya, uygun hata işleme, yükleme durumları ve UI durum yönetimiyle satın alma işlemini göstermektedir.
Ardından, paywallı gösterip göstermeyeceğinizi veya ücretli özelliklere erişim izni verip vermeyeceğinizi belirlemek için [kullanıcıların satın almalarını tamamlayıp tamamlamadığını kontrol edin](react-native-check-subscription-status).
---
# File: fetch-paywalls-and-products-react-native
---
---
title: "React Native SDK'da remote config paywall'ları için paywall'ları ve ürünleri getirme"
description: "Kullanıcı para kazanımını artırmak için Adapty React Native SDK'da paywall'ları ve ürünleri getirin."
---
Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
Adapty SDK, flow'ları ve paywall'ları iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve [yedek paywall'lar](react-native-use-fallback-paywalls) . Ayrıca flow'ları ve paywall'ları daha hızlı getirmek için CDN'i ve CDN erişilemez olduğunda bağımsız bir yedek sunucuyu kullanırız. Bu sistem, internet bağlantısının zayıf olduğu durumlarda bile güvenilirliği sağlarken her zaman flow'larınızın en son sürümünü almanızı garanti etmek için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, bu metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa, önbelleğe alınmış veriler veya yerel yedek döndürülür.
Nadir durumlarda bu metodun, işlem alt katmanda farklı isteklerden oluşabileceği için `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın.
| :::note v4'te `getFlow` artık `locale` parametresi almaz. Özel paywall'lar için, mevcut tüm locale'ler flow'un remote config'inde (`flow.remoteConfigs`) döndürülür—kullanıcının cihazına veya uygulama ayarına uyanı seçin. ::: Ürün ID'lerini koda gömmeyin (hardcode)! Flow'lar uzaktan yapılandırıldığından, mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz denemeler gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları yönettiğinden emin olun. Örneğin, başlangıçta 2 ürün getirirseniz, uygulamanız bu 2 ürünü göstermelidir. Ancak daha sonra 3 ürün getirirseniz, uygulamanız herhangi bir kod değişikliği gerektirmeden 3'ünü de göstermelidir. Koda gömmeniz gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Placement'ı, tanımlayıcıları (`id`, `variationId`), adı, paywall varyasyonlarını (`paywalls`) ve bir `remoteConfigs` dizisini (yapılandırılmış her locale için bir girdi) içeren bir `AdaptyFlow` nesnesi. Flow için ürünleri getirmek üzere `getPaywallProducts(flow)` çağırın. | ## Ürünleri getirme \{#fetch-products\} Flow'a sahip olduğunuzda, ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```typescript showLineNumbers try { // ...flow const products = await adapty.getPaywallProducts(flow); // the requested products list } catch (error) { // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik süresi ve diğer birkaç özelliği içeren [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnelerinin listesi. | Kendi paywall tasarımınızı uygularken [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnesindeki bu özelliklere erişmeniz gerekecektir. Aşağıda en sık kullanılan özellikler gösterilmektedir; mevcut tüm özellikler için bağlantılı belgeye başvurun. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Ürünün başlığını görüntülemek için `product.localizedTitle` kullanın. Yerelleştirmenin, cihazın locale'inden ziyade kullanıcıların seçtiği mağaza ülkesine dayandığını unutmayın. | | **Price** | Fiyatın yerelleştirilmiş bir sürümünü görüntülemek için `product.price?.localizedString` kullanın. Bu yerelleştirme, cihazın locale bilgisine dayanır. Fiyata `product.price?.amount` kullanarak bir sayı olarak da erişebilirsiniz. Değer yerel para biriminde sağlanır. İlgili para birimi sembolünü almak için `product.price?.currencySymbol` kullanın. | | **Subscription Period** | Süreyi (örneğin hafta, ay, yıl vb.) görüntülemek için `product.subscription?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme, cihazın locale'ine dayanır. Abonelik süresini programatik olarak getirmek için `product.subscription?.subscriptionPeriod` kullanın. Oradan, uzunluğu almak için `unit` özelliğine erişebilirsiniz (yani 'day', 'week', 'month', 'year' veya 'unknown'). `numberOfUnits` değeri size süre birimi sayısını verir. Örneğin, üç aylık bir abonelik için, unit özelliğinde `'month'` ve numberOfUnits özelliğinde `3` görürsünüz. | | **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerdiğini gösteren bir rozet veya başka bir gösterge görüntülemek için, `product.subscription?.offer?.phases` özelliğine göz atın. Bu, en fazla iki indirim aşaması içerebilen bir listedir: ücretsiz deneme aşaması ve başlangıç fiyatı aşaması. Her aşama nesnesinde şu yararlı özellikler bulunur:Varsayılan olarak SDK, verileri sunucudan yüklemeye çalışır ve başarısızlık durumunda önbelleğe alınmış verileri döndürür. Bu varyantı öneririz çünkü kullanıcılarınızın her zaman en güncel verileri almasını sağlar.
Ancak kullanıcılarınızın istikrarsız internetle uğraştığını düşünüyorsanız, önbelleğe alınmış veriler varsa onları döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünün. Bu senaryoda kullanıcılar mutlak en son verileri alamayabilir, ancak internet bağlantıları ne kadar kötü olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu yüzden ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Uygulamayı yeniden başlattığınızda önbelleğin bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yoluyla temizlendiğini unutmayın.
|isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel kod hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel kodlar](react-native-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri mevcutsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en son verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
Adapty SDK, paywallları iki katmanda saklar: yukarıda açıklanan düzenli güncellenen önbellek ve [yedek paywalllar](react-native-use-fallback-paywalls). Paywallları daha hızlı çekmek için CDN ve CDN'e ulaşılamadığında bağımsız bir yedek sunucu da kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken her zaman en güncel paywall sürümünü almanızı garantilemek için tasarlanmıştır.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout`'ta belirtilenden biraz daha geç zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşabilir.
| Ürün ID'lerini doğrudan koda yazmayın! Paywalllar uzaktan yapılandırıldığından mevcut ürünler, ürün sayısı ve özel teklifler (ücretsiz deneme gibi) zaman içinde değişebilir. Kodunuzun bu senaryoları yönettiğinden emin olun. Örneğin, başlangıçta 2 ürün alıyorsanız uygulamanız o 2 ürünü göstermelidir. Ancak daha sonra 3 ürün alırsanız uygulamanız herhangi bir kod değişikliği gerektirmeden 3 ürünü de göstermelidir. Doğrudan koda yazmanız gereken tek şey placement ID'sidir. Yanıt parametreleri: | Parametre | Açıklama | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Ürün ID'leri listesi, paywall tanımlayıcısı, remote config ve diğer birkaç özelliği içeren [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) nesnesi. | ## Ürünleri çekme \{#fetch-products\} Paywall'ı aldıktan sonra ona karşılık gelen ürün dizisini sorgulayabilirsiniz: ```typescript showLineNumbers try { // ...paywall const products = await adapty.getPaywallProducts(paywall); // the requested products list } catch (error) { // handle the error } ``` Yanıt parametreleri: | Parametre | Açıklama | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Şunları içeren [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnelerinin listesi: ürün tanımlayıcısı, ürün adı, fiyat, para birimi, abonelik uzunluğu ve diğer birkaç özellik. | Kendi paywall tasarımınızı uygularken, muhtemelen [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) nesnesindeki bu özelliklere erişmeniz gerekecek. Aşağıda en yaygın kullanılan özellikler gösterilmiştir, ancak mevcut tüm özelliklerle ilgili tam ayrıntılar için bağlantılı belgeye bakın. | Özellik | Açıklama | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Ürünün başlığını görüntülemek için `product.localizedTitle` kullanın. Yerelleştirmenin, cihazın locale'inden ziyade kullanıcıların seçtiği mağaza ülkesine dayandığını unutmayın. | | **Price** | Fiyatın yerelleştirilmiş bir sürümünü görüntülemek için `product.price?.localizedString` kullanın. Bu yerelleştirme, cihazın locale bilgisine dayanır. Fiyata `product.price?.amount` kullanarak bir sayı olarak da erişebilirsiniz. Değer yerel para biriminde sağlanır. İlgili para birimi sembolünü almak için `product.price?.currencySymbol` kullanın. | | **Subscription Period** | Süreyi (örneğin hafta, ay, yıl vb.) görüntülemek için `product.subscription?.localizedSubscriptionPeriod` kullanın. Bu yerelleştirme, cihazın locale'ine dayanır. Abonelik süresini programatik olarak getirmek için `product.subscription?.subscriptionPeriod` kullanın. Oradan, uzunluğu almak için `unit` özelliğine erişebilirsiniz (yani 'day', 'week', 'month', 'year' veya 'unknown'). `numberOfUnits` değeri size süre birimi sayısını verir. Örneğin, üç aylık bir abonelik için, unit özelliğinde `'month'` ve numberOfUnits özelliğinde `3` görürsünüz. | | **Introductory Offer** | Bir aboneliğin başlangıç teklifi içerdiğini gösteren bir rozet veya başka bir gösterge görüntülemek için, `product.subscription?.offer?.phases` özelliğine göz atın. Bu, en fazla iki indirim aşaması içerebilen bir listedir: ücretsiz deneme aşaması ve başlangıç fiyatı aşaması. Her aşama nesnesinde şu yararlı özellikler bulunur:isteğe bağlı
varsayılan: `en`
|[Paywall yerelleştirmesinin](add-remote-config-locale) tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya daha fazla alt etiket içeren bir dil kodu olmalıdır. İlk alt etiket dil, ikincisi bölge içindir.
Örnek: `en` İngilizce, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel kod hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel kodlar](react-native-localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |SDK varsayılan olarak sunucudan veri yüklemeye çalışır ve başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneriyoruz.
Ancak kullanıcılarınızın kararsız bir internet bağlantısıyla uğraştığını düşünüyorsanız, önbelleğe alınmış veri mevcutsa onu döndürmek için `.returnCacheDataElseLoad` kullanmayı düşünebilirsiniz. Bu senaryoda kullanıcılar en son verilere ulaşamayabilir, ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum sırasında kullanmak güvenlidir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında temizlendiğini unutmayın.
|İstek başarılıysa yanıt bu nesneyi içerir. Bir [AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile) nesnesi; kullanıcının uygulama içindeki access level'ları, abonelikleri ve abonelik dışı satın almaları hakkında kapsamlı bilgi sağlar.
Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.
| :::warning **Not:** Apple'ın StoreKit sürümü 2.0'ın altında ve Adapty SDK sürümü 2.9.0'ın altındaysa, bunun yerine [Apple App Store paylaşılan gizli anahtarı](app-store-connection-configuration#step-5-enter-app-store-shared-secret) sağlamanız gerekir. Bu yöntem Apple tarafından artık kullanımdan kaldırılmıştır. ::: ## Satın alma sırasında aboneliği değiştirme \{#change-subscription-when-making-a-purchase\} Bir kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu işlemin nasıl gerçekleşeceği uygulama mağazasına göre değişir: - App Store'da abonelik, abonelik grubu içinde otomatik olarak güncellenir. Kullanıcı bir gruptan abonelik satın alırken başka bir gruptan aktif aboneliği varsa, her iki abonelik de aynı anda aktif olur. - Google Play'de abonelik otomatik olarak güncellenemez. Geçişi, aşağıda açıklandığı şekilde mobil uygulama kodunuzda yönetmeniz gerekir. Android'de aboneliği başka bir abonelikle değiştirmek için `.makePurchase()` metodunu ek parametre ile çağırın: ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product, params); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Ücretli özelliklere erişim izni ver } break; case 'user_cancelled': // Kullanıcının satın almayı iptal ettiği durumu işle break; case 'pending': // Ertelenmiş satın almaları işle (örn. kullanıcı nakit ile offline ödeme yapacak) break; } } catch (error) { // Hatayı işle } ``` Ek istek parametresi: | Parametre | Zorunluluk | Açıklama | | :--------- | :------- | :----------------------------------------------------------- | | **params** | zorunlu | [`MakePurchaseParamsInput`](https://react-native.adapty.io/types/makepurchaseparamsinput) türünde bir nesne. | :::info **3.8.2+ sürümü**: `MakePurchaseParamsInput` yapısı güncellendi. `oldSubVendorProductId` ve `prorationMode` artık `subscriptionUpdateParams` altında iç içe yer alıyor; `isOfferPersonalized` ise üst seviyeye taşındı. ```javascript makePurchase(product, { android: { subscriptionUpdateParams: { oldSubVendorProductId: 'old_product_id', prorationMode: 'charge_prorated_price' }, isOfferPersonalized: true } }); ``` ::: Abonelikler ve değiştirme modları hakkında daha fazla bilgiyi Google Developer belgelerinde bulabilirsiniz: - [Değiştirme modları hakkında](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Google'ın değiştirme modları için önerileri](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Değiştirme modu [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Not: bu yöntem yalnızca abonelik yükseltmeleri için kullanılabilir. Düşürme işlemleri desteklenmez. - Değiştirme modu [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Not: Gerçek abonelik değişikliği yalnızca mevcut abonelik fatura dönemi sona erdiğinde gerçekleşir. ## iOS'ta teklif kodlarını kullanma \{#redeem-offer-codes-in-ios\}Bir [`AdaptyProfile`](https://react-native.adapty.io/interfaces/adaptyprofile) nesnesi. Bu model, access level'lar, abonelikler ve abonelik dışı satın almalar hakkında bilgi içerir.
Kullanıcının uygulamaya erişimi olup olmadığını belirlemek için **access level** durumunu kontrol edin.
| :::tip Adapty SDK'nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall'ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren [örnek uygulamalarımıza](sample-apps) göz atın. ::: --- # File: implement-observer-mode-react-native --- --- title: "React Native SDK'da Observer modu uygulama" description: "React Native SDK'da kullanıcı abonelik olaylarını takip etmek için Adapty'de observer modu uygulayın." --- Kendi satın alma altyapınız varsa ve henüz tamamen Adapty'ye geçmeye hazır değilseniz, [Observer modu](observer-vs-full-mode)'nu inceleyebilirsiniz. Temel haliyle Observer Modu, gelişmiş analitik ve attribution ile analitik sistemlerle sorunsuz entegrasyon sunar. Bu ihtiyaçlarınızı karşılıyorsa yalnızca şunları yapmanız gerekir: 1. Adapty SDK'yı yapılandırırken `observerMode` parametresini `true` olarak ayarlayarak Observer modu'nu etkinleştirin. Kurulum talimatlarını [React Native](sdk-installation-reactnative) için takip edin. 2. Mevcut satın alma altyapınızdan [işlemleri Adapty'ye bildirin](report-transactions-observer-mode-react-native). ### Observer modu kurulumu \{#observer-mode-setup\} Satın alma ve abonelik durumunu kendiniz yönetiyorsanız ve Adapty'yi yalnızca abonelik olayları ile analitik göndermek için kullanıyorsanız Observer modu'nu etkinleştirin. :::important Observer modu çalışırken Adapty SDK hiçbir işlemi kapatmaz; bu nedenle işlemleri kendiniz yönettiğinizden emin olun. ::: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { observerMode: true, // Enable observer mode }); ``` Parametreler: | Parametre | Açıklama | | --------------------------- | ------------------------------------------------------------ | | observerMode | [Observer modu](observer-vs-full-mode)'nu kontrol eden boolean değer. Varsayılan değer `false`'tur. | ## Observer Modunda Adapty paywall'larını kullanma \{#using-adapty-paywalls-in-observer-mode\} Adapty'nin paywall ve A/B testi özelliklerini de kullanmak istiyorsanız bunu yapabilirsiniz; ancak Observer modunda biraz ek kurulum gereklidir. Yukarıdaki adımlara ek olarak şunları yapmanız gerekir: 1. [Remote config paywall'lar](present-remote-config-paywalls-react-native) için paywall'ları her zamanki gibi gösterin. 3. Satın alma işlemleriyle [paywall'ları ilişkilendirin](report-transactions-observer-mode-react-native). --- # File: report-transactions-observer-mode-react-native --- --- title: "React Native SDK'da Observer Mode'da işlemleri raporlama" description: "React Native SDK'da kullanıcı içgörüleri ve gelir takibi için Adapty Observer Mode'da satın alma işlemlerini raporlayın." ---iOS, StoreKit 1 için: bir [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction) nesnesi.
iOS, StoreKit 2 için: [Transaction](https://developer.apple.com/documentation/storekit/transaction) nesnesi.
Android için: Satın almanın string tanımlayıcısı (purchase.getOrderId); burada satın alma, billing kütüphanesi [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) sınıfının bir örneğidir.
| | variationId | zorunlu | Varyasyonun string tanımlayıcısı. [AdaptyPaywall](https://react-native.adapty.io/interfaces/adaptypaywall) nesnesinin `variationId` özelliği kullanılarak elde edilebilir. |phoneNumber
firstName
lastName
| String | | gender | Enum, izin verilen değerler: `female`, `male`, `other` | | birthday | Date | ### Özel kullanıcı nitelikleri \{#custom-user-attributes\} Kendi özel niteliklerinizi tanımlayabilirsiniz. Bunlar genellikle uygulamanızın kullanımıyla ilgilidir. Örneğin fitness uygulamalarında haftalık egzersiz sayısı, dil öğrenme uygulamalarında kullanıcının bilgi düzeyi gibi değerler olabilir. Bu nitelikleri segmentlerde kullanarak hedefli paywall'lar ve teklifler oluşturabilir, ayrıca analitik amaçlarla hangi ürün metriklerinin geliri en çok etkilediğini anlamak için de kullanabilirsiniz. ```typescript showLineNumbers try { await adapty.updateProfile({ codableCustomAttributes: { key_1: 'value_1', key_2: 2, }, }); } catch (error) { // handle `AdaptyError` } ``` Mevcut bir anahtarı kaldırmak için `.withRemoved(customAttributeForKey:)` metodunu kullanın: ```typescript showLineNumbers try { // to remove a key, pass null as its value await adapty.updateProfile({ codableCustomAttributes: { key_1: null, key_2: null, }, }); } catch (error) { // handle `AdaptyError` } ``` Bazen daha önce hangi özel niteliklerin ayarlandığını öğrenmeniz gerekebilir. Bunun için `AdaptyProfile` nesnesinin `customAttributes` alanını kullanın. :::warning `customAttributes` değerinin güncel olmayabileceğini unutmayın; kullanıcı nitelikleri farklı cihazlardan herhangi bir zamanda gönderilebilir, bu nedenle sunucudaki nitelikler son senkronizasyondan bu yana değişmiş olabilir. ::: ### Sınırlar \{#limits\} - Kullanıcı başına en fazla 30 özel nitelik - Anahtar adları en fazla 30 karakter uzunluğunda olabilir. Anahtar adı alfanümerik karakterler ve şunlardan herhangi birini içerebilir: `_` `-` `.` - Değer, en fazla 50 karakterlik bir string veya float olabilir. --- # File: react-native-listen-subscription-changes --- --- title: "React Native SDK'da abonelik durumunu kontrol etme" description: "React Native uygulamanızda müşteriyi elde tutmayı artırmak için Adapty'de kullanıcı abonelik durumunu takip edin ve yönetin." --- Adapty ile abonelik durumunu takip etmek son derece kolaydır. Ürün kimliklerini kodunuza manuel olarak eklemenize gerek yok. Bunun yerine, etkin bir [access level](access-level) olup olmadığını kontrol ederek kullanıcının abonelik durumunu zahmetsizce doğrulayabilirsiniz.Bir [AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile) nesnesi. Genellikle, kullanıcının uygulamaya premium erişimi olup olmadığını belirlemek için yalnızca profilin access level durumunu kontrol etmeniz yeterlidir.
`.getProfile` metodu her zaman API'yi sorgulamaya çalıştığından en güncel sonucu döndürür. Herhangi bir nedenle (örneğin internet bağlantısı yoksa) Adapty SDK sunucudan bilgi alamazsa önbellekteki veriler döndürülür. Adapty SDK'nın `AdaptyProfile` önbelleğini düzenli aralıklarla güncelleyerek bilgileri mümkün olduğunca güncel tuttuğunu da belirtmek gerekir.
| `.getProfile()` metodu, access level durumunu alabileceğiniz kullanıcı profilini sağlar. Uygulama başına birden fazla access level tanımlayabilirsiniz. Örneğin, bir gazete uygulamanız varsa ve farklı konulara bağımsız abonelikler satıyorsanız "sports" ve "science" access level'ları oluşturabilirsiniz. Ancak çoğu durumda yalnızca bir access level'a ihtiyaç duyarsınız; bu durumda varsayılan "premium" access level'ını kullanabilirsiniz. Varsayılan "premium" access level'ını kontrol etmek için bir örnek: ```typescript showLineNumbers try { const profile = await adapty.getProfile(); const isActive = profile.accessLevels?.["premium"]?.isActive; if (isActive) { // grant access to premium features } } catch (error) { // handle the error } ``` ### Abonelik durumu güncellemelerini dinleme \{#listening-for-subscription-status-updates\} Kullanıcının aboneliği her değiştiğinde Adapty bir olay tetikler. Adapty'den mesaj almak için bazı ek yapılandırmalar yapmanız gerekir: ```typescript showLineNumbers // Create an "onLatestProfileLoad" event listener adapty.addEventListener('onLatestProfileLoad', profile => { // handle any changes to subscription state }); ``` Adapty, uygulama başlangıcında da bir olay tetikler. Bu durumda önbellekteki abonelik durumu iletilir. ### Abonelik durumu önbelleği \{#subscription-status-cache\} Adapty SDK'da uygulanan önbellek, profilin abonelik durumunu depolar. Bu sayede sunucu erişilemez olsa bile önbellekteki veriler kullanılarak profilin abonelik durumu hakkında bilgi edinilebilir. Ancak önbellekten doğrudan veri talep etmenin mümkün olmadığını belirtmek gerekir. SDK, profille ilgili güncelleme veya değişiklik olup olmadığını kontrol etmek için her dakika periyodik olarak sunucuyu sorgular. Yeni işlemler veya başka güncellemeler gibi herhangi bir değişiklik varsa, önbellekteki verilerle sunucu arasında senkronizasyon sağlamak amacıyla bu değişiklikler önbelleğe iletilir. --- # File: react-native-deal-with-att --- --- title: "React Native SDK'da ATT ile Başa Çıkma" description: "Abonelik kurulumu ve yönetimini kolaylaştırmak için React Native'de Adapty'ye başlayın." --- Uygulamanız AppTrackingTransparency çerçevesini kullanıyor ve kullanıcıya uygulama takip yetkilendirme isteği sunuyorsa, [yetkilendirme durumunu](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) Adapty'ye göndermeniz gerekir. ```typescript showLineNumbers try { await adapty.updateProfile({ // you can also pass a string value (validated via tsc) if you prefer appTrackingTransparencyStatus: AppTrackingTransparencyStatus.Authorized, }); } catch (error) { // handle `AdaptyError` } ``` :::warning Bu değeri, değiştiği anda mümkün olduğunca erken göndermenizi önemle tavsiye ederiz. Yalnızca bu durumda veriler, yapılandırdığınız entegrasyonlara zamanında iletilecektir. ::: --- # File: kids-mode-react-native --- --- title: "React Native SDK'da Kids Mode" description: "Apple ve Google politikalarına uymak için Kids Mode'u kolayca etkinleştirin. React Native SDK'da IDFA, GAID veya reklam verisi toplanmaz." --- React Native uygulamanız çocuklara yönelikse, [Apple](https://developer.apple.com/kids/) ve [Google](https://support.google.com/googleplay/android-developer/answer/9893335) politikalarına uymanız gerekir. Adapty SDK kullanıyorsanız, birkaç basit adım onu bu politikalara uyacak ve uygulama mağazası incelemelerini geçecek şekilde yapılandırmanıza yardımcı olur. :::important iOS'ta Kids Mode, tüm IDFA, AdSupport ve AppTrackingTransparency kodunu derleme dışında bırakan `KidsMode` Swift package trait'i aracılığıyla etkinleştirilir. v4 SDK'yı (yerel iOS SDK'yı Swift Package Manager aracılığıyla yükler) ve **Xcode 26** veya sonrasını gerektirir. Aşağıdaki [iOS Podfile'ınızdaki güncellemeler](#updates-in-your-ios-podfile) bölümüne bakın. ::: ## Ne gereklidir? \{#whats-required\} Adapty SDK'yı aşağıdakilerin toplanmasını devre dışı bırakacak şekilde yapılandırmanız gerekir: - [IDFA (Reklamverenler için Tanımlayıcı)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Reklam Kimliği (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [IP adresi](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) Bunlara ek olarak, müşteri kullanıcı kimliğini dikkatli kullanmanızı öneririz. `isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla karşılaştığını düşünüyorsanız, varsa önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum süresince güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en son sürümünü almanızı garanti eder.
| | **loadTimeoutMs** | varsayılan: 5 sn |Bu değer, metodun zaman aşımını sınırlar. Zaman aşımına ulaşılırsa önbelleğe alınmış veri veya yerel yedek döndürülür.
Nadir durumlarda bu metodun `loadTimeout` içinde belirtilenin biraz daha gerisinde zaman aşımına uğrayabileceğini unutmayın; çünkü işlem arka planda farklı isteklerden oluşuyor olabilir.
| Yanıt parametreleri: | Parametre | Açıklama | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Onboarding tanımlayıcısı ve yapılandırması, remote config ve diğer çeşitli özellikleri içeren bir [`AdaptyOnboarding`](https://react-native.adapty.io/interfaces/adaptyonboarding) nesnesi. | ## Varsayılan kitle onboarding'i ile onboarding getirmeyi hızlandırın \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} Genellikle onboarding'ler neredeyse anında getirilir, bu nedenle bu süreci hızlandırma konusunda endişelenmenize gerek yoktur. Ancak çok sayıda kitleniz ve onboarding'iniz varsa ve kullanıcılarınızın internet bağlantısı zayıfsa, onboarding getirme istediğinizden daha uzun sürebilir. Bu durumlarda, hiç onboarding göstermemek yerine sorunsuz bir kullanıcı deneyimi sağlamak için varsayılan bir onboarding göstermek isteyebilirsiniz. Bunu ele almak için, belirtilen placement'ın **All Users** kitlesi için onboarding'i getiren `getOnboardingForDefaultAudience` metodunu kullanabilirsiniz. Ancak önerilen yaklaşımın, yukarıdaki [Onboarding'i Getir](#fetch-onboarding) bölümünde ayrıntılı olarak açıklandığı gibi `getOnboarding` metoduyla onboarding getirmek olduğunu anlamak önemlidir. :::warning `getOnboardingForDefaultAudience` yerine `getOnboarding` kullanmayı tercih edin; çünkü ikincisinin önemli sınırlamaları vardır: - **Uyumluluk sorunları**: Birden fazla uygulama sürümünü desteklerken sorunlara yol açabilir; ya geriye dönük uyumlu tasarımlar gerektirirsiniz ya da eski sürümlerin yanlış görüntülenebileceğini kabul etmek durumunda kalırsınız. - **Kişiselleştirme yok**: Yalnızca "All Users" kitlesi için içerik gösterir; ülkeye, attribution'a veya özel niteliklere göre hedeflemeyi ortadan kaldırır. Kullanım durumunuzda daha hızlı getirme bu dezavantajlardan daha önemliyse `getOnboardingForDefaultAudience` kullanın (aşağıda gösterildiği gibi). Aksi takdirde [yukarıda](#fetch-onboarding) açıklandığı şekilde `getOnboarding` kullanın. ::: ```typescript showLineNumbers try { const placementId = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const onboarding = await adapty.getOnboardingForDefaultAudience(placementId, locale); // the requested onboarding } catch (error) { // handle the error } ``` Parametreler: | Parametre | Zorunluluk | Açıklama | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | zorunlu | İstenen [Placement](placements)'ın tanımlayıcısı. Adapty Kontrol Paneli'nde placement oluştururken belirttiğiniz değerdir. | | **locale** |isteğe bağlı
varsayılan: `en`
|Onboarding yerelleştirmesinin tanımlayıcısı. Bu parametre, eksi (**-**) karakteriyle ayrılmış bir veya iki alt etiketten oluşan bir dil kodu olmalıdır. İlk alt etiket dil içindir, ikincisi bölge içindir.
Örnek: `en` İngilizce anlamına gelir, `pt-br` Brezilya Portekizcesini temsil eder.
Yerel ayar kodları ve bunların nasıl kullanılmasını önerdiğimiz hakkında daha fazla bilgi için [Yerelleştirmeler ve yerel ayar kodları](localizations-and-locale-codes) sayfasına bakın.
| | **fetchPolicy** | varsayılan: `.reloadRevalidatingCacheData` |Varsayılan olarak SDK, sunucudan veri yüklemeye çalışır; başarısız olursa önbelleğe alınmış veriyi döndürür. Kullanıcılarınızın her zaman en güncel verilere erişmesini sağladığı için bu seçeneği öneririz.
Ancak kullanıcılarınızın kararsız internet bağlantısıyla karşılaştığını düşünüyorsanız, varsa önbelleğe alınmış veriyi döndürmek için `.returnCacheDataElseLoad` kullanmayı değerlendirin. Bu senaryoda kullanıcılar en güncel verilere ulaşamayabilir; ancak internet bağlantısı ne kadar kesintili olursa olsun daha hızlı yükleme süreleri yaşarlar. Önbellek düzenli olarak güncellenir, bu nedenle ağ isteklerinden kaçınmak için oturum süresince güvenle kullanılabilir.
Önbelleğin uygulama yeniden başlatıldığında bozulmadan kaldığını ve yalnızca uygulama yeniden yüklendiğinde veya manuel temizlik yapıldığında silindiğini unutmayın.
Adapty SDK, onboarding'leri yerel olarak iki katmanda saklar: yukarıda açıklanan düzenli olarak güncellenen önbellek ve yedek onboarding'ler. Onboarding'leri daha hızlı getirmek için CDN, CDN'e ulaşılamadığı durumlarda ise bağımsız bir yedek sunucu kullanıyoruz. Bu sistem, internet bağlantısının yetersiz olduğu durumlarda bile güvenilirliği sağlarken onboarding'lerinizin her zaman en son sürümünü almanızı garanti eder.
| --- # File: react-native-present-onboardings --- --- title: "React Native SDK'da onboarding sunma" description: "Dönüşümleri ve geliri artırmak için React Native'de onboarding'lerin nasıl sunulacağını keşfedin." --- :::warning **Onboarding'ler SDK v4'te kullanımdan kaldırıldı ve gelecekteki bir sürümde kaldırılacak.** Artık düzeltme veya iyileştirme almıyorlar. Bunun yerine [flow'ları](react-native-get-pb-paywalls) kullanın: bir WebView içinde çalışan onboarding'lerin aksine, flow'lar cihazda yerel olarak render edilir — bu da size daha akıcı animasyonlar, tutarlı bir yerel görünüm ve his, daha hızlı yükleme süreleri ve WebView çalışma zamanı bağımlılığının olmaması avantajını sağlar. Başlamak için bkz. [Flow'ları ve paywall'ları getirme](react-native-get-pb-paywalls) ve [Flow'ları ve paywall'ları görüntüleme](react-native-present-paywalls). ::: Onboarding'i builder ile özelleştirdiyseniz, kullanıcıya göstermek için mobil uygulama kodunuzda ayrıca render etmenize gerek yok. Böyle bir onboarding; hem ne gösterileceğini hem de nasıl gösterileceğini kendi içinde barındırır. Başlamadan önce şunları sağlayın: 1. [Adapty React Native SDK](sdk-installation-reactnative) 3.8.0 veya daha yeni bir sürümünü yüklemiş olun. 2. Bir [onboarding oluşturmuş](create-onboarding) olun. 3. Onboarding'i bir [placement](placements)'a eklemiş olun. Adapty React Native SDK, onboarding'leri sunmak için iki yöntem sunar: - **React bileşeni**: Yerleşik bileşen, uygulamanızın mimarisine ve navigasyon sistemine entegre etmenizi sağlar. - **Modal sunum** ## React bileşeni \{#react-component\} Onboarding'i mevcut bileşen ağacınıza gömmek için `AdaptyOnboardingView` bileşenini doğrudan React Native bileşen hiyerarşinizde kullanın. Yerleşik bileşen, uygulamanızın mimarisine ve navigasyon sistemine entegre etmenizi sağlar. :::note Android'de `AdaptyOnboardingView` için görsel bir render sorununun önüne geçmek amacıyla ek yapılandırma yapmanızı öneririz. Bkz. [Android'de sistem arayüzü onboarding içeriğiyle çakışıyor](#system-ui-overlaps-onboarding-content-on-android). :::
Ardından bu ID'yi kodunuzda kullanabilir ve özel bir eylem olarak işleyebilirsiniz. Örneğin, bir kullanıcı **Login** veya **Allow notifications** gibi özel bir butona dokunduğunda, olay işleyicisi **Action ID** parametresiyle tetiklenir ve bu parametre builder'daki **Action ID** ile eşleşir. "allowNotifications" gibi kendi ID'lerinizi oluşturabilirsiniz.
:::important
Kullanıcı onboarding'i kapattığında ne olacağını yönetmeniz gerektiğini unutmayın. Örneğin, onboarding'in kendisini göstermeyi durdurmanız gerekir.
:::
2. Abonelik grubu adına tıklayın. Ürünlerinizi **Subscriptions** bölümü altında göreceksiniz.
3. Test ettiğiniz ürünün **Ready to Submit** olarak işaretlendiğinden emin olun.
4. Tablodaki ürün ID'sini Adapty Kontrol Paneli'ndeki [**Products**](https://app.adapty.io/products) sekmesindekiyle karşılaştırın. ID'ler eşleşmiyorsa, tablodaki ürün ID'sini kopyalayın ve Adapty Kontrol Paneli'nde bununla bir [ürün oluşturun](create-product).
## Adım 3. Ürün kullanılabilirliğini kontrol edin \{#step-4-check-product-availability\}
1. **App Store Connect**'e geri dönün ve aynı **Subscriptions** bölümünü açın.
2. Ürünlerinizi görüntülemek için abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Availability** bölümüne kaydırın ve gerekli tüm ülke ve bölgelerin listelendiğini kontrol edin.
## Adım 4. Ürün fiyatlarını kontrol edin \{#step-5-check-product-prices\}
1. **App Store Connect**'te tekrar **Monetization** → **Subscriptions** bölümüne gidin.
2. Abonelik grubu adına tıklayın.
3. Test ettiğiniz ürünü seçin.
4. **Subscription Pricing** bölümüne kaydırın ve **Current Pricing for New Subscribers** bölümünü genişletin.
5. Gerekli tüm fiyatların listelendiğinden emin olun.
## Adım 5. Uygulamanın ücretli durumunu, banka hesabını ve vergi formlarının aktif olduğunu kontrol edin \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) ana sayfasında **Business** seçeneğine tıklayın.
2. Şirket adınızı seçin.
3. Aşağı kaydırın ve **Paid Apps Agreement**, **Bank Account** ile **Tax forms** alanlarının tümünün **Active** olarak göründüğünü doğrulayın.
Bu adımları izleyerek `InvalidProductIdentifiers` uyarısını çözebilir ve ürünlerinizi mağazada yayına alabilirsiniz.
## Adım 6. Ürün takılıp kaldıysa yeniden oluşturun \{#step-6-recreate-the-product-if-its-stuck\}
1–5 arası adımların hepsi geçebilir — `Approved` durumu, eşleşen Bundle ID, geçerli API anahtarı — ama SDK yine de `1000 noProductIDsFound` hatası döndürebilir. Bu durumda ürün Apple'ın kayıt defterinde takılı kalmış olabilir. Apple'ın ürün kayıt defteri zaman zaman öyle bir duruma girer ki ürün App Store Connect arayüzünde görünür ama StoreKit arama yoluna açık değildir.
Ürünü App Store Connect'ten silip aynı ürün ID'siyle yeniden oluşturun. Yeniden oluşturmanın ardından yayılması için 24 saate kadar bekleyin.
---
# File: cantMakePayments-react-native
---
---
title: "React Native SDK'da Code-1003 cantMakePayment hatasının çözümü"
description: "Adapty'de abonelikleri yönetirken oluşan ödeme yapılamıyor hatasını çözün."
---
1003 hatası, `cantMakePayments`, bu cihazda uygulama içi satın alımların yapılamayacağını belirtir.
`cantMakePayments` hatasıyla karşılaşıyorsanız, bu genellikle şu nedenlerden biriyle ilgilidir:
- Cihaz kısıtlamaları: Bu hata Adapty ile ilgili değildir. Aşağıdaki çözüm yollarına bakın.
- Observer mode yapılandırması: `makePurchase` metodu ve observer mode aynı anda kullanılamaz. Aşağıdaki bölüme bakın.
## Sorun: Cihaz kısıtlamaları \{#issue-device-restrictions\}
| Sorun | Çözüm |
|------------------------------|------------------------------------------------------------------------------------------------------------------------------|
| Ekran Süresi kısıtlamaları | [Ekran Süresi](https://support.apple.com/en-us/102470) ayarlarında Uygulama İçi Satın Alım kısıtlamalarını devre dışı bırakın |
| Hesap askıya alındı | Hesap sorunlarını çözmek için Apple Destek ile iletişime geçin |
| Bölgesel kısıtlamalar | Desteklenen bir bölgeden App Store hesabı kullanın |
## Sorun: Observer mode ve makePurchase'ı birlikte kullanmak \{#issue-using-both-observer-mode-and-makepurchase\}
Satın alımları yönetmek için `makePurchases` kullanıyorsanız Observer mode'u kullanmanıza gerek yoktur. [Observer mode](observer-vs-full-mode), yalnızca satın alma mantığını kendiniz uyguladığınızda gereklidir.
Dolayısıyla `makePurchase` kullanıyorsanız, SDK etkinleştirme kodundan Observer mode'u etkinleştiren kısmı güvenle kaldırabilirsiniz.
---
# File: migration-to-react-native-sdk-v4
---
---
title: "Adapty React Native SDK'yı v. 4.0'a geçirme"
description: "Paywall API'lerini flow API'leriyle değiştirerek Adapty React Native SDK v4.0 (beta) sürümüne geçin — hem Flow Builder hem de Paywall Builder ile uyumludur."
---
Adapty React Native SDK 4.0 (beta), flow'ları tanıtır ve paywall API'lerini buna göre yeniden adlandırır. Yeni API'ler hem yeni Flow Builder hem de mevcut Paywall Builder ile çalışır — Adapty Kontrol Paneli tarafında herhangi bir kurulum değişikliği gerekmez.
## Hızlı başvuru \{#quick-reference\}
| v3 | v4 |
|---|---|
| `adapty.getPaywall(placementId, locale?, params?)` | `adapty.getFlow(placementId, params?)` |
| `adapty.getPaywallForDefaultAudience(placementId, locale?, params?)` | `adapty.getFlowForDefaultAudience(placementId, params?)` |
| `adapty.getPaywallProducts(paywall)` | `adapty.getPaywallProducts(flow)` |
| `adapty.logShowPaywall(paywall)` | `adapty.logShowFlow(flow)` |
| `AdaptyPaywall` (tür) | `AdaptyFlow` |
| `createPaywallView(paywall)` | `createFlowView(flow)` |
| `AdaptyPaywallView` (bileşen) | `AdaptyFlowView` |
| `EventHandlers` (tür) | `FlowEventHandlers` |
| `onPaywallShown` | `onAppeared` |
| `onPaywallClosed` | `onDisappeared` |
| `onRenderingFailed` | `onError` |
`AdaptyPaywallProduct` adını korur — ürünler hâlâ bir flow'a aittir ve `getPaywallProducts` artık bir `AdaptyFlow` alır. `getFlow` ve `getFlowForDefaultAudience` metodları artık `locale` parametresi almaz. `present`, `dismiss`, `setEventHandlers` ve `showDialog` view metodları ile `onCloseButtonPress`, `onUrlPress`, `onCustomAction`, `onProductSelected`, `onPurchaseStarted`, `onPurchaseCompleted`, `onPurchaseFailed`, `onRestoreStarted`, `onRestoreCompleted`, `onRestoreFailed`, `onLoadingProductsFailed`, `onWebPaymentNavigationFinished` ve `onAndroidSystemBack` olay işleyicileri v3 ile aynı adları korur. Bazı varsayılan davranışlar değişti — bkz. [Varsayılan davranış değişiklikleri](#default-behavior-changes).
## Minimum iOS sürümü \{#minimum-ios-version\}
Adapty React Native SDK 4.0, minimum iOS dağıtım hedefini iOS 13.0'dan **iOS 15.0**'a yükseltir. Yükseltmeden önce iOS dağıtım hedefinizi 15.0 veya sonrasına ayarlayın.
## Kurulum \{#installation\}
### Paketi güncelleyin \{#update-the-package\}
v4.0 bir ön sürümdür, bu yüzden tam sürümü sabitleyin — npm, caret/tilde aralıkları üzerinden ön sürümleri seçmez:
```bash showLineNumbers
npm install react-native-adapty@4.0.0
# or
yarn add react-native-adapty@4.0.0
```
### iOS: Yerel SDK'lar artık Swift Package Manager üzerinden geliyor \{#ios-native-sdks-now-come-through-swift-package-manager\}
[CocoaPods'un spec deposu Aralık 2026'da salt okunur hale geliyor](https://blog.cocoapods.org/CocoaPods-Specs-Repo/), bu nedenle v4 itibarıyla yerel `Adapty`, `AdaptyUI` ve `AdaptyPlugin` SDK'ları **artık CocoaPods alt bağımlılığı olarak çekilmiyor** — podspec bunları **Swift Package Manager** üzerinden çekiyor (`spm_dependency` yardımcısı aracılığıyla). Bunun için iki şey gerekiyor:
- **React Native 0.75 veya üstü** — `spm_dependency` podspec yardımcısı için gereklidir. Daha eski bir sürümde `pod install` açık bir hata ile başarısız olur; önce React Native'i güncelleyin ya da `react-native-adapty` 3.x sürümünde kalın.
- **Dinamik framework'ler** — SPM bağımlılıkları dinamik bağlantı gerektirir. Bunu nasıl etkinleştireceğiniz Expo ve bare React Native için farklıdır.
#### Expo
[`expo-build-properties`](https://docs.expo.dev/versions/latest/sdk/build-properties/) config plugin'ini ekleyin ve `app.json` (veya `app.config.js`) dosyasında iOS framework'lerini dinamik olarak ayarlayın:
```json showLineNumbers title="app.json"
{
"expo": {
"plugins": [
[
"expo-build-properties",
{
"ios": {
"useFrameworks": "dynamic"
}
}
]
]
}
}
```
Ardından eklentiyi yükleyin ve native projeyi yeniden oluşturun:
```bash showLineNumbers
npx expo install expo-build-properties
npx expo prebuild --clean
```
#### Bare React Native \{#bare-react-native\}
iOS hedefinize dinamik framework'leri ekleyin, ardından pod'ları yeniden yükleyin:
```ruby showLineNumbers title="ios/Podfile"
use_frameworks! :linkage => :dynamic
```
```bash showLineNumbers
cd ios && pod install --repo-update
```
Daha önce `Adapty`, `AdaptyUI` veya `AdaptyPlugin`'i CocoaPods alt bağımlılığı olarak çektiyseniz, önce `Podfile` dosyanızdaki açık `pod 'Adapty'`, `pod 'AdaptyUI'` veya `pod 'AdaptyPlugin'` satırlarını kaldırın.
:::warning
Varsayılan statik bağlamadan dinamik framework'lere geçiş, modüler başlıkları henüz desteklemeyen kütüphanelerle çakışabilir ve Flipper ile uyumsuz olabilir. Derleme sorunlarıyla karşılaşırsanız, şu kaynağa bakın: [Swift Package Manager'ı React Native kütüphaneleriyle entegre etme](https://www.callstack.com/blog/integrating-swift-package-manager-with-react-native-libraries).
:::
Tam kurulum için [Adapty SDK'yı Yükle](sdk-installation-reactnative) sayfasına bakın.
## Flow'ları getirme \{#fetching-flows\}
### getPaywall → getFlow
Döndürülen tür `AdaptyPaywall`'dan `AdaptyFlow`'a değişiyor ve `locale` parametresi kaldırılıyor — bir flow render ederken locale otomatik olarak belirlenir; özel paywalllar için tüm locale'ler `flow.remoteConfigs` içinde döner:
```diff showLineNumbers
- const paywall = await adapty.getPaywall('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
```
`getPaywallForDefaultAudience` da aynı şekilde yeniden adlandırıldı:
```diff showLineNumbers
- const paywall = await adapty.getPaywallForDefaultAudience('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlowForDefaultAudience('YOUR_PLACEMENT_ID');
```
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` adını korur ancak artık bir `AdaptyFlow` alır:
```diff showLineNumbers
- const products = await adapty.getPaywallProducts(paywall);
+ const products = await adapty.getPaywallProducts(flow);
```
## Veri modeli \{#data-model\}
`getFlow`, `AdaptyPaywall` yerine bir `AdaptyFlow` döndürür ve nesne yapısı değişti:
| v3 `AdaptyPaywall` alanı | v4 `AdaptyFlow` alanı | İşlem |
|---|---|---|
| `remoteConfig?` (tek) | `remoteConfigs?: AdaptyRemoteConfig[]` (dizi) | Bir flow, yapılandırılmış her dil için bir remote config taşır. Kullanıcıyla eşleşeni okuyun: `flow.remoteConfigs?.find((c) => c.lang === 'en')`. |
| `products` | `flow.paywalls[i].productIdentifiers` | Ürün tanımlayıcıları artık flow'da değil, her flow varyasyonunda yer alır. |
| `webPurchaseUrl?` | `flow.paywalls[i].webPurchaseUrl` | Flow'dan her paywall varyasyonuna taşındı. |
| `version?: number` | `flowVersionId?: string` | Yeniden adlandırıldı ve tür `number`'dan `string`'e değiştirildi. |
| `hasViewConfiguration` | kaldırıldı | Kodunuzdaki tüm `hasViewConfiguration` kontrollerini kaldırın. |
| `requestLocale` | kaldırıldı | Dil artık modelin bir parçası değil. |
| _(yeni)_ | `paywalls: AdaptyFlowPaywall[]` | Her giriş, flow içindeki bir paywall varyasyonudur. |
| _(yeni)_ | `responseCreatedAt: number` | Sunucu yanıt zaman damgası, milisaniye cinsinden. |
Ürün tanımlayıcıları flow'dan her varyasyona taşındı:
```diff showLineNumbers
- const ids = paywall.products;
+ const ids = flow.paywalls[0].productIdentifiers;
```
## Web paywall metotları \{#web-paywall-methods\}
`openWebPaywall` ve `createWebPaywallUrl` adlarını korur, ancak ilk argüman artık `AdaptyPaywall` yerine bir `AdaptyFlowPaywall`'dır (bir flow varyasyonu). Yine de bir `AdaptyPaywallProduct` geçirebilirsiniz.
```diff showLineNumbers
const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
- await adapty.openWebPaywall(paywall);
+ await adapty.openWebPaywall(flow.paywalls[0]);
```
## Flow görüntülemelerini izleme \{#tracking-flow-views\}
### logShowPaywall → logShowFlow
`logShowPaywall`, `logShowFlow` olarak yeniden adlandırıldı ve artık bir `AdaptyFlow` alır. Olay hâlâ aynı varyasyona kaydedilir, dolayısıyla mevcut huni ve A/B testi metrikleri kontrol paneli değişiklikleri olmadan çalışmaya devam eder.
```diff showLineNumbers
- await adapty.logShowPaywall(paywall);
+ await adapty.logShowFlow(flow);
```
v3'te olduğu gibi, [Flow Builder](adapty-flow-builder) veya [Paywall Builder](adapty-paywall-builder) tarafından render edilen flow'ları ya da paywall'ları görüntülerken bu metodu çağırmanız gerekmez — Adapty bu görüntülemeleri otomatik olarak izler.
## Flow'ları görüntüleme \{#displaying-flows\}
### createPaywallView → createFlowView
Fabrika fonksiyonunu yeniden adlandırın ve `AdaptyFlow`'u geçirin. Dönen denetleyicinin metotları (`present`, `dismiss`, `setEventHandlers`, `showDialog`) değişmedi:
```diff showLineNumbers
- import { createPaywallView } from 'react-native-adapty';
+ import { createFlowView } from 'react-native-adapty';
- const view = await createPaywallView(paywall);
+ const view = await createFlowView(flow);
await view.present();
```
### AdaptyPaywallView → AdaptyFlowView
React bileşeniyle render ediyorsanız, bileşeni yeniden adlandırın ve `flow` prop'unu geçin:
```diff showLineNumbers
- import { AdaptyPaywallView } from 'react-native-adapty';
+ import { AdaptyFlowView } from 'react-native-adapty';
- ```diff showLineNumbers - subscriptionDetails?: AdaptySubscriptionDetails; + subscription?: AdaptySubscriptionDetails; ``` 2. [AdaptySubscriptionDetails](https://react-native.adapty.io/interfaces/adaptysubscriptiondetails): - `promotionalOffer` kaldırıldı. Artık promosyon teklifi, yalnızca mevcut olduğunda `offer` özelliği içinde iletilir. Bu durumda `offer?.identifier?.type` değeri `'promotional'` olacaktır. - `introductoryOfferEligibility` kaldırıldı (teklifler yalnızca kullanıcı uygunsa döndürülür). - `offerId` kaldırıldı. Teklif ID'si artık `AdaptySubscriptionOffer.identifier` içinde saklanır. - `offerTags`, `AdaptySubscriptionOffer.android` içine taşındı.
```diff showLineNumbers - introductoryOffers?: AdaptyDiscountPhase[]; + offer?: AdaptySubscriptionOffer; ios?: { - promotionalOffer?: AdaptyDiscountPhase; subscriptionGroupIdentifier?: string; }; android?: { - offerId?: string; basePlanId: string; - introductoryOfferEligibility: OfferEligibility; - offerTags?: string[]; renewalType?: 'prepaid' | 'autorenewable'; }; } ``` 3. [AdaptyDiscountPhase](https://react-native.adapty.io/interfaces/adaptydiscountphase): - `identifier` alanı `AdaptyDiscountPhase` modelinden kaldırıldı. Teklif tanımlayıcısı artık `AdaptySubscriptionOffer.identifier` içinde saklanıyor.
```diff showLineNumbers - ios?: { - readonly identifier?: string; - }; ``` ### Kaldırılan modeller \{#remove-models\} 1. `AttributionSource`: - Daha önce `AttributionSource`'un kullanıldığı yerlerde artık doğrudan string kullanılmaktadır. 2. `OfferEligibility`: - Bu model artık gerekli olmadığından kaldırılmıştır. Artık bir teklif yalnızca kullanıcı uygunsa döndürülmektedir. ## `getProductsIntroductoryOfferEligibility` metodunu kaldırma \{#remove-getproductsintroductoryoffereligibility-method\} Adapty SDK 3.3.1 öncesinde, ürün nesneleri kullanıcının uygun olup olmadığından bağımsız olarak her zaman teklifleri içeriyordu. Bu durum, teklifi kullanmadan önce uygunluğu manuel olarak kontrol etmenizi gerektiriyordu. 3.3.1 sürümünden itibaren ürün nesnesi, teklifleri yalnızca kullanıcı uygunsa içermektedir. Bu sayede bir teklif mevcutsa kullanıcının uygun olduğunu varsayabilirsiniz; bu da süreci basitleştirir. ## Satın alma işlemini güncelleme \{#update-making-purchase\} Önceki sürümlerde, iptal edilen ve bekleyen satın almalar hata olarak değerlendirilir ve sırasıyla `2: 'paymentCancelled'` ve `25: 'pendingPurchase'` kodları döndürülürdü. 3.3.1 sürümünden itibaren, iptal edilen ve bekleyen satın almalar artık başarılı sonuç olarak kabul edilmekte ve buna göre işleme alınması gerekmektedir: ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; } } catch (error) { // Handle the error } ``` ## Paywall Builder paywall sunumunu güncelleme \{#update-paywall-builder-paywall-presentation\} Güncellenmiş örnekler için [React Native'de yeni Paywall Builder paywalllerini sunma](react-native-present-paywalls) belgelerine bakın. ```diff showLineNumbers - import { createPaywallView } from '@adapty/react-native-ui'; + import { createPaywallView } from 'react-native-adapty/dist/ui'; const view = await createPaywallView(paywall); view.registerEventHandlers(); // handle close press, etc try { await view.present(); } catch (error) { // handle the error } ``` ## Geliştirici tanımlı zamanlayıcı uygulamasını güncelleme \{#update-developer-defined-timer-implementation\} `timerInfo` parametresini `customTimers` olarak yeniden adlandırın: ```diff showLineNumbers - let timerInfo = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } + let customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } //and then you can pass it to createPaywallView as follows: - view = await createPaywallView(paywall, { timerInfo }) + view = await createPaywallView(paywall, { customTimers }) ``` ## Paywall Builder satın alma etkinliklerini değiştirme \{#modify-paywall-builder-purchase-events\} Daha önce: - İptal edilen satın almalar `onPurchaseCancelled` callback'ini tetikliyordu. - Beklemedeki satın almalar `25: 'pendingPurchase'` hata kodunu döndürüyordu. Artık: - Her ikisi de `onPurchaseCompleted` callback'i tarafından işleniyor. #### Geçiş adımları: \{#steps-to-migrate\} 1. `onPurchaseCancelled` callback'ini kaldırın. 2. `25: 'pendingPurchase'` için hata kodu işlemeyi kaldırın. 3. `onPurchaseCompleted` callback'ini güncelleyin: ```typescript showLineNumbers const view = await createPaywallView(paywall); const unsubscribe = view.registerEventHandlers({ // ... other optional callbacks onPurchaseCompleted(purchaseResult, product) { switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; // highlight-start case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; // highlight-end } // highlight-start return purchaseResult.type !== 'user_cancelled'; // highlight-end }, }); ``` ## Paywall Builder özel eylem olaylarını değiştirme \{#modify-paywall-builder-custom-action-events\} Kaldırılan callback'ler: - `onAction` - `onCustomEvent` Eklenen callback: - Yeni `onCustomAction(actionId)` callback'i. Özel eylemler için bunu kullanın. ## `onProductSelected` callback'ini değiştirme \{#modify-onproductselected-callback\} Önceden `onProductSelected`, `product` nesnesini gerektiriyordu. Artık string olarak `productId` gerektirmektedir. ## `updateProfile` metodundan üçüncü taraf entegrasyon parametrelerini kaldırma \{#remove-third-party-integration-parameters-from-updateprofile-method\} Üçüncü taraf entegrasyon tanımlayıcıları artık `setIntegrationIdentifier` metodu kullanılarak ayarlanmaktadır. `updateProfile` metodu artık bunları kabul etmemektedir. ## Üçüncü taraf entegrasyon SDK yapılandırmasını güncelleme \{#update-third-party-integration-sdk-configuration\} Adapty React Native SDK 3.3.1 ve sonraki sürümlerle entegrasyonların düzgün çalışmasını sağlamak için aşağıdaki bölümlerde açıklandığı gibi SDK yapılandırmalarınızı güncelleyin. Ayrıca attribution tanımlayıcısını almak için `AttributionSource` kullandıysanız, gerekli tanımlayıcıyı string olarak sağlayacak şekilde kodunuzu değiştirin. ### Adjust Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Adjust entegrasyonu için SDK yapılandırması](adjust#connect-your-app-to-adjust) sayfasına bakın. ```diff showLineNumbers import { Adjust, AdjustConfig } from "react-native-adjust"; import { adapty } from "react-native-adapty"; var adjustConfig = new AdjustConfig(appToken, environment); // Before submiting Adjust config... adjustConfig.setAttributionCallbackListener(attribution => { // Make sure Adapty SDK is activated at this point // You may want to lock this thread awaiting of `activate` adapty.updateAttribution(attribution, "adjust"); }); // ... Adjust.create(adjustConfig); + Adjust.getAdid((adid) => { + if (adid) + adapty.setIntegrationIdentifier("adjust_device_id", adid); + }); ``` ### AirBridge \{#airbridge\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [AirBridge entegrasyonu için SDK yapılandırması](airbridge#connect-your-app-to-airbridge) bölümüne bakın. ```diff showLineNumbers import Airbridge from 'airbridge-react-native-sdk'; import { adapty } from 'react-native-adapty'; try { const deviceId = await Airbridge.state.deviceUUID(); - await adapty.updateProfile({ - airbridgeDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("airbridge_device_id", deviceId); } catch (error) { // handle `AdaptyError` } ``` ### Amplitude \{#amplitude\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Amplitude entegrasyonu için SDK yapılandırması](amplitude#sdk-configuration) bölümüne bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; try { - await adapty.updateProfile({ - amplitudeDeviceId: deviceId, - amplitudeUserId: userId, - }); + await adapty.setIntegrationIdentifier("amplitude_device_id", deviceId); + await adapty.setIntegrationIdentifier("amplitude_user_id", userId); } catch (error) { // handle `AdaptyError` } ``` ### AppMetrica Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [AppMetrica entegrasyonunda SDK yapılandırması](appmetrica#sdk-configuration) sayfasına bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import AppMetrica, { DEVICE_ID_KEY, StartupParams, StartupParamsReason } from '@appmetrica/react-native-analytics'; // ... const startupParamsCallback = async ( params?: StartupParams, reason?: StartupParamsReason ) => { const deviceId = params?.deviceId if (deviceId) { try { - await adapty.updateProfile({ - appmetricaProfileId: 'YOUR_ADAPTY_CUSTOMER_USER_ID', - appmetricaDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("appmetrica_profile_id", 'YOUR_ADAPTY_CUSTOMER_USER_ID'); + await adapty.setIntegrationIdentifier("appmetrica_device_id", deviceId); } catch (error) { // handle `AdaptyError` } } } AppMetrica.requestStartupParams(startupParamsCallback, [DEVICE_ID_KEY]) ``` ### AppsFlyer Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [AppsFlyer entegrasyonu için SDK yapılandırması](appsflyer#connect-your-app-to-appsflyer) bölümüne bakın. ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import appsFlyer from 'react-native-appsflyer'; appsFlyer.onInstallConversionData(installData => { try { - const networkUserId = appsFlyer.getAppsFlyerUID(); - adapty.updateAttribution(installData, AttributionSource.AppsFlyer, networkUserId); + const uid = appsFlyer.getAppsFlyerUID(); + adapty.setIntegrationIdentifier("appsflyer_id", uid); + adapty.updateAttribution(installData, "appsflyer"); } catch (error) { // handle the error } }); // ... appsFlyer.initSdk(/*...*/); ``` ### Branch \{#branch\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Branch entegrasyonu için SDK yapılandırması](branch#connect-your-app-to-branch) bölümüne bakın. ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import branch from 'react-native-branch'; branch.subscribe({ enComplete: ({ params, }) => { - adapty.updateAttribution(params, AttributionSource.Branch); + adapty.updateAttribution(params, "branch"); }, }); ``` ### Facebook Ads Aşağıda gösterildiği gibi mobil uygulama kodunuzu güncelleyin. Tam kod örneği için [Facebook Ads entegrasyonu için SDK yapılandırması](facebook-ads#connect-your-app-to-facebook-ads) bölümüne bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { AppEventsLogger } from 'react-native-fbsdk-next'; try { const anonymousId = await AppEventsLogger.getAnonymousID(); - await adapty.updateProfile({ - facebookAnonymousId: anonymousId, - }); + await adapty.setIntegrationIdentifier("facebook_anonymous_id", anonymousId); } catch (error) { // handle `AdaptyError` } ``` ### Firebase ve Google Analytics \{#firebase-and-google-analytics\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Firebase ve Google Analytics entegrasyonu için SDK yapılandırması](firebase-and-google-analytics) sayfasına bakın. ```diff showLineNumbers import analytics from '@react-native-firebase/analytics'; import { adapty } from 'react-native-adapty'; try { const appInstanceId = await analytics().getAppInstanceId(); - await adapty.updateProfile({ - firebaseAppInstanceId: appInstanceId, - }); + await adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId); } catch (error) { // handle `AdaptyError` } ``` ### Mixpanel \{#mixpanel\} Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [Mixpanel entegrasyonu için SDK yapılandırması](mixpanel#sdk-configuration) bölümüne bakın. ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { Mixpanel } from 'mixpanel-react-native'; // ... try { - await adapty.updateProfile({ - mixpanelUserId: mixpanelUserId, - }); + await adapty.setIntegrationIdentifier("mixpanel_user_id", mixpanelUserId); } catch (error) { // handle `AdaptyError` } ``` ### OneSignal Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için [OneSignal entegrasyonu için SDK yapılandırması](onesignal#sdk-configuration) bölümüne bakın.