Flutter - Paywall olaylarını yönetme
Bu kılavuz; satın alma, geri yükleme, ürün seçimi ve paywall oluşturma olaylarını kapsar. Bunların yanı sıra düğme işlemlerini de (paywall kapatma, bağlantı açma vb.) uygulamanız gerekir. Ayrıntılar için düğme eylemlerini yönetme kılavuzumuza bakın.
Paywall Builder ile yapılandırılan paywalllar, satın alma ve geri yükleme işlemleri için ekstra kod gerektirmez. Ancak uygulamanızın yanıt verebileceği bazı olaylar üretirler. Bu olaylar arasında düğme tıklamaları (kapat düğmeleri, URL’ler, ürün seçimleri vb.) ve paywall üzerinde gerçekleştirilen satın alma işlemlerine ilişkin bildirimler yer alır. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz.
Bu kılavuz yalnızca Adapty SDK v3.0 veya sonrasını gerektiren yeni Paywall Builder paywallları içindir.
Mobil uygulamanızdaki paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için AdaptyUIPaywallsEventsObserver metodlarını uygulayın ve herhangi bir ekran göstermeden önce observer’ı ayarlayın:
AdaptyUI().setPaywallsEventsObserver(this);
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 göz atın.
Kullanıcı kaynaklı olaylar
Paywall göründü
Bu metot, paywall görünümü ekranda sunulduğunda çağrılır.
iOS’ta, kullanıcı bir paywall içindeki web paywall düğmesine dokunduğunda ve uygulama içi tarayıcıda bir web paywall açıldığında da çağrılır.
void paywallViewDidAppear(AdaptyUIPaywallView view) {
}
Paywall kayboldu
Bu metot, paywall görünümü ekrandan kaldırıldığında çağrılır.
iOS’ta, bir paywall’dan uygulama içi tarayıcıda açılan web paywall ekrandan kaybolduğunda da çağrılır.
void paywallViewDidDisappear(AdaptyUIPaywallView view) {
}
Ürün seçimi
Satın alma için bir ürün seçildiğinde (kullanıcı veya sistem tarafından) bu metot çağrılır:
void paywallViewDidSelectProduct(AdaptyUIPaywallView view, String productId) {
}
Olay örneği (Genişletmek için tıklayın)
{
"productId": "premium_monthly"
}Satın alma başladı
Kullanıcı satın alma sürecini başlattığında bu metot çağrılır:
void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
}
Olay örneği (Genişletmek için tıklayın)
{
"product": {
"vendorProductId": "premium_monthly",
"localizedTitle": "Premium Monthly",
"localizedDescription": "Premium subscription for 1 month",
"localizedPrice": "$9.99",
"price": 9.99,
"currencyCode": "USD"
}
}Satın alma tamamlandı
Bu metot, satın alma başarılı olduğunda, kullanıcı satın almayı iptal ettiğinde veya satın alma beklemede göründüğünde çağrılır:
void paywallViewDidFinishPurchase(AdaptyUIPaywallView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchaseResult) {
switch (purchaseResult) {
case AdaptyPurchaseResultSuccess(profile: final profile):
// successful purchase
break;
case AdaptyPurchaseResultPending():
// purchase is pending
break;
case AdaptyPurchaseResultUserCancelled():
// user cancelled the purchase
break;
default:
break;
}
}
Olay örnekleri (Genişletmek için tıklayın)
// Successful purchase
{
"product": {
"vendorProductId": "premium_monthly",
"localizedTitle": "Premium Monthly",
"localizedDescription": "Premium subscription for 1 month",
"localizedPrice": "$9.99",
"price": 9.99,
"currencyCode": "USD"
},
"purchaseResult": {
"type": "AdaptyPurchaseResultSuccess",
"profile": {
"accessLevels": {
"premium": {
"id": "premium",
"isActive": true,
"expiresAt": "2024-02-15T10:30:00Z"
}
}
}
}
}
// Pending purchase
{
"product": {
"vendorProductId": "premium_monthly",
"localizedTitle": "Premium Monthly",
"localizedDescription": "Premium subscription for 1 month",
"localizedPrice": "$9.99",
"price": 9.99,
"currencyCode": "USD"
},
"purchaseResult": {
"type": "AdaptyPurchaseResultPending"
}
}
// User cancelled purchase
{
"product": {
"vendorProductId": "premium_monthly",
"localizedTitle": "Premium Monthly",
"localizedDescription": "Premium subscription for 1 month",
"localizedPrice": "$9.99",
"price": 9.99,
"currencyCode": "USD"
},
"purchaseResult": {
"type": "AdaptyPurchaseResultUserCancelled"
}
}Bu durumda ekranı kapatmanızı öneririz. Paywall ekranını kapatma hakkında ayrıntılar için Düğme eylemlerine yanıt verme konusuna bakın.
Web ödeme navigasyonu tamamlandı
Bu metot, belirli bir ürün için web paywall açma girişiminin ardından çağrılır. Hem başarılı hem de başarısız navigasyon girişimlerini kapsar:
void paywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view,
AdaptyPaywallProduct? product,
AdaptyError? error) {
}
Parametreler:
| Parametre | Açıklama |
|---|---|
| product | Web paywall’ın açıldığı AdaptyPaywallProduct. null olabilir. |
| error | Web paywall navigasyonu başarısız olursa bir AdaptyError nesnesi; navigasyon başarılıysa null değeri. |
Olay örnekleri (Genişletmek için tıklayın)
// Successful navigation
{
"product": {
"vendorProductId": "premium_monthly",
"localizedTitle": "Premium Monthly",
"localizedDescription": "Premium subscription for 1 month",
"localizedPrice": "$9.99",
"price": 9.99,
"currencyCode": "USD"
},
"error": null
}
// Failed navigation
{
"product": {
"vendorProductId": "premium_monthly",
"localizedTitle": "Premium Monthly",
"localizedDescription": "Premium subscription for 1 month",
"localizedPrice": "$9.99",
"price": 9.99,
"currencyCode": "USD"
},
"error": {
"code": "web_navigation_failed",
"message": "Failed to open web paywall",
"details": {
"underlyingError": "Browser unavailable"
}
}
}Satın alma başarısız oldu
Bu metot, satın alma başarısız olduğunda (örneğin ödeme sorunları veya ağ hataları nedeniyle) çağrılır. Kullanıcının iptal ettiği veya beklemedeki işlemler için tetiklenmez; bunlar paywallViewDidFinishPurchase tarafından yönetilir:
void paywallViewDidFailPurchase(AdaptyUIPaywallView view,
AdaptyPaywallProduct product,
AdaptyError error) {
}
Olay örneği (Genişletmek için tıklayın)
{
"product": {
"vendorProductId": "premium_monthly",
"localizedTitle": "Premium Monthly",
"localizedDescription": "Premium subscription for 1 month",
"localizedPrice": "$9.99",
"price": 9.99,
"currencyCode": "USD"
},
"error": {
"code": "purchase_failed",
"message": "Purchase failed due to insufficient funds",
"details": {
"underlyingError": "Insufficient funds in account"
}
}
}Geri yükleme başladı
Kullanıcı geri yükleme sürecini başlattığında bu metot çağrılır:
void paywallViewDidStartRestore(AdaptyUIPaywallView view) {
}
Geri yükleme başarılı
Satın alma geri yükleme işlemi başarılı olursa bu metot çağrılır:
void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
}
Olay örneği (Genişletmek için tıklayın)
{
"profile": {
"accessLevels": {
"premium": {
"id": "premium",
"isActive": true,
"expiresAt": "2024-02-15T10:30:00Z"
}
},
"subscriptions": [
{
"vendorProductId": "premium_monthly",
"isActive": true,
"expiresAt": "2024-02-15T10:30:00Z"
}
]
}
}Kullanıcının gerekli accessLevel’a sahip olması durumunda ekranı kapatmanızı öneririz. Bunu nasıl kontrol edeceğinizi öğrenmek için Abonelik durumu konusuna, paywall ekranını nasıl kapatacağınızı öğrenmek için ise Düğme eylemlerine yanıt verme konusuna bakın.
Geri yükleme başarısız oldu
Satın alma geri yükleme işlemi başarısız olursa bu metot çağrılır:
void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) {
}
Olay örneği (Genişletmek için tıklayın)
{
"error": {
"code": "restore_failed",
"message": "Purchase restoration failed",
"details": {
"underlyingError": "No previous purchases found"
}
}
}Veri çekme ve oluşturma
Ürün yükleme hataları
Başlatma sırasında ürün dizisi iletmezseniz AdaptyUI, gerekli nesneleri sunucudan kendi başına alır. Bu işlem başarısız olursa AdaptyUI hatayı bu metodu çağırarak bildirir:
void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) {
}
Olay örneği (Genişletmek için tıklayın)
{
"error": {
"code": "products_loading_failed",
"message": "Failed to load products from the server",
"details": {
"underlyingError": "Network timeout"
}
}
}Oluşturma hataları
Arayüz oluşturma sırasında bir hata oluşursa bu metot çağrılarak bildirilir. Varsayılan olarak (v3.15.2’den itibaren), oluşturma hatası gerçekleştiğinde paywall otomatik olarak kapatılır; ancak gerekirse bu davranışı geçersiz kılabilirsiniz.
void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) {
// Default behavior: view.dismiss()
// Override with custom logic if needed, for example:
// - Log the error
// - Show an error message to the user
}
Olay örneği (Genişletmek için tıklayın)
{
"error": {
"code": "rendering_failed",
"message": "Failed to render paywall interface",
"details": {
"underlyingError": "Invalid paywall configuration"
}
}
}Normal koşullarda bu tür hatalarla karşılaşılmamalıdır; böyle bir hatayla karşılaşırsanız lütfen bize bildirin.