iOS SDK'da paywall olaylarını yönetme

Bu kılavuz; satın alma, geri yükleme, ürün seçimi ve paywall render işlemleri için event yönetimini ele almaktadır. Ayrıca buton işlemlerini (paywallı kapatma, bağlantı açma vb.) de uygulamanız gerekir. Ayrıntılar için buton eylemlerini işleme kılavuzumuza bakın.

Paywall Builder ile yapılandırılmış paywalllar, satın alma yapmak veya geri yüklemek için ekstra kod gerektirmez. Ancak uygulamanızın tepki verebileceği bazı olaylar üretirler. Bu olaylar arasında buton tıklamaları (kapatma butonları, URL’ler, ürün seçimleri vb.) ve paywall üzerinde gerçekleştirilen satın alma işlemlerine ilişkin bildirimler yer alır. Bu olaylara nasıl tepki vereceğinizi aşağıda öğrenebilirsiniz.

Bu kılavuz yalnızca Adapty SDK v3.0 veya üzerini gerektiren yeni Paywall Builder paywallları içindir.

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.

SwiftUI’da olayları yönetme

Mobil uygulamanızdaki paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için SwiftUI’da .paywall modifierını kullanın:

@State var paywallPresented = false

var body: some View {
	Text("Hello, AdaptyUI!")
			.paywall(
          isPresented: $paywallPresented,
          paywall: paywall,
          viewConfiguration: viewConfig,
          didPerformAction: { action in
              switch action {
                  case .close:
                      paywallPresented = false
                  case let .openURL(url):
                      // handle opening the URL (incl. for terms and privacy)
                  default:
                      // handle other actions
              }
          },
          didSelectProduct: { /* Handle the event */  },
          didStartPurchase: { /* Handle the event */ },
          didFinishPurchase: { product, info in /* Handle the event */ },
          didFailPurchase: { product, error in /* Handle the event */ },
          didStartRestore: { /* Handle the event */ },
          didFinishRestore: { /* Handle the event */ },
          didFailRestore: { /* Handle the event */ },
          didFailRendering: { error in
              paywallPresented = false
          },
          didFailLoadingProducts: { error in
              return false
          }
      )
}

Yalnızca ihtiyacınız olan closure parametrelerini kaydedebilir, ihtiyaç duymadıklarınızı atlayabilirsiniz. Bu durumda kullanılmayan closure parametreleri oluşturulmaz.

ParametreZorunluAçıklama
isPresentedzorunluPaywall ekranının görüntülenip görüntülenmeyeceğini yöneten bir binding.
paywallConfigurationzorunluPaywallın görsel ayrıntılarını içeren bir AdaptyUI.PaywallConfiguration nesnesi. AdaptyUI.paywallConfiguration(for:products:viewConfiguration:observerModeResolver:tagResolver:timerResolver:) metodunu kullanın. Daha fazla ayrıntı için Paywall Builder paywalllarını ve yapılandırmalarını getirme konusuna bakın.
didFailPurchasezorunluSatın alma bir hata nedeniyle başarısız olduğunda çağrılır (örn. ödemeye izin verilmemesi, ağ sorunları, geçersiz ürün). Kullanıcı iptalleri veya bekleyen ödemeler için çağrılmaz.
didFinishRestorezorunluSatın alma başarıyla tamamlandığında çağrılır.
didFailRestorezorunluSatın alma geri yükleme başarısız olduğunda çağrılır.
didFailRenderingzorunluArayüz oluşturulurken bir hata oluşursa çağrılır. Bu durumda Adapty Destek ile iletişime geçin.
fullScreenisteğe bağlıPaywallın tam ekran modunda mı yoksa modal olarak mı göründüğünü belirler. Varsayılan değer true.
didAppearisteğe bağlıPaywall görünümü ekranda göründüğünde çağrılır. Ayrıca kullanıcı bir paywall içindeki web paywall butonuna dokunduğunda ve uygulama içi tarayıcıda bir web paywall açıldığında da çağrılır.
didDisappearisteğe bağlıPaywall görünümü kapatıldığında çağrılır. Ayrıca uygulama içi tarayıcıda açılan bir web paywall ekrandan kaybolduğunda da çağrılır.
didPerformActionisteğe bağlıKullanıcı bir butona tıkladığında çağrılır. Farklı butonların farklı action ID’leri vardır. İki action ID önceden tanımlıdır: close ve openURL; diğerleri ise özeldir ve builder’da ayarlanabilir.
didSelectProductisteğe bağlıSatın alma için bir ürün seçildiğinde (kullanıcı veya sistem tarafından) bu callback çağrılır.
didStartPurchaseisteğe bağlıKullanıcı satın alma sürecini başlattığında çağrılır.
didFinishPurchaseisteğe bağlıSatın alma başarıyla tamamlandığında çağrılır.
didFinishWebPaymentNavigationisteğe bağlıSatın alma için web paywall açma girişiminin ardından, başarılı veya başarısız olsun, çağrılır.
didStartRestoreisteğe bağlıKullanıcı geri yükleme sürecini başlattığında çağrılır.
didFailLoadingProductsisteğe bağlıÜrün yükleme sırasında hata oluştuğunda çağrılır. Yüklemeyi yeniden denemek için true döndürün.
didPartiallyLoadProductsisteğe bağlıÜrünler kısmen yüklendiğinde çağrılır.
showAlertItemisteğe bağlıPaywall üzerinde uyarı öğelerinin görüntülenmesini yöneten bir binding.
showAlertBuilderisteğe bağlıUyarı görünümünü oluşturmak için kullanılan bir fonksiyon.
placeholderBuilderisteğe bağlıPaywall yüklenirken yer tutucu görünümü oluşturmak için kullanılan bir fonksiyon.

