Flow ve paywall olaylarını yönetme - React Native

Bu rehber; satın almalar, geri yüklemeler, ürün seçimi ve flow render işlemleri için olay yönetimini kapsar. Ayrıca buton yönetimini de (flow’u kapatma, bağlantı açma, özel eylemler vb.) ayarlayabilirsiniz. Ayrıntılar için buton eylemlerini yönetme rehberimize bakın.

Flow Builder ile oluşturulan flow’lar ve paywall’lar, satın alma yapmak ve geri yüklemek için ekstra koda ihtiyaç duymaz. 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 flow üzerinde gerçekleştirilen satın almayla ilgili eylemlere ait bildirimleri içerir. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenin.

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

Olay örnekleri (Genişletmek için tıklayın)
// onCloseButtonPress
{
  //Record the event
}

// onAndroidSystemBack
{
  //Record the event
}

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

// onCustomAction
{
  "actionId": "login"
}

// onProductSelected
{
  "productId": "premium_monthly"
}

// onPurchaseStarted
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "price": {
      "amount": 9.99,
      "currencyCode": "USD",
      "currencySymbol": "$",
      "localizedString": "$9.99"
    }
  }
}

// onPurchaseCompleted - Success
{
  "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",
    "price": {
      "amount": 9.99,
      "currencyCode": "USD",
      "currencySymbol": "$",
      "localizedString": "$9.99"
    }
  }
}

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

// onPurchaseFailed
{
  "error": {
    "code": "purchase_failed",
    "message": "Purchase failed due to insufficient funds",
    "details": {
      "underlyingError": "Insufficient funds in account"
    }
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "price": {
      "amount": 9.99,
      "currencyCode": "USD",
      "currencySymbol": "$",
      "localizedString": "$9.99"
    }
  }
}

