Procesar datos de onboardings en iOS SDK

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) {
    // Store user preferences or responses
    switch action.params {
    case .select(let params):
        // Handle single selection
    case .multiSelect(let params):
        // Handle multiple selections
    case .input(let params):
        // Handle text input
    case .datePicker(let params):
        // Handle date selection
    }
}

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" - Selección múltiple entre opciones
"input" - Campo de texto
"datePicker" - Selección de fecha
params.valueEl o los 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 variar según 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

Enriquecer perfiles de usuario con datos

Si quieres vincular de inmediato los datos de entrada con el perfil del usuario y evitar pedirle la misma información dos veces, debes actualizar el perfil del usuario con los datos de entrada 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 establecer el valor de ese campo como nombre de pila del usuario. Además, les pides que introduzcan su email en el campo email. En el código de tu app, puede quedar así:

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)
        }
        
        do {
            try await Adapty.updateProfile(params: builder.build())
        } catch {
            // handle the error
        }
}

Personalizar paywalls según las respuestas

Usando cuestionarios en los onboardings, también puedes personalizar los paywalls que muestras a los usuarios tras completar el onboarding.

Por ejemplo, puedes preguntarles sobre su experiencia con el deporte y mostrar diferentes CTAs y productos a distintos 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")
        }
        
        do {
            try await Adapty.updateProfile(params: builder.build())
        } catch {
            // handle the error
        }
    }
}
  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.