Flutter - Paywall olaylarını yönetme

Bu kılavuz; satın alımlar, yenilemeler, ürün seçimi ve paywall görüntüleme için olay işlemeyi ele almaktadır. 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 işleme kılavuzumuza bakın.

Paywall Builder ile yapılandırılmış paywalllar, satın alma yapmak ve geri yüklemek için ekstra kod gerektirmez. Ancak uygulamanızın yanıt verebileceği bazı olaylar üretirler. Bu olaylar arasında düğme basışları (kapat düğmeleri, URL’ler, ürün seçimleri vb.) ve paywall üzerinde gerçekleştirilen satın alma ile ilgili eylemler hakkındaki 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 üzerini 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österilmeden ö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ı tarafından tetiklenen etkinlikler

Paywall görüntülendi

Bu metot, paywall görünümü ekranda gösterildiğinde çağrılır.

iOS’ta, bir kullanıcı paywall içindeki web paywall düğmesine dokunduğunda ve bir web paywall uygulama içi tarayıcıda açıldığında da çağrılır.

void paywallViewDidAppear(AdaptyUIPaywallView view) {
}

Paywall kapatıldı

Bu metot, paywall görünümü ekrandan kaldırıldığında çağrılır.

iOS’ta, bir paywall’dan açılan web paywall’ın uygulama içi tarayıcıda ekrandan kaybolması durumunda da tetiklenir.

void paywallViewDidDisappear(AdaptyUIPaywallView view) {
}

Ürün seçimi

Bir ürün satın alma için 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şlatıldı

Bir kullanıcı satın alma işlemini başlatırsa bu metot çağrılır:

void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
}
Etkinlik ö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"
  }
}

Tamamlanan satın alma

Bu metot, bir satın alma başarıyla tamamlandığında, kullanıcı satın almayı iptal ettiğinde veya satın alma işlemi beklemede göründüğünde çağrılır:

void paywallViewDidFinishPurchase(AdaptyUIPaywallView view, 
                                  AdaptyPaywallProduct product, 
                                  AdaptyPurchaseResult purchaseResult) {
    switch (purchaseResult) {
      case AdaptyPurchaseResultSuccess(profile: final profile):
        // satın alma başarılı
        break;
      case AdaptyPurchaseResultPending():
        // satın alma beklemede
        break;
      case AdaptyPurchaseResultUserCancelled():
        // kullanıcı satın almayı iptal etti
        break;
      default:
        break;
    }
}
Etkinlik örnekleri (Genişletmek için tıklayın)
// Başarılı satın alma
{
  "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"
        }
      }
    }
  }
}

// Bekleyen satın alma
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "purchaseResult": {
    "type": "AdaptyPurchaseResultPending"
  }
}

// Kullanıcı satın almayı iptal etti
{
  "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ılı bilgi için Düğme eylemlerine yanıt verme bölümüne bakın.

Web ödeme navigasyonu tamamlandı

Bu method, 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:

ParametreAçıklama
productWeb paywallın açıldığı AdaptyPaywallProduct. null olabilir.
errorWeb paywall navigasyonu başarısız olduysa AdaptyError nesnesi; navigasyon başarılıysa null.
Olay örnekleri (Genişletmek için tıklayın)
// Başarılı navigasyon
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "error": null
}

// Başarısız navigasyon
{
  "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"
    }
  }
}

Başarısız satın alma

Bu metot, bir satın alma işlemi 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 çalışmaz; bunlar paywallViewDidFinishPurchase tarafından ele alınır:

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şlatıldı

Kullanıcı geri yükleme işlemini başlatırsa bu method çağrılır:

void paywallViewDidStartRestore(AdaptyUIPaywallView view) {
}

Başarılı geri yükleme

Satın alma geri yükleme işlemi başarılı olursa, şu metot çağrılır:

void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
}
Etkinlik ö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ı gerekli accessLevel’a sahipse ekranı kapatmanızı öneririz. Bunu nasıl kontrol edeceğinizi öğrenmek için Abonelik durumu konusuna, paywall ekranını kapatmak için ise Buton aksiyonlarını yönetme konusuna bakın.

Geri yükleme başarısız

Bir satın alma işlemi geri yüklenemezse şu 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 getirme ve render etme

Ürün yükleme hataları

Başlatma sırasında ürün dizisi geçmezseniz, AdaptyUI gerekli nesneleri sunucudan kendisi alır. Bu işlem başarısız olursa, AdaptyUI hatayı şu 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"
    }
  }
}

Render hataları

Arayüz render edilirken bir hata oluşursa, bu yöntem çağrılarak hata raporlanır. Varsayılan olarak (v3.15.2’den itibaren), render hatası oluştuğunda paywall otomatik olarak kapatılır; ancak gerekirse bu davranışı değiştirebilirsiniz.

void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) {
  // Varsayılan davranış: view.dismiss()
  // Gerekirse özel mantıkla geçersiz kılın, örneğin:
  // - Hatayı kaydedin
  // - Kullanıcıya bir hata mesajı gösterin
}
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 şartlarda bu tür hatalar oluşmamalıdır; eğer böyle bir hatayla karşılaşırsanız lütfen bize bildirin.