// onRestoreCompleted
{
  "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
{
  "error": {
    "code": "restore_failed",
    "message": "Purchase restoration failed",
    "details": {
      "underlyingError": "No previous purchases found"
    }
  }
}

// onError
{
  "error": {
    "code": "rendering_failed",
    "message": "Failed to render flow interface",
    "details": {
      "underlyingError": "Invalid flow configuration"
    }
  }
}

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

// onAppeared
{
  //Record the event
}

// onDisappeared
{
  //Record the event
}

// onWebPaymentNavigationFinished
{
  //Record the event
}

İhtiyacınız olan olay işleyicilerini kaydedebilir, ihtiyacınız olmayanları atlayabilirsiniz. Bu durumda, kullanılmayan olay dinleyicileri oluşturulmaz. Zorunlu olay işleyicisi yoktur.

Olay işleyicileri 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 olay dinleyicileri kaldırılır.

Bazı olay işleyicilerinin, gerekirse geçersiz kılabileceğiniz bir varsayılan davranışı vardır:

  • onCloseButtonPress: kapatma butonuna basıldığında flow’u kapatır.
  • onUrlPress: tıklanan URL’yi açar ve flow’u açık tutar.
  • onAndroidSystemBack (yalnızca modal sunum için): Back butonuna basıldığında 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.
  • onPurchaseCompleted: bir satın alma tamamlandıktan sonra flow’u açık tutar. Kapatmak için true döndürün.
  • onError: render başarısız olursa flow’u kapatır.

Olay işleyicileri

Olay işleyiciAçıklama
onCustomActionBir kullanıcı özel bir eylem gerçekleştirdiğinde, örneğin bir özel butona tıkladığında çağrılır.
onUrlPressBir kullanıcı flow’unuzdaki bir URL’ye tıkladığında çağrılır.
onAndroidSystemBackYalnızca modal sunum: Bir kullanıcı Android sistem Back butonuna dokunduğunda çağrılır.
onCloseButtonPressKapatma butonu görünürken bir kullanıcı ona dokunduğunda çağrılır. Bu işleyicide flow ekranını kapatmanız önerilir.
onPurchaseCompletedSatın alma tamamlandığında çağrılır; ister başarılı, ister kullanıcı tarafından iptal edilmiş, ister onay bekliyor olsun. Başarılı bir satın alma durumunda güncellenmiş bir AdaptyProfile sağlar. Kullanıcı iptalleri ve bekleyen ödemeler (örneğin ebeveyn onayı gerektiğinde), onPurchaseFailed değil, bu olayı tetikler.
onPurchaseStartedBir kullanıcı satın alma sürecini başlatmak için “Purchase” eylem butonuna dokunduğunda çağrılır.
onPurchaseFailedBir satın alma hatalar nedeniyle başarısız olduğunda çağrılır (örneğin ödeme kısıtlamaları, geçersiz ürünler, ağ hataları, işlem doğrulama hataları). Bunun yerine onPurchaseCompleted’ı tetikleyen kullanıcı iptalleri veya bekleyen ödemeler için çağrılmaz.
onRestoreStartedBir kullanı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ı gerekli accessLevel’a sahipse ekranı kapatmanız önerilir. Nasıl kontrol edileceğini öğrenmek için Abonelik durumu konusuna bakın.
onRestoreFailedGeri yükleme süreci başarısız olduğunda çağrılır ve AdaptyError sağlar.
onProductSelectedFlow view’indeki herhangi bir ürün seçildiğinde çağrılır; böylece kullanıcının satın almadan önce ne seçtiğini izleyebilirsiniz.
onErrorView render’ı sırasında bir hata oluştuğunda çağrılır ve AdaptyError sağlar. Bu tür hatalar oluşmamalıdır; bir tanesiyle 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. View oluştururken prefetchProducts: true ayarlamadıysanız, AdaptyUI gerekli nesneleri sunucudan kendisi getirir.
onAppearedFlow kullanıcıya görüntülendiğinde çağrılır. iOS’ta ayrıca, bir kullanıcı bir flow içindeki web paywall butonuna dokunduğunda ve uygulama içi tarayıcıda bir web paywall açıldığında çağrılır.
onDisappearedYalnızca modal sunum: Flow kullanıcı tarafından kapatıldığında çağrılır. iOS’ta ayrıca, bir flow’dan uygulama içi tarayıcıda açılan bir web paywall ekrandan kaybolduğunda çağrılır.
onWebPaymentNavigationFinishedSatın alma için bir web paywall açma girişiminden sonra çağrılır; ister başarılı ister başarısız olsun.
onAnalyticsBir flow’dan gelen özel analiz olayları için ayrılmıştır. Flow’lar bunları henüz kodunuza yaymaz, bu yüzden uygulamanıza gerek yoktur.
onRequestAppReviewBir flow’dan gelen uygulama değerlendirme istekleri için ayrılmıştır. Flow’lar henüz uygulama değerlendirme isteği tetiklemez, bu yüzden uygulamanıza gerek yoktur.
onRequestPermissionBir flow’dan gelen sistem izni istekleri (push bildirimleri veya kamera erişimi gibi) için ayrılmıştır. Flow’lar henüz izin isteği tetiklemez, bu yüzden uygulamanıza gerek yoktur.
onObserverPurchaseInitiatedYalnızca gözlemci modu: Bir kullanıcı bir flow’da satın alma butonuna dokunduğunda çağrılır. Adapty satın almayı yapmaz — onu kendi satın alma kodunuzla gerçekleştirin, 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 modu: Bir kullanıcı bir flow’da geri yükleme butonuna dokunduğunda çağrılır. Adapty geri yükleme yapmaz — onu kendiniz gerçekleştirin, 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.

Gözlemci modunda satın almaları yönetme

SDK’yı Gözlemci modunda (observerMode: true) etkinleştirdiyseniz ve Adapty tarafından render edilen bir flow sunarsanız, SDK satın almaları sizin için yapmaz. Bir kullanıcı satın alma veya geri yükleme butonuna dokunduğunda, SDK bunun yerine onObserverPurchaseInitiated veya onObserverRestoreInitiated çağırır. Satın almayı veya geri yüklemeyi kendi kodunuzla gerçekleştirin, flow’un yükleme göstergesini sağlanan callback’lerle yönetin ve ardından işlemi Adapty’ye bildirin.

const unsubscribe = view.setEventHandlers({
  onObserverPurchaseInitiated(product, onStartPurchase, onFinishPurchase) {
    onStartPurchase(); // show the flow's loading indicator
    myPurchaseApi(product.vendorProductId)
      .then((transactionId) => adapty.reportTransaction(transactionId))
      .finally(() => onFinishPurchase()); // hide the loading indicator
    return false; // keep the flow open; dismiss it yourself after success
  },
  onObserverRestoreInitiated(onStartRestore, onFinishRestore) {
    onStartRestore();
    myRestoreApi()
      .finally(() => onFinishRestore());
    return false;
  },
});

Bu rehber; satın almalar, geri yüklemeler, ürün seçimi ve paywall render işlemleri için olay yönetimini kapsar. Ayrıca buton yönetimini de (paywall’ı kapatma, bağlantı açma vb.) uygulamanız gerekir. Ayrıntılar için buton eylemlerini yönetme rehberimize bakın.

Paywall Builder ile yapılandırılan paywall’lar, satın alma yapmak ve geri yüklemek için ekstra koda ihtiyaç duymaz. 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 üzerinde gerçekleştirilen satın almayla ilgili eylemlere ait bildirimleri içerir. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenin.

Bu rehber yalnızca yeni Paywall Builder paywall’ları içindir; bunlar Adapty SDK v3.0 veya sonrasını gerektirir.

Mobil uygulamanızda paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için olay işleyicilerini uygulayın:

Olay örnekleri (Genişletmek için tıklayın)
// onCloseButtonPress
{
  //Record the event
}

// onAndroidSystemBack
{
  //Record the event
}

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

// onCustomAction
{
  "actionId": "login"
}

// onProductSelected
{
  "productId": "premium_monthly"
}

// onPurchaseStarted
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "price": {
      "amount": 9.99,
      "currencyCode": "USD",
      "currencySymbol": "$",
      "localizedString": "$9.99"
    }
  }
}

// onPurchaseCompleted - Success
{
  "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",
    "price": {
      "amount": 9.99,
      "currencyCode": "USD",
      "currencySymbol": "$",
      "localizedString": "$9.99"
    }
  }
}

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

