Procesar datos de onboardings en el SDK de iOS

A partir del SDK v4 (beta), puedes crear flows como alternativa más potente a los onboardings. A diferencia de los onboardings, que se ejecutan dentro de un WebView, los flows renderizan de forma nativa en el dispositivo, lo que proporciona animaciones más fluidas, una apariencia coherente con iOS, tiempos de carga más rápidos y sin dependencia del runtime de WebView. Consulta Obtener flows y paywalls y Mostrar flows y paywalls para empezar.

Cuando tus usuarios responden a una pregunta de un cuestionario o introducen datos en un campo de texto, se invocará el método onStateUpdatedAction. Puedes guardar o procesar el tipo de campo en tu código.

Por ejemplo:

func onboardingController(_ controller: AdaptyOnboardingController, onStateUpdatedAction action: AdaptyOnboardingsStateUpdatedAction) {
    // Almacenar preferencias o respuestas del usuario
    switch action.params {
    case .select(let params):
        // Manejar selección única
    case .multiSelect(let params):
        // Manejar selecciones múltiples
    case .input(let params):
        // Manejar entrada de texto
    case .datePicker(let params):
        // Manejar selección de fecha
    }
}

El objeto action contiene:

ParámetroDescripción
elementIdUn identificador único para el elemento de entrada. Puedes usarlo para asociar preguntas con respuestas al guardarlas.
paramsEl objeto de datos de entrada del usuario que contiene las propiedades de tipo y valor.
params.typeEl tipo de elemento de entrada. Puede ser:
"select" - Selección única entre opciones
"multiSelect" - Selecciones múltiples entre opciones
"input" - Campo de entrada de texto
"datePicker" - Selección de fecha
params.valueEl valor o valores seleccionados o introducidos por el usuario. La estructura depende del tipo:
select: Objeto con id, value, label
multiSelect: Array de objetos con id, value, label
input: Objeto con type, value
datePicker: Objeto con day, month, year
Ejemplos de datos guardados (pueden diferir en tu implementación)
// Example of a saved select action
{
    "elementId": "preference_selector",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "preferences_screen",
        "screenIndex": 1,
        "screensTotal": 3
    },
    "params": {
        "type": "select",
        "value": {
            "id": "option_1",
            "value": "premium",
            "label": "Premium Plan"
        }
    }
}

// Example of a saved multi-select action
{
    "elementId": "interests_selector",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "interests_screen",
        "screenIndex": 2,
        "screensTotal": 3
    },
    "params": {
        "type": "multiSelect",
        "value": [
            {
                "id": "interest_1",
                "value": "sports",
                "label": "Sports"
            },
            {
                "id": "interest_2",
                "value": "music",
                "label": "Music"
            }
        ]
    }
}

// Example of a saved input action
{
    "elementId": "name_input",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "profile_screen",
        "screenIndex": 0,
        "screensTotal": 3
    },
    "params": {
        "type": "input",
        "value": {
            "type": "text",
            "value": "John Doe"
        }
    }
}

// Example of a saved date picker action
{
    "elementId": "birthday_picker",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "profile_screen",
        "screenIndex": 0,
        "screensTotal": 3
    },
"params": {
    "type": "datePicker",
    "value": {
        "day": 15,
        "month": 6,
        "year": 1990
        }
    }
}

Casos de uso

Enriquece los perfiles de usuario con datos

Si quieres vincular inmediatamente los datos introducidos con el perfil del usuario y evitar pedirle la misma información dos veces, necesitas actualizar el perfil del usuario con esos datos al gestionar la acción.

Por ejemplo, pides a los usuarios que introduzcan su nombre en el campo de texto con el ID name, y quieres usar ese valor como nombre de pila del usuario. También les pides que introduzcan su email en el campo email. En el código de tu app, podría tener este aspecto:

func onboardingController(_ controller: AdaptyOnboardingController, onStateUpdatedAction action: AdaptyOnboardingsStateUpdatedAction) {
    // Store user preferences or responses
    switch action.params {
    case .input(let params):
        // Handle text input
        let builder = AdaptyProfileParameters.Builder()

        // Map elementId to appropriate profile field
        switch action.elementId {
        case "name":
            builder.with(firstName: params.value.value)
        case "email":
            builder.with(email: params.value.value)
        default:
            break
        }

        // Delegate methods are synchronous; kick off the async update in a Task.
        Task {
            do {
                try await Adapty.updateProfile(params: builder.build())
            } catch {
                // handle the error
            }
        }
    default:
        break
    }
}

Personaliza los paywalls en función de las respuestas

Con los cuestionarios en los onboardings, también puedes personalizar los paywalls que muestras a los usuarios después de que completen el onboarding.

Por ejemplo, puedes preguntarles sobre su experiencia con el deporte y mostrar distintos CTAs y productos a diferentes grupos de usuarios.

  1. Añade un cuestionario en el constructor de onboarding y asigna IDs significativos a sus opciones.
experience.webp
  1. Gestiona las respuestas del cuestionario según sus IDs y establece atributos personalizados para los usuarios.
func onboardingController(_ controller: AdaptyOnboardingController, onStateUpdatedAction action: AdaptyOnboardingsStateUpdatedAction) {
    // Handle quiz responses and set custom attributes
    switch action.params {
    case .select(let params):
        // Handle quiz selection
        let builder = AdaptyProfileParameters.Builder()

        // Map quiz responses to custom attributes
        switch action.elementId {
        case "experience":
            // Set custom attribute 'experience' with the selected value (beginner, amateur, pro)
            try? builder.with(customAttribute: params.value.value, forKey: "experience")
        default:
            break
        }

        // Delegate methods are synchronous; kick off the async update in a Task.
        Task {
            do {
                try await Adapty.updateProfile(params: builder.build())
            } catch {
                // handle the error
            }
        }
    default:
        break
    }
}
  1. Crea segmentos para cada valor de atributo personalizado.
  2. Crea un placement y añade audiencias para cada segmento que hayas creado.
  3. Muestra un paywall para el placement en el código de tu app. Si tu onboarding tiene un botón que abre un paywall, implementa el código del paywall como respuesta a la acción de ese botón.