Guide d'Intégration du SDK Flutter
Cette page explique comment implémenter le SDK+ Rokt Ecommerce pour Flutter. Le SDK+ transmet les données utilisateur et transactionnelles à Rokt sur les écrans configurés afin que Rokt puisse afficher des expériences pertinentes, telles que des offres sur les écrans de confirmation.
Utilisez les sélecteurs Cible et Langue ci-dessus pour choisir votre plateforme de déploiement et les exemples de code natif que vous souhaitez suivre.
Vous écrirez quelques lignes de code natif (Swift ou Objective-C sur iOS, Kotlin ou Java sur Android) lorsque vous initialiserez le SDK+ à l'Étape 2. Toutes les autres étapes utilisent Dart via le package mparticle_flutter_sdk.
1. Add the Rokt SDK+ to Your Flutter App#
Le SDK+ Flutter fonctionne au-dessus du SDK+ natif. Les étapes d'installation côté Dart sont les mêmes pour chaque cible ; l'installation native diffère selon la plateforme cible. Utilisez le pilule Target ci-dessus pour basculer entre iOS, Android et Web.
1Add the mparticle_flutter_sdk package#
Ajoutez le package mparticle_flutter_sdk à votre projet Flutter.
flutter pub add mparticle_flutter_sdk
2Pin mparticle_flutter_sdk to 2.0 or later#
Après avoir exécuté pub add, votre pubspec.yaml devrait verrouiller le package à 2.0 ou plus (nécessaire pour les publicités Shoppable Ads).
dependencies:
mparticle_flutter_sdk: ^2.0.0
3Add the Rokt SDK+ to your iOS app#
Le SDK+ Rokt nécessite une cible de déploiement minimum de iOS 15.0. Utilisez CocoaPods ou Swift Package Manager — selon ce que votre projet utilise déjà.
Ajoutez le pod SDK+ Rokt à votre ios/Podfile:
pod 'RoktSDKPlus', '~> 9.2'
Dans Xcode, sélectionnez File → Add Package Dependencies, entrez l'URL ci-dessous, définissez la règle de dépendance sur Up to Next Major Version, et ajoutez le produit RoktSDKPlus à votre cible d'application. Ou épinglez dans Package.swift:
| Package | URL du dépôt | Produit |
|---|---|---|
| Rokt SDK+ pour iOS | https://github.com/ROKT/rokt-sdk-plus-ios.git | RoktSDKPlus |
dependencies: [
.package(url: "https://github.com/ROKT/rokt-sdk-plus-ios.git", from: "9.2.0"),
]
4Get the SDK handle#
Importez le package dans votre code Dart et obtenez une instance du SDK. Ce mpInstance est le gestionnaire du SDK sur lequel repose le reste de ce guide — chaque appel d'API Dart dans les étapes ultérieures (identifier, définir les attributs utilisateur, enregistrer les événements, afficher les emplacements) passe par lui.
import 'package:mparticle_flutter_sdk/mparticle_flutter_sdk.dart';
MparticleFlutterSdk? mpInstance = await MparticleFlutterSdk.getInstance();
2. Initialize the Rokt SDK+#
Le SDK+ Flutter s'initialise via le SDK+ natif sur votre plateforme cible. Insérez l'extrait d'initialisation approprié côté natif, puis le package mparticle_flutter_sdk côté Dart le relaiera.
Lorsque vous insérez le snippet d'initialisation, vous verrez des champs personnalisables pour :
1Entering your Rokt key and secret#
Définissez la clé et le secret Rokt aux valeurs fournies par votre gestionnaire de compte Rokt.
2Setting your data environment#
Définissez l'environnement SDK+ sur développement lors des tests pour acheminer les données vers l'environnement de Développement, et sur production pour envoyer l'activité client en direct à la Production. (iOS : .development / .production. Android : MParticle.Environment.Development / MParticle.Environment.Production.)
3Entering a custom first-party domain#
Suivez les instructions dans Configuration du domaine de première partie, et définissez l'URL de base personnalisée sur votre objet network-options à votre sous-domaine personnalisé. Acheminer le SDK+ Rokt via votre propre domaine réduit le risque que les bloqueurs de publicités et les navigateurs bloquent les publicités ou les données. Omettez complètement les options réseau pour envoyer le trafic vers les points de terminaison par défaut de Rokt.
4Identifying your user and setting attributes#
Dans identifyRequest, passez l'email brut et non haché de l'utilisateur. Une fois identifié, utilisez le callback de succès (iOS : onIdentifyComplete. Android : addSuccessListener) pour définir des attributs utilisateur supplémentaires.
Incluez toujours identifyRequest dans le snippet d'initialisation. Si vous n'avez pas l'email de l'utilisateur lors de l'initialisation, omettez l'affectation (iOS) ou passez null (Android) — le SDK+ s'initialisera quand même, et vous pourrez identifier l'utilisateur plus tard via Étape 3 : Identifier l'utilisateur. Consultez Gestion des erreurs pour savoir comment gérer les échecs d'identité — sans gestion des erreurs, vous pourriez rencontrer des problèmes de cohérence des données à grande échelle.
Insérez le snippet d'initialisation suivant dans votre fichier AppDelegate. Remplacez your-key et your-secret par les valeurs fournies par votre équipe Rokt.
import mParticle_Apple_SDK
import RoktPaymentExtension
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Initialize the SDK
let options = MParticleOptions(key: "your-key",
secret: "your-secret")
// Specify the data environment with environment:
// Set it to .development if you are still testing your integration.
// Set it to .production if your integration is ready for production data.
// The default is .autoDetect which attempts to detect the environment automatically
options.environment = .development
// Enter your custom subdomain if you are using a first-party domain configuration (optional)
let networkOptions = MPNetworkOptions()
networkOptions.customBaseURL = URL(string: "https://rkt.example.com")
options.networkOptions = networkOptions
// Identify the current user:
let identifyRequest = MPIdentityApiRequest.withEmptyUser()
// If you're using an un-hashed email address, set it in 'email'.
identifyRequest.email = "j.smith@example.com"
// If you're using a hashed email address, set it in 'other' instead of email
identifyRequest.setIdentity("sha256 hashed email goes here", identityType: .other)
// If the user is identified with their email address, set additional user attributes.
options.identifyRequest = identifyRequest
options.onIdentifyComplete = {(result: MPIdentityApiResult?, error: Error?) in
if let user = result?.user {
user.setUserAttribute("example attribute key", value: "example attribute value")
}
}
MParticle.sharedInstance().start(with: options)
// Register after MParticle.sharedInstance().start(), before selectShoppableAds
if let paymentExt = RoktPaymentExtension(
applePayMerchantId: "merchant.com.yourapp.rokt", // omit if not offering Apple Pay
urlScheme: "myapp" // omit if not offering Afterpay / Clearpay
) {
MParticle.sharedInstance().rokt.registerPaymentExtension(paymentExt)
}
return true
}
Configurez stripePublishableKey dans vos paramètres du kit mParticle Rokt (tableau de bord mParticle). Le kit le transmet à Rokt sous forme de stripeKey lors de l'enregistrement — vous ne le passez pas dans le code. Au moins un de applePayMerchantId ou urlScheme doit être fourni.
5Registering the payment extension#
Enregistrez RoktPaymentExtension après MParticle.sharedInstance().start() et avant selectShoppableAds pour activer les paiements des publicités Shoppable. L'enregistrement est requis pour tous les placements de publicités Shoppable sur iOS — passez applePayMerchantId pour Apple Pay, urlScheme pour Afterpay / Clearpay, ou les deux. Consultez Annexe F : Configurer les paiements des publicités Shoppable.
3. Identify the User#
Le script d'initialisation du SDK+ identifie l'utilisateur actuel en utilisant les identifiants que vous avez fournis dans l'objet identifyRequest du script. Après l'initialisation du SDK, vous devez garder l'identité de l'utilisateur synchronisée chaque fois qu'il se connecte, se déconnecte, ou fournit un identifiant (par exemple, lors du paiement) en utilisant la méthode appropriée décrite ci-dessous.
Identifiants utilisateur pris en chargeLien direct vers Identifiants utilisateur pris en charge
Afficher les identifiants utilisateur pris en charge
| Identifiant | Type | Description |
|---|---|---|
email | string | Transmettez l'adresse e-mail brute et non hachée du client. |
mobile_number | string | Transmettez le numéro de téléphone du client au format E.164. |
customerId | string | Transmettez votre identifiant client/compte interne. Envoyez-le à chaque écran pour les utilisateurs connectés. |
other | string | Transmettez un e-mail haché avec SHA-256. Utilisez uniquement lorsque l'e-mail brut ne peut pas être fourni — ne passez pas à la fois email et other. |
other2 | string | Transmettez un numéro de mobile haché avec SHA-256. Utilisez uniquement lorsque le numéro de mobile brut ne peut pas être fourni — ne passez pas à la fois mobile_number et other2. |
Pour identifier l'utilisateur :
1Create an identityRequest object#
Créez un objet identityRequest pour contenir les identifiants de l'utilisateur. Vous devez intégrer l'adresse e-mail brute et non hachée de l'utilisateur dans le champ email.
2Use the success handler for additional attributes#
Pour définir des attributs utilisateur supplémentaires, utilisez le gestionnaire de succès then lors de l'appel d'identification (web : identityCallback). Si le identityRequest réussit, tous les attributs utilisateur que vous définissez dans le gestionnaire sont attribués à l'utilisateur identifié.
3Send the request using the method that matches the user's action#
Transmettez le identityRequest (et éventuellement le identityCallback) à la méthode qui correspond à l'action de l'utilisateur :
login: appelez lorsque l'utilisateur se connecte ou crée un compte.identify: appelez lorsque vous obtenez l'e-mail de l'utilisateur en cours de session sans transition de connexion (par exemple, un invité entre son e-mail lors du paiement).logout: appelez lorsque l'utilisateur se déconnecte.
Appeler ces méthodes fait passer l'enregistrement du SDK de l'état actuel de l'utilisateur. Les méthodes login et logout enregistrent également automatiquement un événement correspondant pour améliorer l'attribution de Rokt.
Par exemple, pour identifier un utilisateur nommé Jane Smith avec l'adresse e-mail j.smith@example.com, le numéro de mobile +13125551515, et l'ID client cust_10482 :
import 'package:mparticle_flutter_sdk/identity/identity_type.dart';
import 'package:mparticle_flutter_sdk/identity/identity_api_result.dart';
import 'package:mparticle_flutter_sdk/identity/identity_api_error_response.dart';
// 1. Create the identityRequest object
var identityRequest = MparticleFlutterSdk.identityRequest;
// Preferred: pass the customer's raw, unhashed email.
// If you can only provide a SHA-256-hashed email, remove the Email line and use IdentityType.Other instead — do not pass both.
identityRequest.setIdentity(identityType: IdentityType.Email, value: 'j.smith@example.com');
identityRequest.setIdentity(identityType: IdentityType.Other, value: 'SHA-256 hashed email'); // only if raw email unavailable
// If you can only provide a SHA-256-hashed mobile number, use IdentityType.Other2 instead of MobileNumber — do not pass both.
identityRequest.setIdentity(identityType: IdentityType.Other2, value: 'SHA-256 hashed mobile number'); // only if raw mobile unavailable
identityRequest.setIdentity(identityType: IdentityType.MobileNumber, value: '+13125551515');
identityRequest.setIdentity(identityType: IdentityType.CustomerId, value: 'cust_10482');
// 2. Optionally set user attributes in the success handler.
void Function(IdentityApiResult) identityCallback = (IdentityApiResult successResponse) {
successResponse.user.setUserAttribute('firstname', 'Jane');
successResponse.user.setUserAttribute('lastname', 'Smith');
};
// 3. Call one of the following methods that best matches the user's action:
mpInstance?.identity.login(identityRequest: identityRequest).then(identityCallback); // Call when the user logs in or creates an account
mpInstance?.identity.identify(identityRequest: identityRequest).then(identityCallback); // Call when you obtain the user's email mid-session, but not during a login
mpInstance?.identity.logout(); // Call when the user logs out
4. Set User Attributes#
Définissez les attributs utilisateur progressivement à mesure que l'utilisateur navigue dans votre application, pas seulement lors du paiement. Plus vous définissez d'attributs, mieux Rokt peut résoudre le client et fournir des offres pertinentes.
import 'package:mparticle_flutter_sdk/mparticle_flutter_sdk.dart';
// Retrieve the current user. This will only succeed if you have identified the user during SDK initialization or by calling the identify method.
var currentUser = await mpInstance?.getCurrentUser();
// Once you have successfully set the current user to `currentUser`, you can set user attributes with:
currentUser?.setUserAttribute(key: 'custom-attribute-name', value: 'custom-attribute-value');
// Note: all user attributes (including list attributes and tags) must have distinct names.
// Rokt recommends setting as many of the following user attributes as possible:
currentUser?.setUserAttribute(key: 'firstname', value: 'John');
currentUser?.setUserAttribute(key: 'lastname', value: 'Doe');
// Phone numbers can be formatted either as '1234567890', or '+1 (234) 567-8901'
currentUser?.setUserAttribute(key: 'mobile', value: '3125551515');
currentUser?.setUserAttribute(key: 'age', value: '33');
currentUser?.setUserAttribute(key: 'gender', value: 'M');
currentUser?.setUserAttribute(key: 'city', value: 'Brooklyn');
currentUser?.setUserAttribute(key: 'state', value: 'NY');
currentUser?.setUserAttribute(key: 'zip', value: '123456');
currentUser?.setUserAttribute(key: 'dob', value: 'yyyymmdd');
currentUser?.setUserAttribute(key: 'title', value: 'Mr');
currentUser?.setUserAttribute(key: 'language', value: 'en');
currentUser?.setUserAttribute(key: 'lifetime_value', value: '52.25');
currentUser?.setUserAttribute(key: 'predictedltv', value: '136.23');
// You can create a user attribute to contain a list of values
var attributeList = <String>[];
attributeList.add('documentary');
attributeList.add('comedy');
attributeList.add('romance');
attributeList.add('drama');
currentUser?.setUserAttributeArray(key: 'favorite-genres', value: attributeList);
// To remove a user attribute, call removeUserAttribute and pass in the attribute name. All user attributes share the same key space.
currentUser?.removeUserAttribute(key: 'attribute-to-remove');
Attributs utilisateurLien direct vers Attributs utilisateur
Définissez autant que possible des éléments suivants que vous pouvez collecter :
Afficher tous les attributs utilisateur
| Attribut | Type | Description |
|---|---|---|
firstname | string | Prénom du client. Utilisé pour la personnalisation. |
lastname | string | Nom de famille du client. Utilisé pour la personnalisation. |
mobile | string | Numéro de téléphone formaté comme 1112345678 ou +1 (222) 345-6789. Utilisé pour la résolution d'identité et la pertinence. |
age | integer | Âge du client. Alternative à dob. Utilisé pour l'éligibilité et la pertinence. |
dob | string | Date de naissance, yyyymmdd. Alternative à age. Utilisé pour l'éligibilité et la pertinence. |
gender | string | Genre du client. Par exemple, M, F, Male, ou Female. Utilisé pour la pertinence. |
title | string | Titre de civilité. Par exemple, Mr, Mrs, Ms. Utilisé pour la personnalisation. |
language | string | Code de langue ISO 639-1 associé à l'achat. Utilisé pour la pertinence. |
city | string | Ville de facturation. Utilisé pour la pertinence. |
state | string | État / province / région de facturation. Utilisé pour la pertinence et l'éligibilité. |
zip | string | Code postal complet (préférence américaine est ZIP+4). Utilisé pour la résolution d'identité et la pertinence. |
country | string | Code de pays ISO 3166-1 alpha-2 (par exemple US, GB, AU). Utilisé pour l'éligibilité et la pertinence. |
newcustomer | boolean | Indique si c'est un premier achat. Utilisé pour la pertinence. |
customertype | string | Indique si l'utilisateur est authentifié (guest / logged_in). Utilisé pour la pertinence. |
loyaltytier | string | Niveau du programme de fidélité partenaire. Utilisé pour la pertinence et l'éligibilité. |
loyaltyid | string | ID de membre du programme de fidélité. Utilisé pour la résolution d'identité. |
lifetime_value | decimal | Valeur d'achat cumulée du client, sous forme de chaîne (par exemple "52.25"). Utilisé pour la pertinence. |
predictedltv | decimal | Valeur totale à vie prédite, généralement à partir d'un modèle ML partenaire. Distinct de lifetime_value. Utilisé pour la pertinence. |
subscriptionstatus | string | État de l'abonnement si applicable (active, trial, churned, paused, none). Utilisé pour la pertinence et l'éligibilité. |
customersegment | string | Segmentation interne du partenaire (par exemple vip, at_risk, new, reactivated). Utilisé pour la pertinence. |
utmsource | string | Source d'attribution marketing. Utilisé pour la pertinence. |
utmmedium | string | Support d'attribution marketing. Utilisé pour la pertinence. |
utmcampaign | string | Campagne d'attribution marketing. Utilisé pour la pertinence. |
Tous les attributs utilisateur (y compris les attributs de liste) doivent avoir des noms distincts.
5. Log Events#
Suivez les vues d'écran, les événements commerciaux et les événements personnalisés pour que Rokt puisse comprendre où se trouve chaque client dans son parcours.
Appelez mpInstance?.logScreenEvent() avec le nom de l'écran (par exemple, 'homepage', 'product_detail_page'). Incluez tous les attributs personnalisés supplémentaires dans la carte customAttributes de l'événement.
import 'package:mparticle_flutter_sdk/events/screen_event.dart';
ScreenEvent screenEvent = ScreenEvent(eventName: 'homepage')
..customAttributes = {'custom-attribute': 'custom-value'};
mpInstance?.logScreenEvent(screenEvent);
Les événements commerciaux contiennent des détails au niveau du produit pour le parcours de l'utilisateur. Déclenchez un événement commercial distinct pour chaque action produit que le client effectue.
Investir dans une couverture complète des événements commerciaux est l'une des actions les plus rentables que vous puissiez entreprendre lors de votre intégration. Chaque événement informe Rokt de quelque chose de différent sur l'endroit où se trouve le client dans son parcours : une vue de produit signale l'exploration, un ajout au panier signale la considération, un début de paiement signale l'intention d'achat, et un achat complété confirme la conversion. Avec un signal plus riche, Rokt peut personnaliser les offres plus efficacement, mesurer la performance des placements avec précision, et attribuer les conversions aux bons points de contact. Faire ce travail lors de votre intégration initiale évite également une réadaptation ultérieure. Le signal se renforce au fil du temps : chaque événement reçu par Rokt ajoute du contexte utilisé pour affiner la personnalisation, améliorer la précision de l'attribution et mieux résoudre et segmenter votre base de clients lors de futures visites.
Les événements commerciaux sont enregistrés avec CommerceEvent, en utilisant un ProductActionType qui identifie l'action du client (visualisation d'un produit, ajout au panier, début de paiement, achat complété, etc.).
Afficher tous les types d'actions produit
| Action du client | Constante d'action produit |
|---|---|
| Page de détail du produit vue | ProductActionType.ViewDetail |
| Produit cliqué | ProductActionType.Click |
| Article ajouté au panier | ProductActionType.AddToCart |
| Article retiré du panier | ProductActionType.RemoveFromCart |
| Article ajouté à la liste de souhaits | ProductActionType.AddToWishList |
| Article retiré de la liste de souhaits | ProductActionType.RemoveFromWishlist |
| Flux de paiement initié | ProductActionType.Checkout |
| Option de paiement sélectionnée | ProductActionType.CheckoutOption |
| Commande confirmée | ProductActionType.Purchase |
| Commande remboursée | ProductActionType.Refund |
Suivre un événement commercial se déroule en trois phases :
1Define the product#
Construisez un produit avec un nom, un SKU et un prix. Définissez des champs supplémentaires comme quantity, category, brand, et variant directement sur l'instance. Sur la cible Web, utilisez mParticle.eCommerce.createProduct à la place — Flutter Web passe par le SDK Web mParticle.
Product product = Product(
name: 'Double Room - Econ Rate',
sku: 'econ-1',
price: 100.00,
);
product.quantity = 4;
product.category = 'room';
product.brand = 'lodge-o-rama';
product.variant = 'standard';
2Summarize the transaction#
Construire un TransactionAttributes pour les événements Purchase, Checkout, et CheckoutOption. Sur la cible Web, utilisez un objet littéral transactionAttributes simple avec des clés en PascalCase. Les coupons au niveau de la commande appartiennent ici, pas sur les produits individuels.
final TransactionAttributes transactionAttributes = TransactionAttributes(
transactionId: 'ORDER-12345',
revenue: 149.99,
tax: 12.50,
shipping: 5.99,
couponCode: 'SUMMER20',
);
3Log the commerce event#
Construire un CommerceEvent avec le type d'action produit et votre/vos produit(s), attachez transactionAttributes lorsque cela est applicable, puis appelez mpInstance?.logCommerceEvent. Sur le Web, appelez mParticle.eCommerce.logProductAction (ou logImpression pour les impressions PLP) à la place. Choisissez l'action client que vous souhaitez enregistrer :
Enregistrez une vue de page de liste de produits (ou de catégorie) comme une impression de produit. Passez chaque produit visible en un seul appel, et définissez le nom de l'impression sur le nom de la liste/catégorie (Rokt utilise cela comme listname).
| Champ | Type | Requis | Description |
|---|---|---|---|
Name | string | oui | Nom de la liste ou de la catégorie (par ex. "Mens Running Shoes"). Devient listname. |
Products | array | oui | Objets produit. Définissez position pour le rang 1-indexé de chaque article. |
currency | string | oui | Code de devise ISO 4217 (passé comme customAttribute au niveau de l'événement). |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
Product product = Product(
name: 'Trail Runner v3',
sku: 'SKU-001',
price: 129.95,
);
product.quantity = 1;
product.position = 1; // 1-indexed rank in the list
CommerceEvent event = CommerceEvent.withImpression(
impressionListName: 'Mens Running Shoes',
product: product,
);
event.customAttributes = {'currency': 'USD'};
mpInstance?.logCommerceEvent(event);
Enregistrez lorsqu'un client ouvre une page de détail produit.
| Champ | Type | Requis | Description |
|---|---|---|---|
productsku | string | oui | SKU du produit. |
productname | string | oui | Nom d'affichage. |
itemprice | decimal | oui | Prix unitaire au moment de la vue. |
currency | string | oui | Code de devise ISO 4217. |
listname | string | non | Définir si l'utilisateur est arrivé d'un PLP. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
Product product = Product(
name: 'Trail Runner v3',
sku: 'SKU-001',
price: 129.95,
);
product.quantity = 1;
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.ViewDetail,
product: product,
);
event.customAttributes = {'currency': 'USD', 'listname': 'PLP-Running'};
mpInstance?.logCommerceEvent(event);
Enregistrez lorsqu'un client ajoute un article au panier.
| Champ | Type | Requis | Description |
|---|---|---|---|
productsku | string | oui | SKU du produit. |
quantity | integer | oui | Unités ajoutées. |
itemprice | decimal | oui | Prix unitaire au moment de l'ajout. |
currency | string | oui | Code de devise ISO 4217. |
couponCode | string | non | Coupon au niveau de la commande, si appliqué au moment de l'ajout. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
Product product = Product(
name: 'Trail Runner v3',
sku: 'SKU-001',
price: 129.95,
);
product.quantity = 1;
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.AddToCart,
product: product,
);
event.customAttributes = {'currency': 'USD'};
mpInstance?.logCommerceEvent(event);
Enregistrer lorsqu'un client retire un article du panier.
| Champ | Type | Requis | Description |
|---|---|---|---|
productsku | string | oui | SKU du produit. |
quantity | integer | oui | Unités retirées. |
currency | string | oui | Code de devise ISO 4217. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
Product product = Product(
name: 'Trail Runner v3',
sku: 'SKU-001',
price: 129.95,
);
product.quantity = 1; // units removed
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.RemoveFromCart,
product: product,
);
event.customAttributes = {'currency': 'USD'};
mpInstance?.logCommerceEvent(event);
Enregistrer lorsque le client arrive sur la page du panier. Étant donné que les vues de la page du panier n'ont pas de ProductActionType natif, utilisez MPEvent avec le nom de l'événement "view_cart" et EventType.Other. Passez le contenu complet du panier en tant qu'attributs personnalisés.
| Champ | Type | Requis | Description |
|---|---|---|---|
event_name | string | oui | Toujours "view_cart". |
event_type | EventType | oui | Utilisez EventType.Other. |
cartitems | array | oui | Contenu complet du panier en tant que tableau JSON réel (ne pas convertir en chaîne). |
cartitemcount | integer | oui | Nombre de lignes du panier. |
totalprice | decimal | oui | Total du panier. |
currency | string | oui | Code de devise ISO 4217. |
couponcode | string | non | Promo au niveau de la commande, si appliquée. |
Chaque entrée dans le tableau cartitems a la forme suivante :
| Field | Type | Description |
|---|---|---|
cartitemid | string | Stable partner-side cart-line identifier. Usually equals productsku when there is one line per SKU; use a unique value if you allow multiple lines for the same SKU (e.g. gift-wrap variants). |
productsku | string | Product SKU / stock identifier. |
productname | string | Product display name. |
productcategory | string | Product category / taxonomy leaf. |
productbrand | string | Product brand. |
productvariant | string | Variant identifier (size, color, etc.). |
itemprice | decimal | Per-unit price at event time. |
unitprice | decimal | Per-unit list price pre-discount. Omit if equal to itemprice. |
quantity | integer | Units in this line. |
currency | string | ISO 4217 code. Omit if matches the top-level currency. |
couponcode | string | Coupon applied to this line (if any). Order-level promos belong in transactionAttributes.Coupon. |
productposition | integer | 1-indexed rank of the product within a list or search results. |
import 'package:mparticle_flutter_sdk/events/event_type.dart';
import 'package:mparticle_flutter_sdk/events/mp_event.dart';
MPEvent event = MPEvent(
eventName: 'view_cart',
eventType: EventType.Other)
..customAttributes = {
'cartitemcount': 3,
'totalprice': 169.85,
'currency': 'USD',
'couponcode': 'SUMMER20',
'cartitems': [
{'cartitemid': 'SKU-001', 'productsku': 'SKU-001', 'productname': 'Trail Runner v3', 'itemprice': 129.95, 'quantity': 1},
{'cartitemid': 'SKU-002', 'productsku': 'SKU-002', 'productname': 'Cushion Insole', 'itemprice': 19.95, 'quantity': 2},
],
};
mpInstance?.logEvent(event);
Enregistrer lorsque le client entre dans le processus de paiement. Envoyez tous les produits du panier et un résumé de la transaction couvrant le total du panier et tout coupon au niveau de la commande.
| Champ | Type | Requis | Description |
|---|---|---|---|
cartitems | array | oui | Contenu complet du panier. |
totalprice | decimal | oui | Total du panier avant taxes/livraison. |
cartitemcount | integer | oui | Nombre de lignes du panier. |
currency | string | oui | Code de devise ISO 4217. |
couponCode | string | non | Promo au niveau de la commande, si appliquée. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
import 'package:mparticle_flutter_sdk/events/transaction_attributes.dart';
Product product1 = Product(name: 'Trail Runner v3', sku: 'SKU-001', price: 129.95);
product1.quantity = 1;
Product product2 = Product(name: 'Cushion Insole', sku: 'SKU-002', price: 19.95);
product2.quantity = 2;
final TransactionAttributes transactionAttributes = TransactionAttributes(
revenue: 169.85,
couponCode: 'SUMMER20',
);
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.Checkout,
product: product1,
);
event.addProduct(product2);
event.transactionAttributes = transactionAttributes;
event.customAttributes = {'currency': 'USD', 'cartitemcount': 3};
mpInstance?.logCommerceEvent(event);
Enregistrer lorsque le client termine l'étape de livraison. Passez option: 'shipping' avec les sélections de livraison en tant qu'attributs personnalisés.
| Champ | Type | Requis | Description |
|---|---|---|---|
cartitems | array | oui | Contenu complet du panier. |
option | string | oui | Toujours "shipping" pour cet événement. |
shippingmethod | string | oui | standard / express / next_day. |
zipcode | string | oui | Code postal de livraison. |
country | string | oui | Code pays ISO 3166-1 alpha-2. |
totalprice | decimal | oui | Total du panier. |
currency | string | oui | Code de devise ISO 4217. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
Product product1 = Product(name: 'Trail Runner v3', sku: 'SKU-001', price: 129.95);
product1.quantity = 1;
Product product2 = Product(name: 'Cushion Insole', sku: 'SKU-002', price: 19.95);
product2.quantity = 2;
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.CheckoutOption,
product: product1,
);
event.addProduct(product2);
event.customAttributes = {
'option': 'shipping',
'shippingmethod': 'express',
'zipcode': '94103',
'country': 'US',
'totalprice': 169.85,
'currency': 'USD',
};
mpInstance?.logCommerceEvent(event);
Enregistrez lorsque le client termine l'étape de paiement. Passez option: 'payment' avec le mode de paiement sélectionné comme attributs personnalisés.
| Champ | Type | Requis | Description |
|---|---|---|---|
cartitems | array | oui | Contenu complet du panier. |
option | string | oui | Toujours "payment" pour cet événement. |
paymenttype | string | oui | credit_card / paypal / apple_pay / etc. |
payment_method | string | non | Méthode spécifique lorsque pertinent (par exemple, marque de carte). |
paymentServiceProvider | string | non | Identifiant PSP (par exemple, stripe). Doit être en camelCase. |
ccbin | string | non | Premiers 6-8 chiffres de la carte, si une carte a été utilisée. |
totalprice | decimal | oui | Total du panier. |
currency | string | oui | Code de devise ISO 4217. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
Product product1 = Product(name: 'Trail Runner v3', sku: 'SKU-001', price: 129.95);
product1.quantity = 1;
Product product2 = Product(name: 'Cushion Insole', sku: 'SKU-002', price: 19.95);
product2.quantity = 2;
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.CheckoutOption,
product: product1,
);
event.addProduct(product2);
event.customAttributes = {
'option': 'payment',
'paymenttype': 'credit_card',
'payment_method': 'visa',
'paymentServiceProvider': 'stripe',
'ccbin': '424242',
'totalprice': 169.85,
'currency': 'USD',
};
mpInstance?.logCommerceEvent(event);
Enregistrez lorsque la commande est confirmée. Envoyez le panier complet et un résumé de la transaction identifiant la commande, le revenu, la taxe, l'expédition et tout coupon au niveau de la commande.
| Champ | Type | Requis | Description |
|---|---|---|---|
cartitems | array | oui | Contenu complet du panier au moment de la commande. |
transactionId | string | oui | Identifiant de commande / transaction. |
totalprice | decimal | oui | Total de la commande (Revenu). |
tax | decimal | oui | Taxe totale sur la commande. |
shipping | decimal | oui | Coût d'expédition. |
currency | string | oui | Code de devise ISO 4217. |
couponCode | string | non | Promo au niveau de la commande, si appliquée. |
cartitemcount | integer | non | Nombre de lignes de panier. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
import 'package:mparticle_flutter_sdk/events/transaction_attributes.dart';
Product product1 = Product(name: 'Trail Runner v3', sku: 'SKU-001', price: 129.95);
product1.quantity = 1;
Product product2 = Product(name: 'Cushion Insole', sku: 'SKU-002', price: 19.95);
product2.quantity = 2;
final TransactionAttributes transactionAttributes = TransactionAttributes(
transactionID: 'ORDER-10482',
revenue: 169.85,
tax: 14.20,
shipping: 5.99,
couponCode: 'SUMMER20',
);
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.Purchase,
product: product1,
);
event.addProduct(product2);
event.transactionAttributes = transactionAttributes;
event.customAttributes = {'currency': 'USD', 'cartitemcount': 3};
mpInstance?.logCommerceEvent(event);
Enregistrez lorsqu'une commande (ou une ligne à l'intérieur) est remboursée. Envoyez uniquement les produits remboursés ainsi qu'un résumé de la transaction faisant référence à l'ID de commande original.
| Champ | Type | Requis | Description |
|---|---|---|---|
productsku | string | oui | SKU de la ou des lignes remboursées. |
quantity | integer | oui | Unités remboursées. |
transactionId | string | oui | ID de commande original contre lequel le remboursement est effectué. |
totalprice | decimal | oui | Montant remboursé. |
currency | string | oui | Code de devise ISO 4217. |
import 'package:mparticle_flutter_sdk/events/product.dart';
import 'package:mparticle_flutter_sdk/events/commerce_event.dart';
import 'package:mparticle_flutter_sdk/events/product_action_type.dart';
import 'package:mparticle_flutter_sdk/events/transaction_attributes.dart';
Product refundedProduct = Product(
name: 'Trail Runner v3',
sku: 'SKU-001',
price: 129.95,
);
refundedProduct.quantity = 1; // units refunded
final TransactionAttributes transactionAttributes = TransactionAttributes(
transactionID: 'ORDER-10482', // original order id
revenue: 129.95, // refunded amount
);
CommerceEvent event = CommerceEvent.withProduct(
productActionType: ProductActionType.Refund,
product: refundedProduct,
);
event.transactionAttributes = transactionAttributes;
event.customAttributes = {'currency': 'USD'};
mpInstance?.logCommerceEvent(event);
Enregistrez lorsque le client effectue une recherche sur le site. La recherche sur le site est un événement standard Web uniquement — les cibles iOS et Android n'ont pas d'équivalent natif.
La recherche sur le site est un événement standard Web uniquement. Pour les cibles Flutter iOS, enregistrez un événement personnalisé avec EventType.Search à la place (voir l'option Événements personnalisés dans ce sélecteur).
Suivez les événements personnalisés en utilisant MPEvent, en passant un nom d'événement, un type d'événement et des attributs personnalisés optionnels.
Afficher les types d'événements personnalisés
| Type | Utilisation pour |
|---|---|
EventType.Navigation | Flux de navigation utilisateur et transitions d'écran dans votre application. |
EventType.Location | Interactions et mouvements basés sur la localisation. |
EventType.Search | Requêtes de recherche et actions liées à la recherche. |
EventType.Transaction | Transactions financières et activités liées aux achats. |
EventType.UserContent | Contenu généré par l'utilisateur comme des avis, des commentaires ou des publications. |
EventType.UserPreference | Paramètres utilisateur, préférences et choix de personnalisation. |
EventType.Social | Interactions sur les réseaux sociaux et activités de partage. |
EventType.Other | Tout ce qui ne rentre pas dans les catégories ci-dessus. |
import 'package:mparticle_flutter_sdk/events/event_type.dart';
import 'package:mparticle_flutter_sdk/events/mp_event.dart';
MPEvent event = MPEvent(
eventName: 'video_watched',
eventType: EventType.Navigation)
..customAttributes = {
'category': 'Destination Intro',
'title': 'Paris',
};
mpInstance?.logEvent(event);
6. Show a Placement#
Appelez selectPlacements sur chaque écran de paiement et de confirmation sur lequel vous souhaitez que Rokt rende du contenu. Incluez l'un des identifiants de page suivants pour spécifier le type d'écran et s'il est destiné aux tests ou à la production :
stg.rokt.conf: A confirmation page in a staging (or testing) environment.prod.rokt.conf: A confirmation page in a production environment.stg.rokt.payments: A payments page in a staging (or testing) environment.prod.rokt.payments: A payments page in a production environment.
Attributs de placementLien direct vers Attributs de placement
Passez ces attributs dans la carte attributes de selectPlacements. Fournissez toujours la valeur la plus récente — les attributs passés ici remplacent tout appel antérieur de setUserAttribute.
Afficher tous les attributs de placement
| Attribut | Type | Description |
|---|---|---|
email | string | Email du client (non haché). Utilisé pour la résolution d'identité. |
firstname | string | Prénom du client. Utilisé pour la personnalisation. |
lastname | string | Nom de famille du client. Utilisé pour la personnalisation. |
mobile | string | Numéro de mobile du client au format E.164. Utilisé pour la résolution d'identité. |
confirmationref | string | Numéro de référence de commande / confirmation. Utilisé pour la pertinence et la déduplication. |
currency | string | Devise de la transaction (ISO 4217, par exemple USD, GBP, AUD). Utilisé pour la pertinence. |
country | string | Code pays ISO 3166-1 alpha-2. Utilisé pour l'éligibilité et la pertinence. |
language | string | Langue préférée du client (ISO 639-1). Utilisé pour la pertinence. |
totalprice | decimal | Valeur totale du panier incluant taxes et livraison. Utilisé pour la pertinence. |
amount | string | Sous-total du panier avant taxes et livraison. Distinct de totalprice. Utilisé pour la pertinence et les publicités Shoppable. |
cartitemcount | integer | Nombre d'articles dans le panier. Utilisé pour la pertinence. |
cartItems | array | Tableau structuré d'objets de ligne de panier (Flutter Web uniquement). Voir Articles du panier sous Événements commerciaux. Utilisé pour la pertinence. |
couponcode | string | Code promo appliqué à la commande, le cas échéant. Utilisé pour la pertinence. |
newcustomer | boolean | Indique si c'est un premier achat. Utilisé pour la pertinence. |
customertype | string | guest ou logged_in. Utilisé pour la pertinence. |
lifetime_value | decimal | Valeur cumulative des achats du client (par exemple "2340.00"). Utilisé pour la pertinence. |
subscriptionstatus | string | État de l'abonnement si applicable (active, trial, churned, paused, none). Utilisé pour la pertinence et l'éligibilité. |
customersegment | string | Segmentation interne du partenaire (par exemple vip, at_risk, new, reactivated). Utilisé pour la pertinence. |
paymenttype | string | Méthode de paiement sélectionnée (credit_card, paypal, apple_pay, etc.). Utilisé pour l'éligibilité Pay+ et la priorisation des méthodes de paiement des publicités Shoppable. |
paymentServiceProvider | string | Services de paiement proposés sur la page (apple_pay, paypal, card). Utilisé pour l'éligibilité à Pay+. |
ccbin | string | BIN de carte de crédit (6-8 chiffres). Utilisé pour la pertinence. |
billingaddress1 | string | Adresse de facturation. Utilisée pour la résolution d'identité et la pertinence. |
billingaddress2 | string | Appartement / unité de facturation. Utilisé pour la résolution d'identité. |
billingcity | string | Ville de facturation. Utilisée pour la pertinence. |
billingstate | string | État ou province de facturation. Utilisé pour la pertinence. |
billingzipcode | string | Code postal de facturation. Utilisé pour la résolution d'identité et la pertinence. |
shippingmethod | string | Méthode d'expédition sélectionnée (standard, express, next_day). Utilisée pour la pertinence. |
shippingaddress1 | string | Adresse de livraison. Utilisée pour la pertinence et l'exécution des commandes Shoppable Ads. |
shippingcity | string | Ville de livraison. Utilisée pour la pertinence et l'exécution des commandes Shoppable Ads. |
shippingstate | string | État ou province de livraison. Utilisé pour la pertinence et l'exécution des commandes Shoppable Ads. |
shippingzipcode | string | Code postal de livraison. Utilisé pour la pertinence et l'exécution des commandes Shoppable Ads. |
shippingcountry | string | Pays de livraison (ISO 3166-1 alpha-2). Utilisé pour la pertinence et l'exécution des commandes Shoppable Ads. |
adsexperience | string | Passez "shoppable" lors de la sélection délibérée d'une expérience Shoppable Ads. |
Les placements en superposition s'affichent au-dessus de votre écran de confirmation dans un conteneur géré par Rokt, ne nécessitant aucun changement à la disposition existante de votre application.
Pour insérer un placement en superposition, appelez selectPlacements une fois que l'écran de confirmation est chargé :
import 'package:mparticle_flutter_sdk/mparticle_flutter_sdk.dart';
final attributes = {
// Identity
'email': 'j.smith@example.com',
'firstname': 'Jenny',
'lastname': 'Smith',
'mobile': '+13125551515',
// Transaction
'confirmationref': '54321',
'currency': 'USD',
'country': 'US',
'language': 'en',
'totalprice': '149.99',
'cartitemcount': '2',
'couponcode': 'SUMMER20',
// Customer context
'newcustomer': 'false',
'customertype': 'logged_in',
'lifetime_value': '2340.00',
'subscriptionstatus': 'active',
'customersegment': 'vip',
// Payment (include paymenttype and paymentServiceProvider for Pay+)
'paymenttype': 'credit_card',
'paymentServiceProvider': 'card',
'ccbin': '411112',
// Billing address
'billingaddress1': '123 Main St',
'billingcity': 'Brooklyn',
'billingstate': 'NY',
'billingzipcode': '11201',
// Shipping
'shippingmethod': 'express',
'shippingaddress1': '175 Varick St',
'shippingcity': 'New York',
'shippingstate': 'NY',
'shippingzipcode': '10014',
'shippingcountry': 'US',
};
final roktConfig = RoktConfig(
colorMode: ColorMode.light,
);
mpInstance?.rokt.selectPlacements(
identifier: 'RoktExperience',
attributes: attributes,
roktConfig: roktConfig,
);
Les placements intégrés s'affichent en ligne à une position fixe dans votre application que vous contrôlez (par exemple, au-dessus des options de paiement sur un écran de panier). Les placements intégrés sont utilisés à la fois par Thanks et Pay+, mais Pay+ doit utiliser des placements intégrés.
Utilisez le widget RoktLayout pour intégrer un placement dans votre interface utilisateur Flutter. Le rappel onLayoutCreated est déclenché lorsque le widget est créé.
import 'package:mparticle_flutter_sdk/mparticle_flutter_sdk.dart';
final attributes = {
'email': 'j.smith@example.com',
'firstname': 'Jenny',
'lastname': 'Smith',
'billingzipcode': '90210',
'confirmationref': '54321',
};
const RoktLayout(
placeholderName: 'RoktEmbedded1',
onLayoutCreated: () {
// Layout created
}
);
mpInstance?.rokt.selectPlacements(
identifier: 'RoktExperience',
attributes: attributes,
);
Pour les placements Pay+, incluez paymenttype et paymentServiceProvider dans l'appel selectPlacements sur chaque écran. paymentServiceProvider communique les méthodes de paiement disponibles sur l'écran de paiement ; paymenttype communique la méthode avec laquelle l'utilisateur a payé.
Les placements interstitiels sont rendus entre les écrans de paiement et de confirmation, permettant aux clients d'acheter des produits supplémentaires. Les placements interstitiels sont utilisés par les publicités Shoppable Ads.
Les placements interstitiels (publicités Shoppable Ads) sont pris en charge uniquement sur iOS dans le SDK Flutter+. Le chemin Android ne prend pas en charge les placements interstitiels. Sur le Web, les placements interstitiels utilisent le wrapper <rokt-thank-you> décrit ci-dessous.
Les publicités Shoppable Ads nécessitent mparticle_flutter_sdk 2.0.0 ou plus tard et RoktSDKPlus ~> 9.2 depuis rokt-sdk-plus-ios sur iOS. Si vous êtes encore sur la version 1.x, suivez le guide de migration SDK+ 2.0 avant de continuer.
Le RoktPaymentExtension utilisé ci-dessous est fourni avec RoktSDKPlus (ajouté à votre ios/Podfile dans Étape 1) — aucun pod séparé n'est requis.
1Register the payment extension in AppDelegate.swift#
Dans ios/Runner/AppDelegate.swift, enregistrez l'extension de paiement après l'initialisation du SDK+ :
import mParticle_Apple_SDK
import RoktPaymentExtension
// In application(_:didFinishLaunchingWithOptions:), after MParticle.sharedInstance().start(with: options)
if let paymentExt = RoktPaymentExtension(
applePayMerchantId: "merchant.com.yourapp.rokt", // omit if not offering Apple Pay
urlScheme: "myapp" // omit if not offering Afterpay / Clearpay
) {
MParticle.sharedInstance().rokt.registerPaymentExtension(paymentExt)
}
Configurez stripePublishableKey dans les paramètres de votre kit mParticle Rokt ; le kit le transmet automatiquement à Rokt. Dans le code, fournissez uniquement l'ID marchand Apple Pay et/ou urlScheme. Au moins l'un de applePayMerchantId ou urlScheme doit être fourni. Apple Pay est optionnel — les publicités Shoppable Ads prennent également en charge PayPal intégré et le transfert de carte sans cela.
Vous devez appeler registerPaymentExtension après l'initialisation du SDK+ et avant d'appeler selectShoppableAds depuis votre code Dart. Si aucune extension de paiement n'est enregistrée, selectShoppableAds déclenchera un événement PlacementFailure.
2Forward redirect URLs (Afterpay, Clearpay, PayPal)#
Si vous proposez Afterpay, Clearpay ou PayPal, ces méthodes redirigent vers votre application après authentification. Transférez les URL entrantes à Rokt depuis votre iOS natif SceneDelegate (ou AppDelegate), en plus de toute gestion d'URL mParticle existante. Passez cette étape si vous proposez uniquement Apple Pay ou le transfert de carte.
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
for urlContext in URLContexts {
if MParticle.sharedInstance().rokt.handleURLCallback(with: urlContext.url) {
return
}
MParticle.sharedInstance().handleURLContext(urlContext)
}
}
Afterpay / Clearpay nécessitent également le schéma d'URL correspondant enregistré sous CFBundleURLTypes dans Info.plist et passé comme urlScheme lors de la création de RoktPaymentExtension (voir l'étape précédente).
3Call selectShoppableAds from your Dart code#
Appelez selectShoppableAds une fois que tous les attributs requis sont disponibles. Les publicités Shoppable Ads s'affichent toujours en tant que superposition — aucune vue intégrée n'est nécessaire.
final attributes = {
'email': 'j.smith@example.com',
'firstname': 'Jenny',
'lastname': 'Smith',
'confirmationref': 'ORD-12345',
'amount': '52.25',
'currency': 'USD',
'paymenttype': 'visa',
'shippingaddress1': '123 Main St',
'shippingcity': 'New York',
'shippingstate': 'NY',
'shippingzipcode': '10001',
'shippingcountry': 'US',
};
mpInstance?.rokt.selectShoppableAds(
identifier: 'ConfirmationPage',
attributes: attributes,
);
Les événements des publicités Shoppable Ads sont livrés via le EventChannel MPRoktEvents — voir la section API des événements ci-dessous.
Fonctions optionnellesLien direct vers Fonctions optionnelles
| Fonction | Objectif |
|---|---|
Rokt.close() | Fermeture automatique des placements en superposition. |
Configuration supplémentaireLien direct vers Configuration supplémentaire
Passez des paramètres optionnels tels que RoktConfig pour personnaliser l'interface utilisateur du placement (par exemple, mode sombre/clair, mise en cache). Les chemins de fichiers de polices peuvent également être fournis sous forme de carte des noms PostScript vers les chemins des ressources.
// If you want to use custom fonts for your placement, create a fontTypefaces map
final fontTypefaces = {'Arial-Bold': 'fonts/Arial-Bold.ttf'};
final roktConfig = RoktConfig(
colorMode: ColorMode.light,
);
mpInstance?.rokt.selectPlacements(
identifier: 'RoktExperience',
attributes: attributes,
fontFilePathMap: fontTypefaces,
roktConfig: roktConfig,
);
Si vous souhaitez mettre à jour l'identifiant RoktExperience ou l'identifiant intégré RoktEmbedded1 avec une valeur différente, contactez votre gestionnaire de compte Rokt pour vous assurer que les placements Rokt sont configurés de manière cohérente.
Événements APILien direct vers Événements API
Sur iOS et Android, le SDK+ fournit des événements de cycle de vie des placements sous forme de flux via le MPRoktEvents EventChannel. Sur le Web, abonnez-vous aux événements directement sur l'objet de sélection retourné par selectPlacements.
final EventChannel roktEventChannel = EventChannel('MPRoktEvents');
roktEventChannel.receiveBroadcastStream().listen((dynamic event) {
debugPrint('rokt_event: $event');
});
Événements standardsLien direct vers Événements standards
Afficher tous les événements standards
| Événement | Description | Paramètres |
|---|---|---|
| ShowLoadingIndicator | Déclenché avant que le SDK+ n'appelle le backend de Rokt. | |
| HideLoadingIndicator | Déclenché lorsque le SDK+ reçoit un succès ou un échec du backend de Rokt. | |
| PlacementInteractive | Déclenché lorsqu'un placement a été rendu et est interactif. | identifier: String |
| PlacementReady | Déclenché lorsqu'un placement est prêt à être affiché mais n'a pas encore rendu de contenu. | identifier: String |
| OfferEngagement | Déclenché lorsque l'utilisateur interagit avec l'offre. | identifier: String |
| PositiveEngagement | Déclenché lorsque l'utilisateur interagit positivement avec l'offre. | identifier: String |
| FirstPositiveEngagement | Déclenché lorsque l'utilisateur interagit positivement avec l'offre pour la première fois. | identifier: String, fulfillmentAttributes: FulfillmentAttributes |
| OpenUrl | Déclenché lorsque l'utilisateur appuie sur une URL configurée pour être envoyée à l'application partenaire. | identifier: String, url: String |
| PlacementClosed | Déclenché lorsqu'un placement est fermé par l'utilisateur. | identifier: String |
| PlacementCompleted | Déclenché lorsque la progression de l'offre atteint la fin et qu'il n'y a plus d'offres à afficher. Également déclenché lorsque le cache est atteint mais que le placement récupéré ne sera pas affiché car il a été précédemment rejeté. | identifier: String |
| PlacementFailure | Déclenché lorsqu'un placement n'a pas pu être affiché en raison d'une défaillance ou lorsqu'aucun placement n'est disponible à afficher. | identifier: String (optionnel) |
| EmbeddedSizeChanged | Déclenché lorsque la hauteur d'un placement intégré change. | identifier: String, selectedHeight: Double |
| CartItemInstantPurchase | Déclenché lorsque l'achat d'un article du catalogue est initié par l'utilisateur. | identifier: String, catalogItemId: String, cartItemId: String, totalPrice: String, currency: String |
| CartItemInstantPurchaseInitiated | Flux d'achat démarré — l'utilisateur a appuyé sur "Acheter" (Shoppable Ads, iOS uniquement). | identifier: String, catalogItemId: String, cartItemId: String |
| CartItemInstantPurchaseFailure | Échec de l'achat (Shoppable Ads, iOS uniquement). | identifier: String, catalogItemId: String, cartItemId: String, error: String |
| CartItemDevicePay | Paiement par Apple Pay / appareil déclenché (Shoppable Ads, iOS uniquement). | identifier: String, catalogItemId: String, cartItemId: String, paymentProvider: String |
| InstantPurchaseDismissal | L'utilisateur a rejeté la superposition d'achat (Shoppable Ads, iOS uniquement). | identifier: String |
7. Appendix#
Appendice A : Configuration de l'applicationLien direct vers Appendice A : Configuration de l'application
Les applications peuvent passer des paramètres de configuration via RoktConfig afin que le SDK+ utilise la configuration personnalisée de votre application au lieu des paramètres par défaut du système.
Objet ColorModeLien direct vers Objet ColorMode
| Valeur | Description |
|---|---|
light | L'application est en mode clair |
dark | L'application est en mode sombre |
system | L'application utilise le mode couleur du système par défaut |
final roktConfig = RoktConfig(
colorMode: ColorMode.light,
);
mpInstance?.rokt.selectPlacements(
identifier: 'RoktExperience',
attributes: attributes,
roktConfig: roktConfig,
);
EdgeToEdgeDisplay (Android uniquement)Lien direct vers EdgeToEdgeDisplay (Android uniquement)
| Valeur | Description |
|---|---|
true (par défaut) | L'application prend en charge le mode d'affichage bord à bord |
false | L'application ne prend pas en charge le mode d'affichage bord à bord |
Lors de la construction du RoktConfig natif sur Android, appelez edgeToEdgeDisplay(true) sur le RoktConfig.Builder pour activer le mode bord à bord :
import com.mparticle.MParticle
import com.mparticle.rokt.RoktConfig
val roktConfig = RoktConfig.Builder()
.edgeToEdgeDisplay(true)
.build()
MParticle.getInstance()?.Rokt()?.selectPlacements(
identifier = "RoktExperience",
attributes = attributes,
config = roktConfig
)
Objet CacheConfigLien direct vers Objet CacheConfig
| Paramètre | Description |
|---|---|
cacheDurationInSeconds | Durée optionnelle en secondes pendant laquelle le SDK+ de Rokt doit mettre en cache l'expérience. La valeur maximale autorisée est de 90 minutes ; la valeur par défaut est de 90 minutes si non fournie ou invalide. |
cacheAttributes | Attributs optionnels à utiliser comme clé de cache. Si null, tous les attributs envoyés dans selectPlacements seront utilisés comme clé de cache. |
// Cache the experience for 1200 seconds, using email and orderNumber as the cache key.
final roktConfig = RoktConfig(
cacheConfig: CacheConfig(
cacheDurationInSeconds: 1200,
cacheAttributes: {'email': 'j.smith@example.com', 'orderNumber': '123'},
),
);
mpInstance?.rokt.selectPlacements(
identifier: 'RoktExperience',
attributes: attributes,
roktConfig: roktConfig,
);
Appendice B : Support SwiftUI avec MPRoktLayout (iOS uniquement)Lien direct vers Appendice B : Support SwiftUI avec MPRoktLayout (iOS uniquement)
Si votre application est principalement écrite en SwiftUI, le composant MPRoktLayout offre une approche plus moderne et déclarative pour intégrer les emplacements Rokt dans votre application iOS.
La classe MPRoktLayout fournit une manière compatible avec SwiftUI d'afficher les emplacements Rokt sans appeler manuellement selectPlacements, prenant en charge à la fois les types d'emplacements en superposition et intégrés.
import SwiftUI
import mParticle_Apple_SDK
import mParticle_Rokt_Swift
struct OrderConfirmationView: View {
let attributes = [
"email": "test@gmail.com",
"firstname": "Jenny",
"lastname": "Smith",
"billingzipcode": "07762",
"confirmationref": "54321"
]
@State private var sdkTriggered = true
var body: some View {
VStack(alignment: .leading) {
// Other UI components
Text("Order Confirmation")
.font(.title)
// Rokt placement using SwiftUI
MPRoktLayout(
sdkTriggered: $sdkTriggered,
identifier: "RoktExperience",
locationName: "RoktEmbedded1", // For embedded placements
attributes: attributes,
config: roktConfig, // Optional RoktConfig
onEvent: { roktEvent in
// Optional: Handle different event types see above
}
).roktLayout
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
}
}
| Paramètre | Type | Description |
|---|---|---|
sdkTriggered | Bool | Contrôle quand l'emplacement doit être déclenché. |
identifier | String | L'identifiant de l'emplacement Rokt (par exemple, "RoktExperience"). |
locationName | String? | Nom de lieu optionnel pour les emplacements intégrés (par exemple, "RoktEmbedded1"). |
attributes | [String: String] | Dictionnaire d'attributs à transmettre à l'emplacement. |
config | RoktConfig? | Objet de configuration optionnel pour le mode couleur, la mise en cache, etc. |
onEvent | ((RoktEvent) -> Void)? | Callback optionnel pour gérer tous les événements d'emplacement. |
Appendice C : Support de Jetpack Compose avec RoktLayout (Android uniquement)Lien direct vers Appendice C : Support de Jetpack Compose avec RoktLayout (Android uniquement)
Pour les écrans implémentés en utilisant Jetpack Compose, le SDK+ fournit le composable RoktLayout pour une intégration moderne et déclarative des placements Rokt. RoktLayout supporte les types de placement Overlay, BottomSheet et Embedded sans invoquer manuellement selectPlacements.
import com.mparticle.kits.RoktLayout
import com.mparticle.MpRoktEventCallback
import com.mparticle.UnloadReasons
@Composable
fun MainScreen(modifier: Modifier = Modifier) {
Column(
modifier = modifier
.background(Color.LightGray)
.padding(8.dp),
) {
val attributes = mapOf(
"email" to "j.smith@example.com",
"firstname" to "Jenny",
"lastname" to "Smith",
"mobile" to "(323) 867-5309",
"postcode" to "90210",
"country" to "US"
)
val callbacks = object : MpRoktEventCallback {
override fun onLoad() = println("View loaded")
override fun onUnload(reason: UnloadReasons) = println("View unloaded due to: $reason")
override fun onShouldShowLoadingIndicator() = println("Show loading indicator")
override fun onShouldHideLoadingIndicator() = println("Hide loading indicator")
}
val roktConfig = RoktConfig.Builder()
.colorMode(RoktConfig.ColorMode.DARK)
.cacheConfig(CacheConfig(
cacheDurationInSeconds = 1200,
cacheAttributes = mapOf("email" to "j.smith@example.com")
))
.build()
RoktLayout(
sdkTriggered = true,
identifier = "RoktExperience",
attributes = attributes,
location = "Location1",
modifier = Modifier
.fillMaxWidth()
.background(Color.Black),
mpRoktEventCallback = callbacks,
config = roktConfig
)
}
}
ParamètresLien direct vers Paramètres
| Paramètre | Type | Description |
|---|---|---|
sdkTriggered | Boolean | Contrôle quand le placement doit être déclenché. |
identifier | String | L'identifiant de l'expérience Rokt (par exemple "RoktExperience"). |
location | String? | Nom de localisation optionnel pour les placements intégrés (par exemple "Location1"). |
attributes | Map<String, String> | Carte des attributs à transmettre au placement. |
modifier | Modifier | Compose Modifier pour personnaliser la disposition, le style et le comportement de l'interface utilisateur. |
mpRoktEventCallback | MpRoktEventCallback | Callback optionnel pour gérer les événements de placement (chargement, déchargement, état de chargement). |
config | RoktConfig? | Configuration optionnelle pour le mode couleur, la mise en cache, etc. |
Appendice D : Gestion des erreursLien direct vers Appendice D : Gestion des erreurs
L'API IDSync est conçue pour être centrale dans l'état de votre application et est conçue pour être rapide et hautement disponible. De la même manière que votre application peut empêcher les utilisateurs de se connecter, de se déconnecter ou de modifier leur état sans connexion Internet — traitez ces API comme des opérations de contrôle pour maintenir un état utilisateur cohérent. Le SDK+ ne réessaiera pas automatiquement les appels API, mais fournit des API de callback pour que vous puissiez le faire selon votre logique métier.
Si vous n'implémentez pas la gestion des erreurs, vous pourriez rencontrer des problèmes de cohérence des données à grande échelle.
import 'package:mparticle_flutter_sdk/identity/identity_api_result.dart';
import 'package:mparticle_flutter_sdk/identity/identity_api_error_response.dart';
mpInstance?.identity
.identify(identityRequest: identityRequest)
.then(
(IdentityApiResult successResponse) {
// Proceed with the identified user
},
onError: (error) {
var failureResponse = error as IdentityAPIErrorResponse;
// Inspect failureResponse.statusCode to determine the error type:
// - Check for network errors (device offline) and retry the request
// - Check for throttle errors (429) and retry with backoff
print('Identity error: $failureResponse');
}
);
Codes d'erreur côté client (iOS)Lien direct vers Codes d'erreur côté client (iOS)
L'énumération MPIdentityErrorResponseCode définit les codes côté client suivants :
| MPIdentityErrorResponseCode | Description |
|---|---|
MPIdentityErrorResponseCodeRequestInProgress | La requête HTTP IDSync n'a pas été effectuée car une requête HTTP IDSync est déjà en cours. |
MPIdentityErrorResponseCodeClientSideTimeout | La requête HTTP IDSync a échoué en raison d'un délai d'attente de connexion TCP. |
MPIdentityErrorResponseCodeClientNoConnection | La requête HTTP IDSync a échoué en raison d'un manque de couverture réseau. |
MPIdentityErrorResponseCodeSSLError | La requête HTTP IDSync a échoué en raison d'un problème de configuration SSL. |
MPIdentityErrorResponseCodeOptOut | La requête HTTP IDSync n'a pas été effectuée car le SDK+ est désactivé en raison d'un refus de consentement. |
MPIdentityErrorResponseCodeUnknown | La requête HTTP IDSync a échoué en raison d'une erreur inconnue. |
Codes d'erreur AndroidLien direct vers Codes d'erreur Android
Le SDK+ Android renvoie IdentityApi.UNKNOWN_ERROR pour les problèmes côté client, y compris la perte de couverture de l'appareil, le délai d'attente côté client, ou les requêtes d'identité invalides. Vérifiez THROTTLE_ERROR (HTTP 429) et réessayez avec un backoff lorsque rencontré.
Codes de statut HTTPLien direct vers Codes de statut HTTP
| Valeur | Description |
|---|---|
| 400 | L'appel HTTP IDSync a échoué en raison d'un corps de requête invalide. |
| 401 | L'appel HTTP IDSync a échoué en raison d'une erreur d'authentification. Vérifiez que votre clé API est correcte. |
| 429 | L'appel HTTP IDSync a été limité et doit être réessayé. |
| 5xx | L'appel HTTP IDSync a échoué en raison d'un problème côté serveur Rokt. Contactez votre représentant de compte pour plus d'informations. |
Appendice E : Transmission de l'ID de session du web vers le natifLien direct vers Appendice E : Transmission de l'ID de session du web vers le natif
Lorsque le parcours utilisateur s'étend à la fois sur les plateformes web et natives, vous pouvez maintenir une session Rokt cohérente en transmettant l'ID de session du Web SDK+ au Flutter SDK+. Cela est utile pour les flux hybrides où les utilisateurs effectuent une action dans un WebView (comme une page de paiement) et retournent à l'application native pour confirmation.
Récupération de l'ID de session depuis le Web SDK+Lien direct vers Récupération de l'ID de session depuis le Web SDK+
Après avoir appelé selectPlacements, l'ID de session est disponible dans le contexte de sélection :
const selection = await launcher.selectPlacements({
identifier: "checkout",
attributes: {
email: "user@example.com",
// ... other attributes
}
});
const sessionId = await selection.context.sessionId;
The session ID is a unique GUID assigned to the current user journey. It is useful for debugging and for correlating a user's activity across your web and native surfaces.
Transmission à l'application native via un lien profondLien direct vers Transmission à l'application native via un lien profond
Transmettez l'ID de session à votre application native en utilisant un lien profond :
const deepLink = `myapp://confirmation?sessionId=${encodeURIComponent(sessionId)}`;
window.location.href = deepLink;
Configuration de l'ID de session sur iOSLien direct vers Configuration de l'ID de session sur iOS
Extrait l'ID de session du lien profond et transmettez-le au SDK+ avant d'appeler selectPlacements. Ajoutez ceci à votre AppDelegate.swift :
func handleDeepLink(url: URL) {
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
if let sessionId = components?.queryItems?.first(where: { $0.name == "sessionId" })?.value {
MParticle.sharedInstance().rokt.setSessionId(sessionId: sessionId)
}
// Proceed with your confirmation flow
}
Configuration de l'ID de session sur AndroidLien direct vers Configuration de l'ID de session sur Android
Extrait l'ID de session du lien profond et transmettez-le au SDK+ avant d'appeler selectPlacements. Ajoutez ceci à votre MainActivity :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
intent.data?.getQueryParameter("sessionId")?.let { sessionId ->
MParticle.getInstance()?.Rokt()?.setSessionId(sessionId)
}
// Proceed with your confirmation flow
}
RemarquesLien direct vers Remarques
- Appelez
setSessionIdavantselectPlacementspour garantir que la session est utilisée. - Les chaînes vides sont ignorées et n'actualiseront pas la session.
- Encodez toujours l'ID de session en URL lorsque vous le passez en tant que paramètre de requête.
Appendice F : Configurer les paiements des publicités Shoppable (iOS uniquement)Lien direct vers Appendice F : Configurer les paiements des publicités Shoppable (iOS uniquement)
Si vous n'utilisez pas les publicités Shoppable, passez cette étape.
Les publicités Shoppable sur iOS nécessitent un RoktPaymentExtension (iOS natif) enregistré et prennent en charge plusieurs méthodes de paiement. L'enregistrement de l'extension est obligatoire pour chaque placement de publicités Shoppable, même si vous n'offrez que des méthodes basées sur la redirection. Les extraits d'enregistrement et de redirection se trouvent dans l'étape Afficher un Placement cible des publicités Shoppable (interstitiel).
| Méthode | Configuration iOS |
|---|---|
| Apple Pay | ID marchand Apple Pay passé en tant que applePayMerchantId sur RoktPaymentExtension. Optionnel. |
| PayPal | Intégré dans le Rokt SDK+ — aucune configuration d'extension supplémentaire. Nécessite la redirection de l'URL. |
| Afterpay / Clearpay | Schéma d'URL personnalisé dans Info.plist + correspondance urlScheme sur RoktPaymentExtension + redirection de l'URL. |
| Transfert de carte | API de partage de paiement partenaire + attributs partnerpaymentreference / last4digits sur selectShoppableAds. |
Apple Pay est optionnel — les publicités Shoppable prennent également en charge PayPal intégré et le transfert de carte sans ID marchand Apple Pay. Au moins un de applePayMerchantId ou urlScheme doit être fourni lors de la création de l'extension. Configurez stripePublishableKey dans vos paramètres du kit mParticle Rokt ; le kit le transfère automatiquement à Rokt.
Pour offrir Apple Pay, créez un ID marchand Apple Pay, configurez votre projet Xcode, et générez un certificat de traitement de paiement en suivant Apple Pay — configuration iOS, puis transmettez l'ID marchand en tant que applePayMerchantId.
8. Test Your Integration#
Pour confirmer que le SDK+ s'initialise et que les événements se connectent correctement :
1Enable verbose SDK+ logging#
Activez la journalisation détaillée du SDK+ avant l'initialisation pour voir ce qui est envoyé.
// Enable mParticle debug logging at the Dart level
MparticleFlutterSdk.setLogLevel(LogLevel.verbose);
2Build and run against a development environment#
Construisez et exécutez votre application avec l'environnement de développement configuré sur le côté natif :
- iOS :
environment = .development(Swift) ouMPEnvironmentDevelopment(Objective-C) - Android :
MParticle.Environment.Development - Web :
isDevelopmentMode: true
3Trigger selectPlacements#
Déclenchez selectPlacements sur l'écran où le placement doit s'afficher et confirmez que le placement se charge.
4Verify events#
Vérifiez que les événements sont enregistrés et que l'appel d'identification réussit.
- iOS : Vérifiez la console Xcode pour la sortie de journal du Rokt SDK+.
- Android : Vérifiez le Logcat d'Android Studio pour la sortie de journal du Rokt SDK+.
- Web : Ouvrez les outils de développement, allez à l'onglet Réseau, filtrez par
experiences, et confirmez qu'une requête/experiencesavec le statut 200 est envoyée.
DépannageLien direct vers Dépannage
Si le placement ne s'affiche pas ou si les événements n'apparaissent pas, vérifiez la console de débogage de votre plateforme pour les erreurs du SDK+ Rokt. Problèmes courants :
Erreurs d'initialisationLien direct vers Erreurs d'initialisation
- Confirmez que les
keyetsecret(iOS/Android) ouAPI_KEY(Web) correspondent aux valeurs de votre gestionnaire de compte Rokt. - Assurez-vous que l'initialisation du SDK+ natif s'exécute avant tout appel
selectPlacementsoulogEventdepuis votre code Dart. - Sur Android, assurez-vous que votre activité racine étend
FlutterFragmentActivity. - Pour les publicités Shoppable sur iOS, assurez-vous que
RoktPaymentExtensionest enregistré après l'initialisation du SDK+ et avantselectShoppableAds.
Erreurs d'identitéLien direct vers Erreurs d'identité
Si le gestionnaire onError de l'appel d'identification s'exécute, inspectez le IdentityAPIErrorResponse pour le code d'état et réessayez la requête selon votre logique métier. Sans gestion des erreurs, vous pourriez rencontrer des problèmes de cohérence des données à grande échelle.
Placement non renduLien direct vers Placement non rendu
- Assurez-vous que le placement
identifier(par exemple,RoktExperience) correspond à ce que votre gestionnaire de compte Rokt a configuré. - Pour les placements intégrés, assurez-vous que l'identifiant de la vue intégrée (par exemple,
RoktEmbedded1) correspond à la configuration de la mise en page. - Vérifiez que la carte des attributs contient au moins
email,firstname,lastname,billingzipcode, etconfirmationref.