UIKit’te olayları yönetme

Mobil uygulamanızdaki paywall ekranında gerçekleşen süreçleri kontrol etmek veya izlemek için AdaptyPaywallControllerDelegate metodlarını uygulayın.

Kullanıcı kaynaklı olaylar

Ürün seçimi

Bir kullanıcı satın alma için bir ürün seçerse bu metod çağrılır:

    func paywallController(
        _ controller: AdaptyPaywallController,
        didSelectProduct product: AdaptyPaywallProductWithoutDeterminingOffer
    ) { }
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"
  }
}

Satın alma başlatıldı

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

func paywallController(_ controller: AdaptyPaywallController,
                       didStartPurchase product: AdaptyPaywallProduct) {
}
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"
  }
}

Observer modunda çağrılmaz. Ayrıntılar için iOS - Observer modunda Paywall Builder paywalllarını gösterme konusuna bakın.

Web paywall kullanarak satın alma başlatıldı

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

func paywallController(
        _ controller: AdaptyPaywallController,
        shouldContinueWebPaymentNavigation product: AdaptyPaywallProduct
    ) {
    }
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"
  }
}

Başarılı veya iptal edilen satın alma

Satın alma başarılı olursa bu metod çağrılır:

func paywallController(
    _ controller: AdaptyPaywallController,
    didFinishPurchase product: AdaptyPaywallProductWithoutDeterminingOffer,
    purchaseResult: AdaptyPurchaseResult
) { }
}
Olay örnekleri (Genişletmek için tıklayın)
// Successful purchase
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "purchaseResult": {
    "type": "success",
    "profile": {
      "accessLevels": {
        "premium": {
          "id": "premium",
          "isActive": true,
          "expiresAt": "2024-02-15T10:30:00Z"
        }
      }
    }
  }
}

// Cancelled purchase
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "purchaseResult": {
    "type": "cancelled"
  }
}

Bu durumda paywall ekranını kapatmanızı öneririz.

Observer modunda çağrılmaz. Ayrıntılar için iOS - Observer modunda Paywall Builder paywalllarını gösterme konusuna bakın.

Başarısız satın alma

Bir satın alma hata nedeniyle başarısız olursa bu metod çağrılır. Bu; StoreKit hatalarını (ödeme kısıtlamaları, geçersiz ürünler, ağ hataları), işlem doğrulama hatalarını ve sistem hatalarını kapsar. Kullanıcı iptalleri, iptal edilmiş sonuçla birlikte didFinishPurchase metodunu tetikler; bekleyen ödemeler ise bu metodu tetiklemez.

func paywallController(
    _ controller: AdaptyPaywallController,
    didFailPurchase product: AdaptyPaywallProduct,
    error: AdaptyError
) { }
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"
    }
  }
}

Observer modunda çağrılmaz. Ayrıntılar için iOS - Observer modunda Paywall Builder paywalllarını gösterme konusuna bakın.

Web paywall kullanarak başarısız satın alma

Adapty.openWebPaywall() başarısız olursa bu metod çağrılır:

func paywallController(
        _ controller: AdaptyPaywallController,
        didFailWebPaymentNavigation product: AdaptyPaywallProduct,
        error: AdaptyError
    ) { }
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": "web_payment_failed",
    "message": "Web payment navigation failed",
    "details": {
      "underlyingError": "Network connection error"
    }
  }
}

Başarılı geri yükleme

Satın alma geri yükleme başarılı olursa bu metod çağrılır:

func paywallController(
    _ controller: AdaptyPaywallController, 
    didFinishRestoreWith profile: AdaptyProfile
) { }
Olay ö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ının gerekli accessLevel’a sahip olması durumunda ekranı kapatmanızı öneririz. Nasıl kontrol edileceğini öğrenmek için Abonelik durumu konusuna bakın.

Başarısız geri yükleme

Satın alma geri yükleme başarısız olursa bu metod çağrılır:

public func paywallController(
    _ controller: AdaptyPaywallController, 
    didFailRestoreWith error: AdaptyError
) { }
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 oluşturma

Ü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ı bu metodu çağırarak bildirir:

public func paywallController(
    _ controller: AdaptyPaywallController,
    didFailLoadingProductsWith error: AdaptyError
) -> Bool {
    return true
}
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"
    }
  }
}

true döndürürseniz AdaptyUI isteği 2 saniye sonra tekrarlar.

Oluşturma hataları

Arayüz oluşturulurken bir hata meydana gelirse bu metod tarafından bildirilir:

public func paywallController(
    _ controller: AdaptyPaywallController,
    didFailRenderingWith error: AdaptyError
) { }
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 koşullarda bu tür hatalar oluşmamalıdır; böyle bir hatayla karşılaşırsanız lütfen bize bildirin.