Flutter SDK ile mobil uygulamada satın alma yapma
Mobil uygulamanızda paywallları görüntülemek, kullanıcılara premium içerik veya hizmetlere erişim sunmanın temel adımlarından biridir. Ancak, bir paywallı göstermek yalnızca Adapty’nin ekranı kendisi render ettiği durumlarda —yani bir flow veya eski Paywall Builder’dan bir paywall— satın alma işlemini tek başına destekler.
Ekranı kendi kodunuzda render ediyorsanız, satın alma işlemini tamamlamak ve istenen içeriğin kilidini açmak için .makePurchase() adlı ayrı bir metot kullanmanız gerekir. Bu metot, kullanıcıların paywalllarla etkileşime geçmesi ve istedikleri işlemleri gerçekleştirmesi için bir köprü görevi görür.
Ürününü satın almaya çalışan kullanıcı için paywallınızda aktif bir promosyon teklifi varsa, Adapty bunu satın alma sırasında otomatik olarak uygular.
Başlangıç teklifinin otomatik olarak uygulanabilmesi için ekranın Adapty tarafından render edilmesi gerektiğini unutmayın.
Diğer durumlarda, iOS’ta başlangıç teklifi uygunluğunu doğrulamanız gerekecektir. Bu adımı atlamak, yayın sırasında uygulamanızın reddedilmesine yol açabilir. Bunun yanı sıra, başlangıç teklifine hak kazanan kullanıcılardan tam ücret alınmasına neden olabilir.
Başlangıç yapılandırmasını tek bir adımı atlamadan tamamladığınızdan emin olun. Bu olmadan satın almaları doğrulayamayız.
Satın alma işlemi yap
Adapty ekranınızı mı oluşturuyor? Bir flow veya Paywall Builder paywallı için satın alma işlemleri otomatik olarak gerçekleştirilir—bu adımı atlayabilirsiniz.
Adım adım rehber mi arıyorsunuz? Tam bağlamıyla uçtan uca uygulama talimatları için hızlı başlangıç kılavuzuna göz atın.
try {
final purchaseResult = await Adapty().makePurchase(product: product);
switch (purchaseResult) {
case AdaptyPurchaseResultSuccess(profile: final profile):
if (profile.accessLevels['premium']?.isActive ?? false) {
// Grant access to the paid features
}
break;
case AdaptyPurchaseResultPending():
break;
case AdaptyPurchaseResultUserCancelled():
break;
default:
break;
}
} on AdaptyError catch (adaptyError) {
// Handle the error
} catch (e) {
// Handle the error
}
İstek parametreleri:
| Parametre | Zorunluluk | Açıklama |
|---|---|---|
| Product | zorunlu | Paywall’dan alınan bir AdaptyPaywallProduct nesnesi. |
Yanıt parametreleri:
| Parametre | Açıklama |
|---|---|
| Profile | İstek başarılı olursa yanıt bu nesneyi içerir. Bir AdaptyProfile nesnesi, kullanıcının uygulama içindeki access level’ları, abonelikleri ve tek seferlik satın almaları hakkında kapsamlı bilgi sağlar. Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin. |
Not: Apple’ın StoreKit sürümü v2.0’ın altında ve Adapty SDK sürümü v2.9.0’ın altında kullanıyorsanız, bunun yerine Apple App Store paylaşılan sırrı sağlamanız gerekir. Bu yöntem şu anda Apple tarafından kullanımdan kaldırılmıştır.
Satın alma sırasında aboneliği değiştirme
Bir kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu işlemin nasıl gerçekleşeceği uygulama mağazasına göre değişir:
- App Store’da abonelik, abonelik grubu içinde otomatik olarak güncellenir. Kullanıcı bir gruptan abonelik satın alırken başka bir gruptan aktif aboneliği varsa, her iki abonelik de aynı anda aktif olur.
- Google Play’de abonelik otomatik olarak güncellenmez. Geçişi aşağıda açıklandığı şekilde mobil uygulama kodunuzda yönetmeniz gerekir.
Android’de aboneliği başka bir abonelikle değiştirmek için .makePurchase() metodunu ek parametre ile çağırın:
try {
final subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters(
'OLD_PRODUCT_ID',
AdaptyAndroidSubscriptionUpdateReplacementMode.immediateWithTimeProration,
);
final result = await Adapty().makePurchase(
product: product,
parameters: AdaptyPurchaseParameters(
subscriptionUpdateParams: subscriptionUpdateParams,
),
);
// başarılı çapraz yükseltme
} on AdaptyError catch (adaptyError) {
// Hatayı işle
} catch (e) {
// Hatayı işle
}
Ek istek parametresi:
| Parametre | Zorunluluk | Açıklama |
|---|---|---|
| parameters | zorunlu | subscriptionUpdateParams alanı bir AdaptyAndroidSubscriptionUpdateParameters nesnesine ayarlanmış AdaptyPurchaseParameters nesnesi. |
Google Developer belgelerinde abonelikler ve değiştirme modları hakkında daha fazla bilgi edinebilirsiniz:
- Değiştirme modları hakkında
- Google’ın değiştirme modları için önerileri
- Değiştirme modu
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. Not: Gerçek abonelik değişikliği yalnızca mevcut abonelik faturalandırma dönemi sona erdiğinde gerçekleşir.
iOS’ta teklif kodlarını kullanma
Teklif kodları hakkında
Teklif kodları, belirli kullanıcılara indirim veya ücretsiz deneme sunmanızı sağlar. Otomatik olarak uygulanan normal tekliflerin aksine, teklif kodları uygulama dışında — e-posta kampanyaları, sosyal medya veya basılı materyaller aracılığıyla — dağıtılır. Kullanıcılar bu kodları App Store’a girerek, bir kullanım URL’si aracılığıyla veya uygulama içi bir diyalog üzerinden kullanabilir.
Teklif kodlarını ayarlamak için App Store Connect’te bir aboneliği açın ve Offer Codes bölümüne gidin. Üç tür teklif kodu oluşturabilirsiniz:
- Free — abonelik belirli bir süre boyunca ücretsizdir; sonraki yenilemede tam fiyat uygulanır.
- Pay as you go — kullanıcı, belirli bir süre boyunca her fatura döngüsünde indirimli fiyat öder; ardından abonelik tam fiyatla yenilenir.
- Pay up front — kullanıcı, tüm teklif süresi için tek seferlik indirimli bir fiyat öder; ardından abonelik tam fiyatla yenilenir.
Teklif kodlarını Adapty’ye eklemenize gerek yoktur. Apple, teklif süresi boyunca gerçekleşen her işlemi teklif kodu kategorisiyle etiketler. Bu, ilk kullanımı ve sonraki tüm indirimli yenilemeleri kapsar. Adapty bu etiketi algılar ve her işlemi offer_code teklif kategorisiyle kaydeder. Teklif süresi sona erip abonelik tam fiyatla yenilendiğinde etiket artık mevcut olmaz. Adapty Kontrol Paneli’nde Offer Code teklif türüne göre analizleri filtreleyebilirsiniz.
Gelir tutarsızlığı sorun giderme
Bir teklif kodu işleminin Adapty’de indirimli teklif fiyatı yerine tam ürün fiyatıyla göründüğünü fark ederseniz App Store Connect’te aşağıdakileri doğrulayın:
- Teklif kodunun, kullanıcıların kullanabileceği tüm bölgeler için doğru fiyatlandırmanın yapılandırıldığından emin olun.
- Teklif fiyatının, kullanıcının bulunduğu ülke veya bölge için ayarlandığından emin olun. Apple, işlemde bölgesel fiyatı gönderir. Teklif için bölgesel bir fiyat yapılandırılmamışsa Apple tam ürün fiyatını gönderebilir.
Adapty Kontrol Paneli’nde Offer Code teklif türü ve Offer Discount Type filtreleriyle teklif kodu işlemlerini filtreleyip doğrulayabilirsiniz.
Eski promosyon kodları (kullanımdan kaldırıldı)
Apple, Mart 2026’da uygulama içi satın almalar için promosyon kodlarını kullanımdan kaldırdı. Teklif kodları, yapılandırılabilir uygunluk koşulları, son kullanma tarihleri ve çeyrek başına 1 milyona kadar kod gibi daha fazla özellikle bunların yerini alıyor. Uygulama içi satın almalar için daha önce promosyon kodu kullandıysanız App Store Connect’te teklif kodlarına geçiş yapın.
Eski promosyon kodları (uygulama başına sürüm başına 100 ile sınırlı), bir aboneliğe ücretsiz erişim sağlıyordu. Teklif kodlarının aksine, Apple promosyon kodu işlemlerine indirim bilgisi eklemiyordu — makbuzda tam ürün fiyatını gönderiyordu. Sonuç olarak Adapty bu işlemleri tam fiyat üzerinden kaydetti ve bu durum Adapty analizleri ile App Store Connect arasında gelir tutarsızlıklarına yol açtı.
Ücretsiz olması gereken ancak geçmişte tam fiyatla kaydedilmiş işlemler görüyorsanız bunlar büyük olasılıkla eski promosyon kodlarından kaynaklanmaktadır. Bu kodlar artık kullanımdan kaldırıldığından, doğru gelir takibi için teklif kodlarına geçiş yapın.
Uygulamanızda kod kullanma sayfasını görüntülemek için:
try {
await Adapty().presentCodeRedemptionSheet();
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
Gözlemlerimize göre, bazı uygulamalarda Teklif Kodu Kullanma sayfası güvenilir şekilde çalışmayabilir. Kullanıcıyı doğrudan App Store’a yönlendirmenizi öneririz.
Bunu yapmak için aşağıdaki formattaki URL’yi açmanız gerekir:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}
App Store’dan tanıtılan uygulama içi satın almalar
Tanıtılan uygulama içi satın almalar, SDK 4.1 sürümünden itibaren uygulamanıza ulaşır ve uygulamanız tarafından tamamlanır. SDK 4.0’da ise SDK bunları kendi başına tamamlıyordu. 4.1’den itibaren, dinleyicisi olmayan bir tanıtılan satın alma işlemi düşürülür; bu nedenle güncelleme yaparken aşağıdaki dinleyiciyi ekleyin. Bkz. v4.1’e geçiş.
Kullanıcı App Store ürün sayfanızdan bir satın alma başlattığında ve işlem uygulamanıza aktarıldığında, SDK ürünü didReceivePromotedPurchaseStream’e iletir. Stream’e abone olun ve ürünü makePromotedPurchase’a geçirin:
Adapty().didReceivePromotedPurchaseStream.listen((product) async {
try {
final result = await Adapty().makePromotedPurchase(product: product);
// process the purchase result
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
});
activate çağrısının hemen ardından, uygulama başlangıcında abone olun; böylece promosyonlu bir satın alma gelmeden önce listener hazır olur. didReceivePromotedPurchaseStream, olayları yeniden oynatmayan bir broadcast stream’dir: hiçbir şey dinlemiyorken iletilen bir ürün kaybolur.
makePromotedPurchase, herhangi bir satın alma parametresi almaz; çünkü promosyonlu bir ürün App Store’dan gelir ve herhangi bir paywall bağlamı taşımaz. makePurchase ile aynı AdaptyPurchaseResult değerini döndürür.
Yükseltilen ürün bir abonelik teklifi içeriyorsa, SDK bunu satın alma sırasında otomatik olarak uygular. Teklif, iOS 18.0 ve sonrasında onu açığa çıkaran App Store satın alma niyetinden okunur. iOS 16.4–17.x sürümlerinde ise satın alma temel fiyat üzerinden gerçekleşir.
Stream, StoreKit 2 üzerine kurulmuştur ve iOS 16.4 veya sonrasını gerektirir. iOS 16.4 altında ve Android’de hiçbir zaman emit etmez.
Ön ödemeli planları yönetme (Android)
Uygulama kullanıcılarınız ön ödemeli planlar satın alabiliyorsa (örneğin, birkaç aylık yenilenmez abonelik), ön ödemeli planlar için bekleyen işlemleri etkinleştirebilirsiniz.
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withGoogleEnablePendingPrepaidPlans(true),
);