Passer des données aux flows dans le SDK iOS
Un tag personnalisé est une variable personnalisée dont la valeur provient de votre application. Après avoir sélectionné Value comes from outside the app dans les paramètres d’une variable, votre application peut définir sa valeur via le SDK Adapty. Par exemple, un élément texte contient « Coins : » et un tag personnalisé. Si votre application passe « 120 » pour le tag, les utilisateurs voient « Coins : 120 ».
Avant de commencer
Vous avez besoin du SDK Adapty v4 ou version ultérieure. Les versions antérieures à v4 n’affichent pas les flows.
Ajouter des balises personnalisées au flow
Pour afficher les valeurs de votre application dans un flow, configurez des tags personnalisés dans le builder :
-
Créez un tag personnalisé pour chaque valeur que votre application transmet.
-
Notez le nom complet de chaque tag, groupe compris. Le code de votre application transmet chaque valeur sous ce nom. Par exemple, si le groupe
usercontient un tagstreak, le nom complet du tag estuser.streak.
Transmettre des valeurs de tags personnalisés
Transmettez les valeurs de votre application au paramètre tagResolver de getFlowConfiguration, sous forme de dictionnaire [String: String] :
- Chaque clé correspond au nom complet d’un tag personnalisé, par exemple
user.streak. - Chaque valeur est la chaîne affichée à l’utilisateur à la place du tag.
- Chaque valeur doit être lisible par un humain, par exemple « 1 250 » et non « 1250.0 ». Adapty ne la formate ni ne la traduit.
let customTags = [
"username": "DragonSlayer42",
"coins": "1,250",
]
do {
let flowConfiguration = try await AdaptyUI.getFlowConfiguration(
forFlow: flow,
tagResolver: customTags
)
// present the flow
} catch {
// handle the error
}
Le modificateur SwiftUI .flow et AdaptyFlowView ainsi que le contrôleur de flow UIKit n’ont pas de paramètre pour les valeurs de tags personnalisés. Ils affichent les valeurs issues de la configuration du flow que vous leur fournissez.
Pour tester vos tags personnalisés, ouvrez le flow dans votre application, après avoir ajouté le code qui définit leurs valeurs. Le canevas du builder et l’aperçu sur les appareils n’affichent que les valeurs initiales : l’application mobile Adapty ne définit pas les valeurs des tags personnalisés.
Si votre application définit déjà des valeurs de tags personnalisés pour les anciens paywalls du Paywall Builder, consultez les différences entre les tags personnalisés dans les flows.
Ce que les utilisateurs voient sans valeur
Les utilisateurs voient la valeur initiale d’un tag personnalisé en guise de valeur de secours dans les cas suivants :
- Votre application ne transmet aucune valeur pour le tag.
- L’utilisateur n’a pas mis à jour votre application vers une version qui transmet la valeur.
- Le nom dans le code de votre application ne correspond pas au nom complet du tag, y compris la casse.
- Un autre tag personnalisé dans le même élément de texte n’a pas de valeur. Dans ce cas, tous les tags personnalisés de cet élément de texte affichent leur valeur initiale.
Pour n’afficher rien à la place d’un tag, transmettez une chaîne vide. Adapty considère une chaîne vide comme une valeur, donc la valeur de secours n’apparaît pas.
Exemple : afficher un IMC à partir des réponses à l’onboarding
Un flow peut collecter des réponses des utilisateurs, et un tag personnalisé peut afficher une valeur provenant de votre application. Combinez les deux pour montrer aux utilisateurs un résultat que votre application calcule à partir de leurs réponses, comme un score, un plan recommandé ou une métrique de santé :
- Un flow collecte les réponses et les envoie à votre application.
- Votre application calcule le résultat.
- Votre application transmet le résultat au flow suivant sous forme de valeur de tag personnalisé.
Dans cet exemple, un flow d’onboarding collecte le poids et la taille de l’utilisateur. Quand l’utilisateur ferme le flow d’onboarding après son dernier écran, votre application calcule son indice de masse corporelle (IMC). Ensuite, elle ouvre un flow de paywall qui affiche l’IMC.
Configurer les flows
-
Créez deux flows : un flow d’onboarding qui collecte le poids et la taille de l’utilisateur, et un flow de paywall qui affiche son IMC.
-
Ajoutez deux champs Number au flow d’onboarding :
- Un pour le poids en kilogrammes, avec l’Element ID
weight. - Un pour la taille en centimètres, avec l’Element ID
height.
Pour les deux champs, définissez le Format sur Integer. Un champ envoie sa valeur sous forme de texte, exactement tel que l’utilisateur l’a saisi, et l’exemple de code ne lit pas « 70.5 » et « 70,5 » de la même façon. Les nombres entiers n’ont pas de séparateur décimal, donc le code les lit de la même manière quelle que soit la locale.
- Un pour le poids en kilogrammes, avec l’Element ID
-
Pour vous assurer que votre application reçoit bien les deux valeurs, terminez le flow d’onboarding par un écran sans champs de saisie. Sur cet écran, ajoutez un bouton avec l’action Close flow. Les champs envoient leurs valeurs lorsqu’ils perdent le focus ou lorsque l’utilisateur passe à un autre écran. L’action Close flow ne les envoie pas. L’exemple de code n’ouvre le paywall que si l’utilisateur a atteint le dernier écran.
-
Dans le flow de paywall, créez un tag personnalisé nommé
bmi. Dans le champ Initial value, saisissez un tiret (—). Les utilisateurs verront ce tiret si votre application ne transmet aucun IMC. -
Ajoutez un élément texte avec les mots « Your BMI: » au flow de paywall. Après ces mots, insérez le tag personnalisé
bmi. -
Ajoutez le flow d’onboarding à un placement, par exemple
onboarding. Ajoutez le flow de paywall à un placement avec l’IDbmi_paywall. Le code de la section Transmettre l’IMC au paywall récupère le paywall via cet ID.
Transmettre l’IMC au paywall
Collectez le poids et la taille à partir des événements flow_user_input du flow d’onboarding, comme décrit dans Traiter les données des flows. Pour savoir que l’utilisateur a atteint le dernier écran, surveillez un événement flow_screen_showed avec is_last_screen défini à true, comme décrit dans Suivre les affichages d’écrans du flow. Quand l’utilisateur ferme le flow d’onboarding après cet écran, calculez l’IMC. Récupérez ensuite la configuration du flow du paywall et transmettez l’IMC pour la balise personnalisée bmi.
Le code suivant est pour UIKit. Il implémente les méthodes AdaptyFlowControllerDelegate sur un seul contrôleur de vue, qui est le délégué à la fois du contrôleur de flow d’onboarding et du contrôleur de paywall. Le contrôleur de vue doit également implémenter les méthodes d’achat et de restauration du délégué, que cet exemple ne détaille pas. Pour les consulter, rendez-vous sur Présenter les flows et les paywalls dans UIKit.
private var bodyAnswers: [String: String] = [:]
private var reachedLastScreen = false
func flowController(
_ controller: AdaptyFlowController,
didReceiveAnalyticEvent name: String,
params: [String: any Sendable]
) {
if name == "flow_screen_showed", params["is_last_screen"] as? Bool == true {
reachedLastScreen = true
return
}
guard name == "flow_user_input",
let elementId = params["element_id"] as? String,
let value = params["value"] as? String
else { return }
bodyAnswers[elementId] = value
}
func flowControllerDidDisappear(_ controller: AdaptyFlowController) {
// This delegate receives events from both flows. Reset `bodyAnswers` and
// `reachedLastScreen` whenever a flow disappears, so that the paywall
// doesn't open again when the user closes it.
let answers = bodyAnswers
let finished = reachedLastScreen
bodyAnswers.removeAll()
reachedLastScreen = false
// Number inputs send their values as strings.
guard finished,
let weight = answers["weight"].flatMap({ Double($0) }),
let height = answers["height"].flatMap({ Double($0) }),
height > 0
else { return }
let heightInMeters = height / 100
let bmi = weight / (heightInMeters * heightInMeters)
Task {
await showBMIPaywall(bmi: bmi.formatted(.number.precision(.fractionLength(1))))
}
}
func showBMIPaywall(bmi: String) async {
do {
let flow = try await Adapty.getFlow(placementId: "bmi_paywall")
let flowConfiguration = try await AdaptyUI.getFlowConfiguration(
forFlow: flow,
tagResolver: ["bmi": bmi]
)
let flowController = try AdaptyUI.flowController(
with: flowConfiguration,
delegate: self
)
present(flowController, animated: true)
} catch {
// handle the error
}
}
formatted utilise le séparateur décimal de la locale de l’utilisateur : « 22.7 » en anglais, « 22,7 » en allemand.
Dans SwiftUI, utilisez les closures du modificateur .flow du flow d’onboarding plutôt que les méthodes du délégué :
didReceiveAnalyticEvent: collectez le poids et la taille, et guettez l’événementflow_screen_showeddu dernier écran.didDisappear: si l’utilisateur est arrivé au dernier écran, calculez l’IMC. Récupérez ensuite la configuration du flow du paywall et passez l’IMC pour le custom tagbmi. Présentez cette configuration avec un second modificateur.flow.
Enregistrer l’IMC dans le profil de l’utilisateur
Pour afficher différents flows selon l’IMC de l’utilisateur, enregistrez-le en tant qu’attribut personnalisé de son profil. Dans l’Adapty Dashboard, créez un attribut personnalisé de type Number avec la clé bmi. Affichez ensuite chaque flow à une audience construite à partir de cet attribut.
Appelez la méthode updateProfile dans flowControllerDidDisappear, juste après la ligne qui calcule bmi. Transmettez ce Double, et non la chaîne formatée, afin qu’un segment puisse comparer l’IMC à un seuil :
do {
let params = try AdaptyProfileParameters.Builder()
.with(customAttribute: bmi, forKey: "bmi")
.build()
try await Adapty.updateProfile(params: params)
} catch {
// handle the error
}