Flutter - Flow ve paywall etkinliklerini yönetme

Bu kılavuz; satın alma, geri yükleme, ürün seçimi ve render etme olaylarını kapsar. Görünümü kapatma ve bağlantı açma işlemleri, varsayılan flowViewDidPerformAction uygulaması tarafından yönetilir — bunları geçersiz kılmak veya özel buton eylemlerini işlemek için buton eylemlerini yönetme kılavuzumuza bakın.

Flow ve Paywall Builder ile oluşturulan paywall’lar, 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; buton tıklamaları (kapatma düğmeleri, URL’ler, ürün seçimleri vb.) ve flow veya paywall üzerinde gerçekleştirilen satın alma işlemlerine ilişkin bildirimleri kapsar. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz.

Mobil uygulamanızdaki flow veya paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için AdaptyUIFlowsEventsObserver metodlarını uygulayın ve herhangi bir ekran gösterilmeden önce observer’ı ayarlayın:

AdaptyUI().setFlowsEventsObserver(this);

Üç observer metodu zorunludur — sınıfınız bunlar olmadan derlenmez: flowViewDidFinishPurchase, flowViewDidFinishRestore ve flowViewDidReceiveError. Diğer tüm metodlar isteğe bağlıdır. Daha önce ayarlanmış bir observer’ı kaldırmak için setFlowsEventsObserver’a null geçin.

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.

Aşağıdaki olay örnekleri, her nesne üzerinde mevcut olan özellikleri ve yorumlarda örnek değerleri göstermektedir.

Kullanıcı tarafından oluşturulan olaylar

Görünüm belirdi

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

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

void flowViewDidAppear(AdaptyUIFlowView view) {
}

Görünüm kayboldu

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

iOS’ta ayrıca, bir paywall’dan açılan web paywall’ı uygulama içi tarayıcıda kapandığında da tetiklenir.

void flowViewDidDisappear(AdaptyUIFlowView view) {
}

Ürün seçimi

Bir ürün satın alma için seçildiğinde (kullanıcı ya da sistem tarafından), bu metot çağrılır:

void flowViewDidSelectProduct(AdaptyUIFlowView view, String productId) {
}
Olay örneği (Genişletmek için tıklayın)
void flowViewDidSelectProduct(AdaptyUIFlowView view, String productId) {
  // productId is a String:
  productId; // 'premium_monthly'
}

Satın alma başlatıldı

Bir kullanıcı satın alma sürecini başlatırsa bu metot çağrılır:

void flowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) {
}
Etkinlik örneği (Genişletmek için tıklayın)
void flowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId;        // 'premium_monthly'
  product.localizedTitle;         // 'Premium Monthly'
  product.localizedDescription;   // 'Premium subscription for 1 month'
  product.price.amount;           // 9.99            (double)
  product.price.currencyCode;     // 'USD'
  product.price.localizedString;  // '$9.99'
}

Tamamlanan satın alma

Bu yöntem zorunludur. 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 flowViewDidFinishPurchase(AdaptyUIFlowView 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)
void flowViewDidFinishPurchase(AdaptyUIFlowView view,
                               AdaptyPaywallProduct product,
                               AdaptyPurchaseResult purchaseResult) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  switch (purchaseResult) {
    case AdaptyPurchaseResultSuccess(profile: final profile):
      // profile — AdaptyProfile:
      profile.accessLevels['premium']?.isActive;  // true
      profile.accessLevels['premium']?.expiresAt; // DateTime(2027, 2, 15, 10, 30)
      break;
    case AdaptyPurchaseResultPending():
      // no additional data
      break;
    case AdaptyPurchaseResultUserCancelled():
      // no additional data
      break;
  }
}

v3’ten farklı olarak, bu metodun varsayılan bir davranışı yoktur — başarılı bir satın alma sonrasında görünüm artık otomatik olarak kapatılmaz. Bundan sonra ne olacağına siz karar verin: flow’a devam edin veya view.dismiss() çağrısı yapın. Bir ekranı kapatma hakkında ayrıntılar için Buton eylemlerine yanıt verme bölümüne bakın.

Web ödeme navigasyonu tamamlandı

Bu metod, belirli bir ürün için bir web paywall açma girişiminin ardından çağrılır. Hem başarılı hem de başarısız navigasyon girişimleri dahildir:

void flowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView 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.

Başarısız satın alma

Bu yöntem, bir 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 başlattığı iptaller veya bekleyen işlemler için tetiklenmez — bunlar flowViewDidFinishPurchase tarafından ele alınır:

void flowViewDidFailPurchase(AdaptyUIFlowView view, 
                             AdaptyPaywallProduct product, 
                             AdaptyError error) {
}

Geri yükleme başlatıldı

