Flow ve paywall olaylarını yönet - Capacitor

Bu kılavuz; satın alma, geri yükleme, ürün seçimi ve flow render etme gibi olayların işlenmesini kapsar. Ayrıca buton işlemlerini de (flow’u kapatma, bağlantı açma, özel eylemler vb.) ayarlayabilirsiniz. Ayrıntılar için buton eylemlerini işleme kılavuzumuza bakın.

Flow Builder ile oluşturulan flow’lar ve 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 basmaları (kapat düğmeleri, URL’ler, ürün seçimleri vb.) ve flow üzerinde gerçekleştirilen satın alma ile ilgili işlemlere dair bildirimler yer alır. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz.

Mobil uygulamanızda flow ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için view.setEventHandlers metodunu uygulayın:

Her olay için yalnızca bir handler belirleyebilirsiniz: setEventHandlers’ı birden fazla kez çağırmak, belirttiğiniz handler’ları geçersiz kılar ve hem varsayılan hem de daha önce ayarlanmış handler’ların yerini alır. Ayarlamadığınız handler’lar varsayılan davranışlarını korur. setEventHandlers bir unsubscribe fonksiyonu döndürür; view.dismiss() ise tüm handler’ları temizler.


const view = await createFlowView(flow);

const unsubscribe = await view.setEventHandlers({
  onCloseButtonPress() {
    return true; // close the flow (default behavior)
  },
  onAndroidSystemBack() {
    return true; // close the flow; by default, it stays open
  },
  onPurchaseCompleted(purchaseResult, product) {
    return purchaseResult.type === 'success'; // close the flow on a successful purchase, keep it open for cancelled or pending purchases
  },
  onPurchaseStarted(product) { /***/ },
  onPurchaseFailed(error, product) { /***/ },
  onRestoreCompleted(profile) { /***/ },
  onRestoreFailed(error) { /***/ },
  onProductSelected(productId) { /***/ },
  onError(error) { /***/ },
  onLoadingProductsFailed(error) { /***/ },
  onUrlPress(url, openIn) {
    adapty.openWebUrl({ url, openIn }).catch(console.warn); // same as the SDK default
    return false; // keep the flow open
  },
  onAppeared() { /***/ },
  onDisappeared() { /***/ },
  onWebPaymentNavigationFinished() { /***/ },
});
Etkinlik örnekleri (Genişletmek için tıklayın)

Aşağıdaki örnekler, her işleyicide kullanılabilen özellikleri ve açıklayıcı değerleri yorum olarak göstermektedir.

// onUrlPress
url;    // 'https://example.com/terms'
openIn; // 'browser_in_app' or 'browser_out_app'

// onCustomAction
actionId; // 'login'

// onProductSelected
productId; // 'premium_monthly'

// onPurchaseStarted, onPurchaseCompleted, onPurchaseFailed
product.vendorProductId;        // 'premium_monthly'
product.localizedTitle;         // 'Premium Monthly'
product.localizedDescription;   // 'Premium subscription for 1 month'
product.price?.amount;          // 9.99
product.price?.currencyCode;    // 'USD'
product.price?.localizedString; // '$9.99'

// onPurchaseCompleted
purchaseResult.type; // 'success', 'pending', or 'user_cancelled'
if (purchaseResult.type === 'success') {
  purchaseResult.profile.accessLevels['premium']?.isActive; // true
}

// onRestoreCompleted
profile.accessLevels['premium']?.isActive; // true

// onPurchaseFailed, onRestoreFailed, onError, onLoadingProductsFailed
error.message; // 'Purchase failed due to insufficient funds'

İhtiyaç duyduğunuz event handler’ları kaydedebilir, ihtiyaç duymadıklarınızı atlayabilirsiniz. Bu sayede kullanılmayan event listener’lar oluşturulmaz. Zorunlu event handler yoktur.

Event handler’lar bir boolean döndürür. true döndürülürse görüntüleme süreci tamamlanmış sayılır; böylece flow ekranı kapanır ve bu view için event listener’lar kaldırılır. Bazı olay işleyicilerinin geçersiz kılabileceğiniz varsayılan davranışları vardır:

  • onCloseButtonPress: Kapat düğmesine basıldığında flow’u kapatır.
  • onUrlPress: Tıklanan URL’yi, builder’da ayarlanan Open in seçeneğine uyarak adapty.openWebUrl aracılığıyla yerel tarayıcıda açar ve flow’u açık tutar.
  • onAndroidSystemBack: Back düğmesine basıldığında flow’u açık tutar. Kapatmak için true döndürün.
  • onPurchaseCompleted: Satın alma tamamlandıktan sonra flow’u açık tutar. Kapatmak için true döndürün.
  • onRestoreCompleted: Başarılı bir geri yüklemeden sonra flow’u açık tutar. Kapatmak için true döndürün.
  • onError: Render işlemi başarısız olursa flow’u kapatır.

