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(appearedView) { /***/ },
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'
// onAppeared
appearedView.id; // '3f8a1c7e-9b24-4d51-8e30-6c5b2a9f1d47'
appearedView.placementId; // 'onboarding_paywall'
appearedView.variationId; // 'd21c4b6a-57e8-4f39-b0a2-8c7e13f5d94b'
appearedView.locale; // 'es'
// 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 uyarakadapty.openWebUrlaracı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çintruedöndürün.onPurchaseCompleted: Satın alma tamamlandıktan sonra flow’u açık tutar. Kapatmak içintruedöndürün.onRestoreCompleted: Başarılı bir geri yüklemeden sonra flow’u açık tutar. Kapatmak içintruedöndürün.onError: Render işlemi başarısız olursa flow’u kapatır.
Olay yöneticileri
| Olay işleyici | Açıklama |
|---|---|
| onCustomAction | Kullanıcı özel bir eylem gerçekleştirdiğinde (örn. bir özel butona tıkladığında) çağrılır. |
| onUrlPress | Kullanıcı flow’unuzdaki bir URL’ye tıkladığında çağrılır. |
| onAndroidSystemBack | Kullanıcı Android sistem Geri düğmesine bastığında çağrılır. Flow varsayılan olarak açık kalır; kapatmak için true döndürün. |
| onCloseButtonPress | Kapat düğmesi görünürken kullanıcı üzerine bastığında çağrılır. Bu işleyicide flow ekranını kapatmanız önerilir. |
| onPurchaseCompleted | Satı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 (örn. ebeveyn onayı gerekli) onPurchaseFailed yerine bu olayı tetikler. |
| onPurchaseStarted | Kullanıcı satın alma işlemini başlatmak için “Satın Al” eylem düğmesine bastığında çağrılır. |
| onPurchaseFailed | Satın alma bir hata nedeniyle başarısız olduğunda çağrılır (örn. ö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. |
| onRestoreStarted | Kullanıcı satın alma geri yükleme işlemini başlattığında çağrılır. |
| onRestoreCompleted | Satı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 edeceğinizi öğrenmek için Abonelik durumu konusuna bakın. |
| onRestoreFailed | Geri yükleme işlemi başarısız olduğunda çağrılır ve AdaptyError sağlar. |
| onProductSelected | Flow 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 izlemenize olanak tanır. |
| onError | Görünüm oluşturma sırasında bir hata oluştuğunda çağrılır ve AdaptyError sağlar. Bu tür hatalar gerçekleşmemeli; eğer 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. |
| onAppeared | Flow kullanıcıya gösterildiğinde çağrılır ve görünen görünümü sağlar — bkz. view argümanı. iOS’ta ayrıca kullanıcı bir flow içindeki web paywall düğmesine bastığında ve uygulama içi tarayıcıda bir web paywall açıldığında da çağrılır. |
| onDisappeared | Flow kullanıcı tarafından kapatıldığında çağrılır. iOS’ta ayrıca flow’dan uygulama içi tarayıcıda açılan bir web paywall ekrandan kaybolduğunda da çağrılır. |
| onWebPaymentNavigationFinished | Başarılı ya da başarısız olsun, satın alma için bir web paywall açma girişiminin ardından çağrılır. |
| onRequestAppReview | Flow’dan gelen uygulama değerlendirme istekleri için ayrılmıştır. Flow’lar henüz uygulama değerlendirme isteği tetiklemediğinden bunu uygulamanıza gerek yoktur. |
| onAnalytics | Flow bir ekran görüntüleme gibi bir analitik olayı raporladığında çağrılır. Aşağıdaki Analitik olaylar bölümüne bakın. |
| onRequestPermission | Flow’dan gelen sistem izin istekleri (push bildirimleri veya kamera erişimi gibi) için ayrılmıştır. Flow’lar henüz izin isteği tetiklemediğinden bunu uygulamanıza gerek yoktur. |
| onObserverPurchaseInitiated | Yalnızca gözlemci modu: Kullanıcı flow’daki 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’e bildirin. Aşağıdaki Gözlemci modunda satın alma işlemleri bölümüne bakın. |
| onObserverRestoreInitiated | Yalnızca gözlemci modu: Kullanıcı flow’daki 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 alma işlemleri bölümüne bakın. |
view argümanı
view argümanı, Capacitor SDK 4.0.2-beta.1 veya üstünü gerektirir. Tüm flow handler’ları arasında yalnızca onAppeared, görünümün kendisine ait bir açıklama alır — şu alanlardan oluşan bir FlowEventView nesnesi:
| Alan | Açıklama |
|---|---|
| id | Bu view örneğinin tanımlayıcısı. SDK için dahili bir değerdir ve Adapty Kontrol Paneli’ndeki hiçbir şeyle eşleşmez. |
| placementId | Flow’un getirildiği placement. |
| variationId | Flow’un çözümlendiği varyant; kendi analizlerinizi bir A/B testine atfetmek için kullanılır. |
| locale | View’ın oluşturulduğu flow yerelleştirmesi. Flow’un bu yerelleştirmesi yoksa istediğiniz locale’den farklı olabilir. createFlowView tarafından döndürülen view, locale özelliğinde aynı değeri raporlar. Bkz. Yerelleştirmeleri ve locale kodlarını kullanma. |
Analitik olaylar
view.setEventHandlers({
onAnalytics(name, params) {
return false; // keep the flow open
},
});Bir flow, kullanıcı ekranlarından birini her açtığında flow_screen_showed olayını raporlar. Adapty bu olayları kendi flow analitiğinde sayar ve uygulamanıza da iletir; böylece aynı dönüşüm hunisini kendi analitiğinizde oluşturabilirsiniz.
| Parametre | Açıklama |
|---|---|
instanceId | Kullanıcının açtığı ekranın ID’si. |
screen_order | Ekranın flow içindeki sırası. |
is_last_screen | Ekranın gidebileceği başka bir yer kalmadığında true olur. Dallanan bir flow birden fazla farklı ekranda sona erebilir ve her biri true raporlar. |
Bu olayda hem isBackendEvent hem de isCustomerEvent true değerini alır: Adapty saymaya devam eder ve uygulamanız da olayı alır.
Bu verilerle ne yapacağınızı öğrenmek için Flow ekranı görüntülemelerini izleme sayfasına 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öneticisi | Açıklama |
|---|---|
| onCustomAction | Kullanıcı özel bir eylem gerçekleştirdiğinde, örneğin bir özel düğmeye tıkladığında çağrılır. |
| onUrlPress | Kullanıcı paywall’ınızdaki bir URL’ye tıkladığında çağrılır. |
| onAndroidSystemBack | Kullanıcı Android sistem Geri düğmesine dokunduğunda çağrılır. |
| onCloseButtonPress | Kapat 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. |
| onPurchaseCompleted | Satı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. |
| onPurchaseStarted | Kullanıcı satın alma işlemini başlatmak için “Satın Al” eylem düğmesine dokunduğunda çağrılır. |
| onPurchaseCancelled | Kullanı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. |
| onPurchaseFailed | Satı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. |
| onRestoreStarted | Kullanıcı satın alma geri yükleme işlemini başlattığında çağrılır. |
| onRestoreCompleted | Satı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. |
| onRestoreFailed | Geri yükleme işlemi başarısız olduğunda çağrılır ve AdaptyError sağlar. |
| onProductSelected | Paywall 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. |
| onAppeared | Paywall 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. |
| onDisappeared | Paywall 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. |
| onRenderingFailed | Gö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. |