Bir kullanıcı geri yükleme işlemini başlatırsa bu yöntem çağrılır:

void flowViewDidStartRestore(AdaptyUIFlowView view) {
}

Başarılı geri yükleme

Bu metod zorunludur. Bir satın alma geri yükleme işlemi başarılı olursa çağrılır:

void flowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) {
}
Etkinlik örneği (Genişletmek için tıklayın)
void flowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) {
  // profile — AdaptyProfile:
  profile.accessLevels['premium']?.isActive;            // true
  profile.accessLevels['premium']?.expiresAt;           // DateTime(2027, 2, 15, 10, 30)
  profile.subscriptions['premium_monthly']?.isActive;   // true
  profile.subscriptions['premium_monthly']?.expiresAt;  // DateTime(2027, 2, 15, 10, 30)
}

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, ekranı nasıl kapatacağınızı öğrenmek için ise Buton eylemlerine yanıt verme konusuna bakın.

Başarısız geri yükleme

Bir satın alma geri yüklemesi başarısız olursa şu metod çağrılır:

void flowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) {
}

Veri çekme ve render etme

Ürün yükleme hataları

Başlatma sırasında ürün dizisini 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 flowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) {
}

Görünüm hataları

Bu yöntem zorunludur. v3’teki paywallViewDidFailRendering yönteminin yerini alır: arayüz oluşturma sırasında meydana gelen hatalar ve diğer görünüm hataları bu yöntem çağrılarak raporlanır. Bir kez uyguladığınızda, kapatma işlemi size kalmıştır — bu tür hatalarda görünümü kapatmanızı öneririz; hiçbir gözlemci ayarlanmadığında SDK’nın yerleşik varsayılanı da bunu yapar:

void flowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) {
  // log the error and dismiss the broken view
  view.dismiss();
}

Normal bir durumda render hataları oluşmamalıdır; eğer biriyle karşılaşırsanız lütfen bize bildirin.

Analitik olayları

İsteğe bağlı flowViewDidReceiveAnalyticEvent metodu, bir flow’dan gelen özel analitik olaylar için ayrılmıştır. Flow’lar henüz bu olayları kodunuza iletmediğinden, bu metodu uygulamanıza gerek yoktur.

Observer mode’da satın almaları yönetme

SDK’yı Observer mode’da etkinleştirdiyseniz ve Adapty tarafından oluşturulan bir flow veya paywall sunuyorsanız, SDK satın alma işlemlerini sizin adınıza gerçekleştirmez. Kullanıcı satın alma veya geri yükleme düğmesine dokunduğunda SDK, AdaptyUIObserverModeResolver’ınızı çağırır. Tam kurulum için bkz. Observer mode’da flow sunma.

Sistem isteklerini yönetme

AdaptyUISystemRequestsHandler (AdaptyUI().setSystemRequestsHandler(...) aracılığıyla kaydedilir), bir flow’dan gelen sistem istekleri için ayrılmıştır: işletim sistemi izin istemleri (push bildirimleri veya kamera erişimi gibi) ve App Store inceleme istekleri. Flow’lar henüz bu istekleri tetiklemiyor, dolayısıyla bir handler kaydetmeniz gerekmiyor. Eğer birini kayıt ederseniz, handlePermission’ın sınıfın zorunlu metodu olduğunu unutmayın — izni kendi kodunuzla isteyin, ardından AdaptyUIPermissionResult.granted() veya AdaptyUIPermissionResult.denied() döndürün; handleAppReviewRequest ise isteğe bağlıdır.

Bu kılavuz; satın alma, geri yükleme, ürün seçimi ve paywall render işlemlerine ait olay yönetimini ele almaktadır. Bunların yanı sıra düğme yönetimini 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ılmış 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; buton tıklamalarını (kapatma butonları, URL’ler, ürün seçimleri vb.) ve paywall’da gerçekleştirilen satın alma ile ilgili eylemlerin bildirimlerini içerir. 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.

Aşağıdaki olay örnekleri, her nesnede bulunan özellikleri ve yorumlarda açıklayıcı değerleri göstermektedir.

Kullanıcı tarafından tetiklenen olaylar

Paywall göründü

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

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

void paywallViewDidAppear(AdaptyUIPaywallView view) {
}

Paywall kayboldu

Bu yöntem, 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ıdan ekrandan kaybolması durumunda da çağrılır.

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 metod çağrılır:

void paywallViewDidSelectProduct(AdaptyUIPaywallView view, String productId) {
}
Olay örneği (Genişletmek için tıklayın)
void paywallViewDidSelectProduct(AdaptyUIPaywallView view, String productId) {
  // productId is a String:
  productId; // 'premium_monthly'
}

Satın alma başlatıldı

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