// onPurchaseFailed
{
  "error": {
    "code": "purchase_failed",
    "message": "Purchase failed due to insufficient funds",
    "details": {
      "underlyingError": "Insufficient funds in account"
    }
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "price": {
      "amount": 9.99,
      "currencyCode": "USD",
      "currencySymbol": "$",
      "localizedString": "$9.99"
    }
  }
}

// onRestoreCompleted
{
  "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
{
  "error": {
    "code": "restore_failed",
    "message": "Purchase restoration failed",
    "details": {
      "underlyingError": "No previous purchases found"
    }
  }
}

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

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

// onPaywallShown
{
  //Record the event
}

// onPaywallClosed
{
  //Record the event
}

// onWebPaymentNavigationFinished
{
  //Record the event
}

İhtiyacınız olan olay işleyicilerini kaydedebilir, ihtiyacınız olmayanları atlayabilirsiniz. Bu durumda, kullanılmayan olay dinleyicileri oluşturulmaz. Zorunlu olay işleyicisi yoktur.

Olay işleyicileri bir boolean döndürür. true döndürülürse, görüntüleme süreci tamamlanmış sayılır; böylece paywall ekranı kapanır ve bu view için olay dinleyicileri kaldırılır.

Bazı olay işleyicilerinin, gerekirse geçersiz kılabileceğiniz bir varsayılan davranışı vardır:

  • onCloseButtonPress: kapatma butonuna basıldığında paywall’ı kapatır.
  • onUrlPress: tıklanan URL’yi açar ve paywall’ı açık tutar.
  • onAndroidSystemBack (yalnızca modal sunum için): Back butonuna basıldığında paywall’ı kapatır.
  • onRestoreCompleted: başarılı geri yüklemeden sonra paywall’ı kapatır.
  • onPurchaseCompleted: kullanıcı iptal etmediği sürece paywall’ı kapatır.
  • onRenderingFailed: render başarısız olursa paywall’ı kapatır.

Olay işleyicileri

Olay işleyiciAçıklama
onCustomActionBir kullanıcı özel bir eylem gerçekleştirdiğinde, örneğin bir özel butona tıkladığında çağrılır.
onUrlPressBir kullanıcı paywall’ınızdaki bir URL’ye tıkladığında çağrılır.
onAndroidSystemBackYalnızca modal sunum: Bir kullanıcı Android sistem Back butonuna dokunduğunda çağrılır.
onCloseButtonPressKapatma butonu görünürken bir kullanıcı ona dokunduğunda çağrılır. Bu işleyicide paywall ekranını kapatmanız önerilir.
onPurchaseCompletedSatın alma tamamlandığında çağrılır; ister başarılı, ister kullanıcı tarafından iptal edilmiş, ister onay bekliyor olsun. Başarılı bir satın alma durumunda güncellenmiş bir AdaptyProfile sağlar. Kullanıcı iptalleri ve bekleyen ödemeler (örneğin ebeveyn onayı gerektiğinde), onPurchaseFailed değil, bu olayı tetikler.
onPurchaseStartedBir kullanıcı satın alma sürecini başlatmak için “Purchase” eylem butonuna dokunduğunda çağrılır.
onPurchaseFailedBir satın alma hatalar nedeniyle başarısız olduğunda çağrılır (örneğin ödeme kısıtlamaları, geçersiz ürünler, ağ hataları, işlem doğrulama hataları). Bunun yerine onPurchaseCompleted’ı tetikleyen kullanıcı iptalleri veya bekleyen ödemeler için çağrılmaz.
onRestoreStartedBir kullanı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ı gerekli accessLevel’a sahipse ekranı kapatmanız önerilir. Nasıl kontrol edileceğini öğrenmek için Abonelik durumu konusuna bakın.
onRestoreFailedGeri yükleme süreci başarısız olduğunda çağrılır ve AdaptyError sağlar.
onProductSelectedPaywall view’indeki herhangi bir ürün seçildiğinde çağrılır; böylece kullanıcının satın almadan önce ne seçtiğini izleyebilirsiniz.
onRenderingFailedView render’ı sırasında bir hata oluştuğunda çağrılır ve AdaptyError sağlar. Bu tür hatalar oluşmamalıdır; bir tanesiyle 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. View oluştururken prefetchProducts: true ayarlamadıysanız, AdaptyUI gerekli nesneleri sunucudan kendisi getirir.
onPaywallShownPaywall kullanıcıya görüntülendiğinde çağrılır. iOS’ta ayrıca, bir kullanıcı bir paywall içindeki web paywall butonuna dokunduğunda ve uygulama içi tarayıcıda bir web paywall açıldığında çağrılır.
onPaywallClosedYalnızca modal sunum: Paywall kullanıcı tarafından kapatıldığında çağrılır. iOS’ta ayrıca, bir paywall’dan uygulama içi tarayıcıda açılan bir web paywall ekrandan kaybolduğunda çağrılır.
onWebPaymentNavigationFinishedSatın alma için bir web paywall açma girişiminden sonra çağrılır; ister başarılı ister başarısız olsun.