Olay yöneticileri

Olay işleyicisiAçıklama
onCustomActionKullanıcı özel bir eylem gerçekleştirdiğinde, örneğin bir özel düğmeye tıkladığında çağrılır.
onUrlPressKullanıcı flow’unuzdaki bir URL’ye tıkladığında çağrılır.
onAndroidSystemBackKullanıcı Android sistem Back düğmesine bastığında çağrılır. Flow varsayılan olarak açık kalır; kapatmak için true döndürün.
onCloseButtonPressKapat düğmesi görünür durumdayken kullanıcı üzerine bastığında çağrılır. Bu işleyicide flow ekranını kapatmanız önerilir.
onPurchaseCompletedSatın alma tamamlandığında çağrılır; başarılı, kullanıcı tarafından iptal edilmiş veya onay bekliyor olabilir. Başarılı bir satın almada güncellenmiş bir AdaptyProfile sağlar. Kullanıcı iptalleri ve bekleyen ödemeler (ör. ebeveyn onayı gerekli) bu olayı tetikler, onPurchaseFailed’ı değil.
onPurchaseStartedKullanıcı satın alma sürecini başlatmak için “Purchase” eylem düğmesine bastığında çağrılır.
onPurchaseFailedSatın alma hatalar nedeniyle başarısız olduğunda çağrılır (ör. ödeme kısıtlamaları, geçersiz ürünler, ağ hataları, işlem doğrulama hataları). Kullanıcı iptalleri veya bekleyen ödemeler için çağrılmaz; bunlar onPurchaseCompleted’ı tetikler.
onRestoreStartedKullanıcı satın alma geri yükleme sürecini başlattığında çağrılır.
onRestoreCompletedSatın alma geri yükleme başarılı olduğunda çağrılır ve güncellenmiş bir AdaptyProfile sağlar. Kullanıcının gerekli accessLevel’a sahip olması durumunda ekranı kapatmanız önerilir. Nasıl kontrol edileceğini öğrenmek için Abonelik durumu konusuna bakın.
onRestoreFailedGeri yükleme işlemi başarısız olduğunda çağrılır ve AdaptyError sağlar.
onProductSelectedFlow görünümünde herhangi bir ürün seçildiğinde çağrılır; satın alma öncesinde kullanıcının ne seçtiğini izlemenizi sağlar.
onErrorGörünüm oluşturma sırasında bir hata meydana geldiğinde çağrılır ve AdaptyError sağlar. Bu tür hatalar gerçekleşmemelidir; bir taneyle karşılaşırsanız lütfen bize bildirin.
onLoadingProductsFailedÜrün yükleme başarısız olduğunda çağrılır ve AdaptyError sağlar. Görünüm oluşturmada prefetchProducts: true ayarlamadıysanız AdaptyUI gerekli nesneleri sunucudan kendisi alır.
onAppearedFlow kullanıcıya gösterildiğinde çağrılır. iOS’ta, kullanıcı flow içindeki web paywall düğmesine bastığında ve bir web paywall uygulama içi tarayıcıda açıldığında da çağrılır.
onDisappearedFlow kullanıcı tarafından kapatıldığında çağrılır. iOS’ta, uygulama içi tarayıcıda bir flow’dan açılan web paywall ekrandan kaybolduğunda da çağrılır.
onWebPaymentNavigationFinishedSatın alma için bir web paywall açılmaya çalışıldıktan sonra çağrılır; başarılı veya başarısız olmasından bağımsız olarak.
onRequestAppReviewFlow’dan gelen uygulama değerlendirme istekleri için ayrılmıştır. Flow’lar henüz uygulama değerlendirme isteği tetiklemiyor, bu yüzden uygulamanız gerekmez.
onAnalyticsFlow’dan gelen özel analitik olaylar için ayrılmıştır. Flow’lar henüz bu olayları kodunuza iletmiyor, bu yüzden uygulamanız gerekmez.
onRequestPermissionFlow’dan gelen sistem izin istekleri (bildirimler veya kamera erişimi gibi) için ayrılmıştır. Flow’lar henüz izin isteği tetiklemiyor, bu yüzden uygulamanız gerekmez.
onObserverPurchaseInitiatedYalnızca gözlemci mod: Kullanıcı flow’da satın alma düğmesine bastığında çağrılır. Adapty satın almayı gerçekleştirmez — kendi satın alma kodunuzla yapın, ardından işlemi Adapty’ye bildirin. Aşağıdaki Gözlemci modunda satın almaları yönetme bölümüne bakın.
onObserverRestoreInitiatedYalnızca gözlemci mod: Kullanıcı flow’da geri yükleme düğmesine bastığında çağrılır. Adapty geri yükleme yapmaz — kendiniz yapın, ardından geri yüklenen işlemleri bildirin. Aşağıdaki Gözlemci modunda satın almaları yönetme bölümüne bakın.

