Implementar web paywalls en el SDK de iOS

Antes de empezar, asegúrate de haber configurado tu web paywall en el dashboard y de tener instalada la versión 3.6.1 o posterior del SDK de Adapty.

Paywalls web abiertos

Si estás trabajando con un paywall que has desarrollado tú mismo, necesitas gestionar los paywalls web usando el método del SDK. El método .openWebPaywall:

  1. Genera una URL única que permite a Adapty vincular un paywall específico mostrado a un usuario concreto con la página web a la que es redirigido.
  2. Detecta cuándo tus usuarios regresan a la app y, a continuación, llama a .getProfile a intervalos cortos para determinar si los derechos de acceso del perfil han sido actualizados. De este modo, si el pago se realizó correctamente y se actualizaron los derechos de acceso, la suscripción se activa en la app casi de inmediato.
do {
    try await Adapty.openWebPaywall(for: product)
} catch {
    print("Failed to open web paywall: \(error)")
}

Existen dos versiones del método openWebPaywall:

  1. openWebPaywall(product), que genera URLs a partir del paywall e incluye los datos del producto en las URLs.
  2. openWebPaywall(paywall), que genera URLs a partir del paywall sin incluir los datos del producto. Úsala cuando los productos de tu paywall en Adapty sean distintos a los del paywall web.

Gestión de errores

ErrorDescripciónAcción recomendada
AdaptyError.paywallWithoutPurchaseUrlEl paywall no tiene configurada una URL de compra webComprueba si el paywall está correctamente configurado en el Adapty Dashboard
AdaptyError.productWithoutPurchaseUrlEl producto no tiene una URL de compra webVerifica la configuración del producto en el Adapty Dashboard
AdaptyError.failedOpeningWebPaywallUrlNo se pudo abrir la URL en el navegadorRevisa la configuración del dispositivo o proporciona un método de compra alternativo
AdaptyError.failedDecodingWebPaywallUrlNo se pudieron codificar correctamente los parámetros en la URLVerifica que los parámetros de la URL sean válidos y estén correctamente formateados

Ejemplo de implementación

class SubscriptionViewController: UIViewController {
    var paywall: AdaptyPaywall?
    
    @IBAction func purchaseButtonTapped(_ sender: UIButton) {
        guard let paywall = paywall, let product = paywall.products.first else { return }
         Task {
            await offerWebPurchase(for: product)
         }
    }
    
    func offerWebPurchase(for paywallProduct: AdaptyPaywallProduct) async {
        do {
            // Attempt to open web paywall
            try await Adapty.openWebPaywall(for: paywallProduct)
        } catch let error as AdaptyError {
            
            switch error {
            case .paywallWithoutPurchaseUrl, .productWithoutPurchaseUrl:
                showAlert(message: "Web purchase is not available for this product.")
            case .failedOpeningWebPaywallUrl:
                showAlert(message: "Could not open web browser. Please try again.")
            default:
                showAlert(message: "An error occurred: \(error.localizedDescription)")
            }
        } catch {
            showAlert(message: "An unexpected error occurred.")
        }
    }
    
    // Helper methods
    private func showAlert(message: String) { /* ... */ }
}

Cuando los usuarios vuelvan a la app, actualiza la interfaz para reflejar los cambios del perfil. AdaptyDelegate recibirá y procesará los eventos de actualización del perfil.

Abrir paywalls web en un navegador in-app

Abrir paywalls web en un navegador in-app es compatible a partir de Adapty SDK v3.15.

Por defecto, los paywalls web se abren en el navegador externo.

Para ofrecer una experiencia de usuario fluida, puedes abrir los paywalls web en un navegador in-app. Esto muestra la página de compra web dentro de tu aplicación, permitiendo a los usuarios completar las transacciones sin cambiar de app.

Para activarlo, establece el parámetro in en .inAppBrowser:

do {
    try await Adapty.openWebPaywall(for: product, in: .inAppBrowser) // default – .externalBrowser
} catch {
    print("Failed to open web paywall: \(error)")
}