void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
}
Olay örneği (Genişletmek için tıklayın)
void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId;        // 'premium_monthly'
  product.localizedTitle;         // 'Premium Monthly'
  product.localizedDescription;   // 'Premium subscription for 1 month'
  product.price.amount;           // 9.99            (double)
  product.price.currencyCode;     // 'USD'
  product.price.localizedString;  // '$9.99'
}

Tamamlanan satın alma

Bu metot, bir satın alma işlemi başarıyla tamamlandığında, kullanıcı satın alma işlemini 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):
        // 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)
void paywallViewDidFinishPurchase(AdaptyUIPaywallView view,
                                  AdaptyPaywallProduct product,
                                  AdaptyPurchaseResult purchaseResult) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  switch (purchaseResult) {
    case AdaptyPurchaseResultSuccess(profile: final profile):
      // profile — AdaptyProfile:
      profile.accessLevels['premium']?.isActive;  // true
      profile.accessLevels['premium']?.expiresAt; // DateTime(2027, 2, 15, 10, 30)
      break;
    case AdaptyPurchaseResultPending():
      // no additional data
      break;
    case AdaptyPurchaseResultUserCancelled():
      // no additional data
      break;
  }
}

Bu durumda ekranı kapatmanızı öneririz. Bir 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 gezintisi tamamlandı

Bu metot, belirli bir ürün için web paywall açma girişiminin ardından çağrılır. Başarılı ve başarısız gezinti girişimlerinin her ikisini de 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)
void paywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view,
                                               AdaptyPaywallProduct? product,
                                               AdaptyError? error) {
  // product — AdaptyPaywallProduct?:
  product?.vendorProductId; // 'premium_monthly'

  if (error == null) {
    // navigation succeeded
  } else {
    // error — AdaptyError:
    error.code;    // AdaptyErrorCode.networkFailed (2005)
    error.message; // 'Network request failed'
    error.detail;  // platform-specific underlying error, or null
  }
}

Başarısız satın alma

Bu yöntem, 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 tetiklenmez; bunlar paywallViewDidFinishPurchase tarafından işlenir:

void paywallViewDidFailPurchase(AdaptyUIPaywallView view, 
                                AdaptyPaywallProduct product, 
                                AdaptyError error) {
}
Etkinlik örneği (Genişletmek için tıklayın)
void paywallViewDidFailPurchase(AdaptyUIPaywallView view,
                                AdaptyPaywallProduct product,
                                AdaptyError error) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.productPurchaseFailed (1006)
  error.message; // 'Product purchase failed.'
  error.detail;  // platform-specific underlying error, or null
}

Geri yükleme başlatıldı

Bir kullanıcı geri yükleme işlemini başlatırsa bu metot çağrılır:

void paywallViewDidStartRestore(AdaptyUIPaywallView view) {
}

Başarılı geri yükleme

Bir satın alma başarıyla geri yüklenirse şu metot çağrılır:

void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
}
Olay örneği (Genişletmek için tıklayın)
void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
  // profile — AdaptyProfile:
  profile.accessLevels['premium']?.isActive;            // true
  profile.accessLevels['premium']?.expiresAt;           // DateTime(2027, 2, 15, 10, 30)
  profile.subscriptions['premium_monthly']?.isActive;   // true
  profile.subscriptions['premium_monthly']?.expiresAt;  // DateTime(2027, 2, 15, 10, 30)
}

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 Düğme eylemlerine yanıt verme konusuna bakın.

Geri yükleme başarısız oldu

Bir satın alma geri yüklemesi 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)
void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.receiveRestoredTransactionsFailed (1011)
  error.message; // 'Error occurred in the process of restoring purchases.'
  error.detail;  // platform-specific underlying error, or null
}

Veri getirme ve render etme

Ürün yükleme hataları

Başlatma sırasında ürün dizisini 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)
void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.productRequestFailed (1002)
  error.message; // 'Unable to fetch available In-App Purchase products at the moment.'
  error.detail;  // platform-specific underlying error, or null
}

Render hataları

Arayüz oluşturma sırasında bir hata oluşursa, bu metot çağrılarak hata bildirilir. Varsayılan olarak (v3.15.2’den itibaren), oluşturma hatası meydana geldiğinde paywall otomatik olarak kapatılır; ancak gerekirse bu davranışı değiştirebilirsiniz.

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
}
Etkinlik örneği (Genişletmek için tıklayın)
void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.jsException (4105)
  error.message; // 'An exception was thrown from JS during AdaptyUI flow execution.'
  error.detail;  // platform-specific underlying error, or null

  // Default behavior: view.dismiss()
}

Normal şartlarda böyle hatalarla karşılaşılmamalıdır; eğer bununla karşılaşırsanız lütfen bize bildirin.