Observer mode’da satın alma işlemlerini yönetme

SDK’yı Observer mode (observerMode: true) ile etkinleştirdiyseniz ve Adapty tarafından oluşturulan bir flow sunuyorsanız, SDK satın alma işlemlerini sizin yerinize gerçekleştirmez. Kullanıcı satın alma veya geri yükleme düğmesine dokunduğunda SDK, onObserverPurchaseInitiated veya onObserverRestoreInitiated metodunu çağırır; böylece satın alma veya geri yükleme işlemini kendi kodunuzla gerçekleştirebilirsiniz. Tam kurulum için Observer mode’da flow’ları sunma konusuna bakın.

Bu kılavuz, satın alımlar, geri yüklemeler, ürün seçimi ve paywall oluşturma için olay işlemeyi kapsar. Ayrıca düğme işlemeyi 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 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ı (kapat butonları, URL’ler, ürün seçimleri vb.) ve paywallda 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 paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için view.setEventHandlers metodunu uygulayın:


const view = await createPaywallView(paywall);

const unsubscribe = view.setEventHandlers({
  onCloseButtonPress() {
    console.log('User closed paywall');
    return true; // Allow the paywall to close
  },
  onAndroidSystemBack() {
    console.log('User pressed back button');
    return true; // Allow the paywall to close
  }, 
  onAppeared() {
    console.log('Paywall appeared');
    return false; // Don't close the paywall
  }, 
  onDisappeared() {
    console.log('Paywall disappeared');
  },
  onPurchaseCompleted(purchaseResult, product) {
    console.log('Purchase completed:', purchaseResult);
    return purchaseResult.type !== 'user_cancelled'; // Close if not cancelled
  },
  onPurchaseStarted(product) {
    console.log('Purchase started:', product);
    return false; // Don't close the paywall
  },
  onPurchaseFailed(error, product) {
    console.error('Purchase failed:', error);
    return false; // Don't close the paywall
  },
  onRestoreCompleted(profile) {
    console.log('Restore completed:', profile);
    return true; // Close the paywall after successful restore
  },
  onRestoreFailed(error) {
    console.error('Restore failed:', error);
    return false; // Don't close the paywall
  },
  onProductSelected(productId) {
    console.log('Product selected:', productId);
    return false; // Don't close the paywall
  },
  onRenderingFailed(error) {
    console.error('Rendering failed:', error);
    return false; // Don't close the paywall
  },
  onLoadingProductsFailed(error) {
    console.error('Loading products failed:', error);
    return false; // Don't close the paywall
  },
  onUrlPress(url) {
    window.open(url, '_blank');
    return false; // Don't close the paywall
  },
});
Etkinlik örnekleri (Genişletmek için tıklayın)
// onCloseButtonPress
{
  "event": "close_button_press"
}

// onAndroidSystemBack
{
  "event": "android_system_back"
}

// onAppeared
{
  "event": "paywall_shown"
}

// onDisappeared
{
  "event": "paywall_closed"
}

// onUrlPress
{
  "event": "url_press",
  "url": "https://example.com/terms"
}

// onCustomAction
{
  "event": "custom_action",
  "actionId": "login"
}

// onProductSelected
{
  "event": "product_selected",
  "productId": "premium_monthly"
}

// onPurchaseStarted
{
  "event": "purchase_started",
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

// onPurchaseCompleted - Success
{
  "event": "purchase_completed",
  "purchaseResult": {
    "type": "success",
    "profile": {
      "accessLevels": {
        "premium": {
          "id": "premium",
          "isActive": true,
          "expiresAt": "2024-02-15T10:30:00Z"
        }
      }
    }
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

// onPurchaseCompleted - Cancelled
{
  "event": "purchase_completed",
  "purchaseResult": {
    "type": "user_cancelled"
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

// onPurchaseFailed
{
  "event": "purchase_failed",
  "error": {
    "code": "purchase_failed",
    "message": "Purchase failed due to insufficient funds",
    "details": {
      "underlyingError": "Insufficient funds in account"
    }
  }
}

// onRestoreCompleted
{
  "event": "restore_completed",
  "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"
      }
    ]
  }
}

// onRestoreFailed
{
  "event": "restore_failed",
  "error": {
    "code": "restore_failed",
    "message": "Purchase restoration failed",
    "details": {
      "underlyingError": "No previous purchases found"
    }
  }
}

// onRenderingFailed
{
  "event": "rendering_failed",
  "error": {
    "code": "rendering_failed",
    "message": "Failed to render paywall interface",
    "details": {
      "underlyingError": "Invalid paywall configuration"
    }
  }
}

// onLoadingProductsFailed
{
  "event": "loading_products_failed",
  "error": {
    "code": "products_loading_failed",
    "message": "Failed to load products from the server",
    "details": {
      "underlyingError": "Network timeout"
    }
  }
}

İhtiyaç duyduğunuz event handler’ları kaydedebilir, ihtiyaç duymadıklarınızı atlayabilirsiniz. Bu sayede kullanılmayan event listener’lar oluşturulmaz. Zorunlu event handler yoktur.

Event handler’lar bir boolean döndürür. true döndürülürse, gösterim süreci tamamlanmış sayılır; böylece paywall ekranı kapanır ve bu view için event listener’lar kaldırılır. Bazı event handler’ların, gerekirse geçersiz kılabileceğiniz varsayılan davranışları vardır:

  • onCloseButtonPress: Kapat düğmesine basıldığında paywall’ı kapatır.
  • onAndroidSystemBack: Geri düğmesine basıldığında paywall’ı kapatır.
  • onRestoreCompleted: Başarılı bir restore işleminin ardından paywall’ı kapatır.
  • onPurchaseCompleted: Kullanıcı iptal etmedikçe paywall’ı kapatır.
  • onRenderingFailed: Paywall oluşturma başarısız olursa paywall’ı kapatır.
  • onUrlPress: URL’leri sistem tarayıcısında açar ve paywall’ı açık tutar.

Olay işleyicileri

Olay yöneticisiAçıklama
onCustomActionKullanıcı özel bir eylem gerçekleştirdiğinde, örneğin bir özel düğmeye tıkladığında çağrılır.
onUrlPressKullanıcı paywall’ınızdaki bir URL’ye tıkladığında çağrılır.
onAndroidSystemBackKullanıcı Android sistem Geri düğmesine dokunduğunda çağrılır.
onCloseButtonPressKapat düğmesi görünür durumdayken kullanıcı ona dokunduğunda çağrılır. Bu yöneticide paywall ekranını kapatmanız önerilir.
onPurchaseCompletedSatın alma tamamlandığında, ister başarılı olsun ister kullanıcı tarafından iptal edilmiş ya da onay bekleniyor olsun çağrılır. Başarılı satın almalarda güncellenmiş bir AdaptyProfile sağlar. Kullanıcı iptalleri ve bekleyen ödemeler (örneğin ebeveyn onayı gerekli) onPurchaseFailed değil bu olayı tetikler.
onPurchaseStartedKullanıcı satın alma işlemini başlatmak için “Satın Al” eylem düğmesine dokunduğunda çağrılır.
onPurchaseCancelledKullanıcı satın alma işlemini başlatıp manuel olarak kesintiye uğrattığında (ödeme diyaloğunu iptal ettiğinde) çağrılır.
onPurchaseFailedSatın alma hatalar nedeniyle başarısız olduğunda (örneğin ödeme kısıtlamaları, geçersiz ürünler, ağ hataları, işlem doğrulama hataları) çağrılır. Kullanıcı iptalleri veya bekleyen ödemeler için çağrılmaz; bunlar onPurchaseCompleted’ı tetikler.
onRestoreStartedKullanıcı satın alma geri yükleme işlemini başlattığında çağrılır.
onRestoreCompletedSatın alma geri yükleme başarılı olduğunda çağrılır ve güncellenmiş bir AdaptyProfile sağlar. Kullanıcının gerekli accessLevel’a sahip olması durumunda ekranı kapatmanız önerilir. Bunu nasıl kontrol edeceğinizi öğrenmek için Abonelik durumu konusuna bakın.
onRestoreFailedGeri yükleme işlemi başarısız olduğunda çağrılır ve AdaptyError sağlar.
onProductSelectedPaywall görünümündeki herhangi bir ürün seçildiğinde çağrılır; satın alma öncesinde kullanıcının ne seçtiğini izlemenizi sağlar.
onAppearedPaywall görünümü ekranda belirdiğinde çağrılır. iOS’ta, kullanıcı 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.
onDisappearedPaywall görünümü ekrandan kaybolduğunda çağrılır. iOS’ta, uygulama içi tarayıcıda bir paywall’dan açılan web paywall ekrandan kaybolduğunda da çağrılır.
onRenderingFailedGörünüm oluşturma sırasında hata oluştuğunda çağrılır ve AdaptyError sağlar. Bu tür hatalar yaşanmamalıdır; yaşanırsa lütfen bize bildirin.
onLoadingProductsFailedÜrün yükleme başarısız olduğunda çağrılır ve AdaptyError sağlar. Görünüm oluşturma sırasında prefetchProducts: true ayarlamadıysanız AdaptyUI gerekli nesneleri sunucudan kendisi alacaktır.