Engage SDK Shopping : instructions d'intégration technique tierce

Google est en train de développer une surface sur appareil, qui organisera les applications des utilisateurs par secteurs et offrira une nouvelle expérience immersive permettant une consommation et une découverte personnalisées du contenu de ces applications. Cette expérience plein écran donnera aux développeurs partenaires la possibilité de présenter leurs meilleurs contenus enrichis sur une chaîne dédiée en dehors de leur application.

Ce guide explique aux développeurs partenaires comment intégrer leur contenu d'achat à l'aide du SDK Engage dans le but de pouvoir renseigner cette nouvelle surface et les surfaces Google existantes comme Entertainment Space.

Détails de l'intégration

Terminologie

Cette intégration comprend les cinq types de clusters suivants: Recommendation (Recommandations), Featured (Sélection), Shopping Cart (Panier), Shopping List (Liste de courses), Reorder (Réorganiser) et Shopping Order Tracking (Suivi des commandes d'achat).

  • Les clusters Recommendation affichent des suggestions d'achat personnalisées d'un développeur partenaire individuel. Ces recommandations peuvent être personnalisées en fonction de l'utilisateur ou généralisées (par exemple, les articles tendance). Utilisez-les pour présenter des produits, des événements, des ventes, des promotions et des abonnements comme vous le souhaitez.

    Les recommandations présentent la structure suivante :

    • Cluster "Recommendations" : vue de l'interface utilisateur contenant un groupe de recommandations du même développeur partenaire.

    • ShoppingEntity : objet représentant un seul article dans un cluster.

  • Le cluster Featured affiche une sélection d'entités de plusieurs développeurs partenaires dans un même groupe d'UI. Il n'existe qu'un seul cluster "Featured", situé dans la partie supérieure de l'UI avec un emplacement prioritaire au-dessus de tous les clusters "Recommendation". Chaque développeur partenaire est autorisé à diffuser jusqu'à 10 entités dans le cluster "Featured".

  • Le cluster Shopping Cart donne un aperçu des paniers de plusieurs développeurs partenaires dans un seul regroupement d'interface utilisateur, invitant les utilisateurs à finaliser leur panier en attente. Il existe un seul cluster de panier, qui s'affiche dans la partie supérieure de l'interface utilisateur, avec un emplacement prioritaire au-dessus de tous les clusters "Recommendation". Chaque développeur partenaire est autorisé à diffuser jusqu'à trois instances ShoppingCart dans le cluster "Panier".

    Le panier présente la structure suivante :

    • Cluster "Shopping Cart" : vue d'interface utilisateur contenant un groupe d'aperçus de paniers d'achat provenant de nombreux développeurs partenaires.

    • ShoppingCart : objet représentant l'aperçu du panier pour un seul développeur partenaire, à afficher dans le cluster "Shopping Cart." L'objet ShoppingCart doit afficher le nombre total d'articles dans le panier et peut également inclure des images pour certains articles dans le panier de l'utilisateur.

  • Le cluster Shopping List offre un aperçu des listes de courses de plusieurs développeurs partenaires dans un seul regroupement d'interface utilisateur, invitant les utilisateurs à revenir à l'application correspondante pour mettre à jour et finaliser leurs listes. Il n'y a qu'un seul cluster "Shopping List".

  • Le cluster Reorder donne un aperçu des commandes précédentes de plusieurs développeurs partenaires dans un seul regroupement d'interface utilisateur, invitant les utilisateurs à renouveler leur commande. Il n'y a qu'un seul cluster "Reorder".

    • Il doit afficher le nombre total d'articles de la commande précédente de l'utilisateur et doit également inclure l'un des éléments suivants :

      • des images de X articles dans la commande précédente de l'utilisateur
      • des étiquettes pour X articles dans la commande précédente de l'utilisateur
  • Le cluster Suivi des commandes d'achat donne un aperçu des commandes en attente ou récemment terminées auprès de nombreux développeurs partenaires dans un seul regroupement d'interface utilisateur, ce qui permet aux utilisateurs de suivre leurs commandes.

    Il existe un seul cluster "ShoppingOrderTracking", situé dans la partie supérieure de l'UI, avec un emplacement prioritaire au-dessus de tous les clusters "Recommandations". Chaque développeur partenaire est autorisé à diffuser plusieurs articles ShoppingOrderTrackingEntity dans le cluster de suivi des commandes Shopping.

    • Votre ShoppingOrderTrackingCluster présente la structure suivante :

      • Cluster "ShoppingOrderTracking" : vue d'interface utilisateur contenant un groupe d'aperçus de suivi des commandes provenant de nombreux développeurs partenaires
      • ShoppingOrderTrackingEntity : objet représentant un aperçu du suivi des commandes pour un seul développeur partenaire, à afficher dans le cluster "Suivi des commandes". ShoppingOrderTrackingEntity doit afficher l'état de la commande et l'heure de la commande. Nous vous recommandons vivement d'indiquer le délai de livraison prévu pour ShoppingOrderTrackingEntity, car il est indiqué aux utilisateurs lorsqu'il est fourni.

Travail préalable

Niveau d'API minimal : 19

Ajoutez la bibliothèque com.google.android.engage:engage-core à votre application :

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.5.2'
}

Pour en savoir plus, consultez la page Visibilité des packages sous Android 11.

Résumé

La conception repose sur l'implémentation d'un service lié.

Les données qu'un client peut publier sont soumises aux limites suivantes pour chaque type de cluster :

Type de cluster Nombre limite de clusters Limites maximales d'entités dans un cluster
Cluster(s) "Recommendation" 5 maximum 25 ShoppingEntity maximum
Cluster "Featured" 1 maximum 10 ShoppingEntity maximum
Cluster "Shopping Cart" 1 maximum 3 ShoppingCart maximum

Plusieurs paniers ne sont attendus que pour les applications avec des paniers distincts par marchand.

Cluster "Shopping List" 1 maximum ShoppingListEntity maximum
Cluster "Shopping Reorder" 1 maximum ReorderEntity maximum
Cluster "Shopping Order Tracking" 3 maximum 3 ShoppingOrderTrackingEntity maximum

Étape 1 : Fournir les données d'entité

Le SDK a défini différentes entités pour représenter chaque type d'élément. Les entités suivantes sont prises en charge pour la catégorie "Achat" :

  1. ShoppingEntity
  2. ShoppingCart
  3. ShoppingList
  4. Reorder
  5. ShoppingOrderTracking

Les tableaux ci-dessous décrivent les attributs disponibles pour chaque type et indiquent s'ils sont obligatoires.

ShoppingEntity

L'objet ShoppingEntity représente un produit, une promotion, une offre, un abonnement ou un événement que les développeurs partenaires souhaitent publier.

ShoppingEntity
Attribut Obligatoire ? Description Format
Images poster Obligatoire Vous devez fournir au moins une image. Consultez la section Caractéristiques des images pour en savoir plus.
URI d'action Obligatoire

Lien profond vers la page de l'application affichant des informations sur l'entité.

Remarque : Vous pouvez utiliser des liens profonds pour l'attribution. Consultez ces questions fréquentes

URI
Titre Facultatif Nom de l'entité.

Texte libre

Taille de texte recommandée : 90 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Prix (actuel) Obligatoire sous certaines conditions

Prix actuel de l'entité.

À fournir si le prix barré est indiqué.

Texte libre
Prix (barré) Facultatif Prix d'origine de l'entité, qui sera barré dans l'UI. Texte libre
Accroche Facultatif Accroche qui met en avant une promotion, un événement ou une nouveauté pour l'entité, le cas échéant.

Texte libre

Taille de texte recommandée : 45 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Texte en petits caractères de l'accroche Facultatif Texte en petits caractères pour l'accroche.

Texte libre

Taille de texte recommandée : 45 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Note (facultatif) – Remarque : Toutes les notes sont affichées selon notre système d'évaluation standard.
Note (valeur maximale) Facultatif

Valeur maximale de l'échelle d'évaluation.

À fournir si la valeur de la note actuelle est également indiquée.

Nombre >= 0.0
Note (valeur actuelle) Facultatif

Valeur actuelle de l'échelle d'évaluation.

À fournir si la valeur maximale de la note est également indiquée.

Nombre >= 0.0
Nombre de notes Facultatif

Nombre de notes pour l'entité.

Remarque : Indiquez ce champ si votre application contrôle la façon dont le nombre est affiché aux utilisateurs. Utilisez une chaîne concise. Par exemple, si le nombre est de 1 000 000, envisagez d'utiliser une abréviation telle que 1 M afin que le nombre ne soit pas tronqué pour les tailles d'affichage plus petites.

Chaîne
Note (valeur de la valeur) Facultatif

Nombre de notes pour l'entité.

Remarque:Renseignez ce champ si vous ne gérez pas vous-même la logique d'abréviation d'affichage. Si les valeurs "Nombre" et "Valeur du nombre" sont présentes, "Nombre" est affichée pour les utilisateurs.

Longue
DisplayTimeWindow (facultatif) : définissez la période d'affichage d'un contenu sur une surface.
Code temporel de début Facultatif

Code temporel de l'epoch après lequel le contenu doit être affiché sur la surface.

Si ce code n'est pas configuré, le contenu peut s'afficher sur la surface.

Code temporel de l'epoch (en millisecondes)
Code temporel de fin Facultatif

Code temporel de l'epoch après lequel le contenu n'est plus affiché sur la surface.

Si ce code n'est pas configuré, le contenu peut s'afficher sur la surface.

Code temporel de l'epoch (en millisecondes)

ShoppingCart

Attribut Obligatoire ? Description Format
URI d'action Obligatoire

Lien profond vers le panier dans l'application du partenaire.

Remarque : Vous pouvez utiliser des liens profonds pour l'attribution. Consultez ces questions fréquentes.

URI
Nombre d'articles Obligatoire

Nombre d'articles dans le panier (et pas seulement le nombre de produits).

Par exemple, s'il y a trois chemises identiques et un chapeau dans le panier, ce nombre doit être égal à 4.

Entier >= 1
Texte de l'action Facultatif

Texte d'incitation à l'action du bouton du panier (par exemple, Votre panier).

Si aucun texte d'action n'est fourni par le développeur, Afficher le panier est la valeur par défaut.

Cet attribut est compatible avec les versions 1.1.0 et ultérieures.

Chaîne
Titre Facultatif

Titre du panier (par exemple, Votre panier).

Si aucun titre n'est fourni par le développeur, Your cart (Votre panier) est utilisé par défaut.

Si le développeur partenaire publie un panier distinct par marchand, veuillez inclure le nom du marchand dans le titre.

Texte libre

Taille de texte recommandée : 25 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Images du panier Facultatif

Images de chaque produit dans le panier.

Jusqu'à 10 images peuvent être fournies par ordre de priorité. Le nombre réel d'images affichées dépend du facteur de forme de l'appareil.

Consultez la section Caractéristiques des images pour en savoir plus.
Étiquette des articles Facultatif

Liste des étiquettes d'articles de la liste de courses.

Le nombre réel d'étiquettes affichées dépend du facteur de forme de l'appareil.

Liste d'étiquettes de texte libre

Taille de texte recommandée : 20 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Code temporel de la dernière interaction de l'utilisateur Facultatif Nombre de millisecondes écoulées depuis l'epoch, qui identifie la dernière fois où l'utilisateur a interagi avec le panier.

Ce paramètre sera transmis par les développeurs partenaires qui publient un panier distinct par marchand et pourra être utilisé pour le classement.

Code temporel de l'epoch (en millisecondes)
DisplayTimeWindow : définissez la période d'affichage d'un contenu sur une surface (facultatif).
Code temporel de début Facultatif

Code temporel de l'epoch après lequel le contenu doit être affiché sur la surface.

Si ce code n'est pas configuré, le contenu peut s'afficher sur la surface.

Code temporel de l'epoch (en millisecondes)
Code temporel de fin Facultatif

Code temporel de l'epoch après lequel le contenu n'est plus affiché sur la surface.

Si ce code n'est pas configuré, le contenu peut s'afficher sur la surface.

Code temporel de l'epoch (en millisecondes)

ShoppingList

Attribut Obligatoire ? Description Format
URI d'action Obligatoire

Lien profond vers la liste de courses dans l'application du partenaire.

Remarque : Vous pouvez utiliser des liens profonds pour l'attribution. Consultez ces questions fréquentes.

URI
Nombre d'articles Obligatoire Nombre d'articles dans la liste de courses. Entier >= 1
Titre Facultatif

Titre de la liste (par exemple, Votre liste de courses).

Si aucun titre n'est fourni par le développeur, Shopping list (Liste de courses) est utilisé par défaut.

Texte libre

Taille de texte recommandée : 25 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Étiquette des articles Obligatoire

Liste des étiquettes d'articles de la liste de courses.

Vous devez fournir au moins 1 étiquette et jusqu'à 10 étiquettes par ordre de priorité. Le nombre réel d'étiquettes affichées dépend du facteur de forme de l'appareil.

Liste d'étiquettes de texte libre

Taille de texte recommandée : 20 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

ShoppingReorderCluster

Attribut Obligatoire ? Description Format
URI d'action Obligatoire

Lien profond permettant de réorganiser les articles dans l'application du partenaire.

Remarque : Vous pouvez utiliser des liens profonds pour l'attribution. Consultez ces questions fréquentes

URI
Texte de l'action Facultatif

Texte d'incitation à l'action du bouton de réorganisation (par exemple, Commander à nouveau).

Si aucun texte d'incitation à l'action n'est fourni par le développeur, Réorganiser est la valeur par défaut.

Cet attribut est compatible avec les versions 1.1.0 et ultérieures.

Chaîne
Nombre d'articles Obligatoire

Nombre d'articles (pas seulement le nombre de produits) de la commande précédente.

Exemple : Si la commande précédente comprenait trois cafés simples et un croissant, ce nombre doit être égal à 4.

Entier >= 1
Titre Obligatoire Titre de l'article réorganisé.

Texte libre

Taille de texte recommandée : 40 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Étiquette des articles

Facultatif

(Si elles ne sont pas fournies, des images poster doivent l'être)

Liste des étiquettes d'articles de la commande précédente.

Vous pouvez fournir jusqu'à 10 étiquettes par ordre de priorité. Le nombre réel d'étiquettes affichées dépend du facteur de forme de l'appareil.

Liste de texte libre

Taille de texte recommandée par étiquette : 20 caractères maximum (si le texte est trop long, des points de suspension peuvent s'afficher)

Images poster

Facultatif

(Si ce n'est pas le cas, les étiquettes des articles doivent être fournies.)

Images des articles de la commande précédente.

Jusqu'à 10 images peuvent être fournies par ordre de priorité. Le nombre réel d'images affichées dépend du facteur de forme de l'appareil.

Consultez la section Caractéristiques des images pour en savoir plus.

ShoppingOrderTrackingCluster

Attribut Obligatoire ? Description Format
Titre Obligatoire

Titre court du ou des colis suivis, ou numéro de suivi.

Texte libre

Taille de texte recommandée: 50 caractères (si le texte est trop long, des points de suspension s'affichent)

Type de commande Obligatoire

Titre court du colis/des articles suivis ou numéro de suivi.

Énumération : IN_STORE_PICKUP, SAME_DAY_DELIVERY, MULTI_DAY_DELIVERY

État Obligatoire

État actuel de la commande.

Exemples: "En retard", "En transit", "Retardé", "Expédié", "Livré", "En rupture de stock", "Commande prête"

Texte libre

Taille de texte recommandée: 25 caractères (si le texte est trop long, des points de suspension s'affichent)

Heure de la commande Obligatoire

Code temporel de l'epoch (en millisecondes) au moment de la commande.

Si l'heure de livraison prévue n'est pas indiquée, le délai de commande s'affichera.

Code temporel de l'epoch (en millisecondes)
URI d'action Obligatoire

Lien profond vers le suivi des commandes dans l'application du partenaire.

URI
OrderDeliveryTimeWindow (facultatif) : définissez une période pour la commande suivie depuis le moment où elle a été passée jusqu'au moment de la livraison prévue/effective.
OrderDeliveryTimeWindow - Start Time Facultatif

Code temporel de l'epoch, en millisecondes, à partir duquel la commande sera livrée ou prête à être retirée.

Code temporel de l'epoch (en millisecondes)
OrderDeliveryTimeWindow - End Time Facultatif

Code temporel de l'epoch, en millisecondes, avant lequel la commande sera livrée ou prête à être retirée.

Code temporel de l'epoch (en millisecondes)
Images poster Facultatif

Image d'un article/produit faisant partie de la commande.

Le format recommandé est de 1:1.

Consultez la section Caractéristiques des images pour en savoir plus.
Nombre d'articles Facultatif Nombre d'articles dans la commande. Entier >= 1
Description Facultatif

Paragraphe de texte unique pour décrire les articles de la commande.

Remarque : L'utilisateur ne verra que la description ou la liste des sous-titres, et non les deux.

Texte libre

Taille de texte recommandée : 180 caractères

Liste des sous-titres Facultatif

Jusqu'à trois sous-titres, chacun ne comportant qu'une seule ligne de texte.

Remarque : L'utilisateur ne verra que la description ou la liste des sous-titres, et non les deux.

Texte libre

Taille de texte recommandée pour chaque sous-titre: 50 caractères maximum

Valeur de la commande - CurrentPrice Facultatif Valeur actuelle de la commande. Texte libre
Numéro de commande Facultatif Numéro/ID de commande permettant d'identifier de manière unique la commande.

Texte libre

Taille de texte recommandée : 25 caractères maximum

Numéro de suivi Facultatif Numéro de suivi de la commande/livraison de colis au cas où la commande nécessite une livraison.

Texte libre

Taille de texte recommandée : 25 caractères maximum

Caractéristiques des images

Vous trouverez ci-dessous les spécifications requises pour les composants Image :

Format Nombre minimal de pixels Nombre de pixels recommandé

Carré (1x1)

Préféré pour les clusters non sélectionnés

300 x 300 1 200 x 1 200

Paysage (1,91 x 1)

Préféré pour les clusters sélectionnés

600 x 314 1 200 x 628
Format portrait (4 x 5) 480 x 600 960 x 1200

Formats des fichiers

PNG, JPG, GIF statique, WebP

Taille maximale des fichiers

5 120 Ko

Autres recommandations

  • Zone de sécurité de l'image : placez le contenu important dans les 80 % les plus au centre de l'image.
  • Utilisez un arrière-plan transparent pour que l'image s'affiche correctement avec les paramètres du thème sombre et clair.

Étape 2 : Fournir les données de cluster

Il est recommandé d'exécuter la tâche de publication de contenu en arrière-plan (par exemple, à l'aide de WorkManager) et de la programmer régulièrement ou sur la base d'un événement précis (par exemple, chaque fois que l'utilisateur ouvre l'application ou lorsqu'il vient d'ajouter quelque chose à son panier).

AppEngageShoppingClient est responsable de la publication des clusters "Achat".

Les API suivantes sont exposées afin de publier des clusters dans le client :

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishShoppingCart
  • publishShoppingCarts
  • publishShoppingList
  • publishShoppingReorderCluster
  • publishShoppingOrderTrackingCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteShoppingCartCluster
  • deleteShoppingListCluster
  • deleteShoppingReorderCluster
  • deleteShoppingOrderTrackingCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

Cette API permet de vérifier si le service est disponible pour l'intégration et de déterminer si le contenu peut être présenté sur l'appareil.

Kotlin

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Java

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content
          // publish calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

Cette API permet de publier une liste d'objets RecommendationCluster.

Un objet RecommendationCluster peut avoir les attributs suivants :

Attribut Obligatoire ? Description
Liste des entités ShoppingEntity Obligatoire Liste des objets ShoppingEntity qui constituent les recommandations de ce cluster "Recommendations".
Titre Obligatoire

Titre du cluster "Recommendations".

Taille de texte recommandée : 25 caractères maximum (si le texte est trop long, des points de suspension s'affichent)

Sous-titre Facultatif Sous-titre du cluster "Recommandations".
URI d'action Facultatif

Lien profond vers la page de l'application partenaire où les utilisateurs peuvent voir la liste complète des recommandations.

Remarque : Vous pouvez utiliser des liens profonds pour l'attribution. Consultez ces questions fréquentes.

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Black Friday Deals")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Black Friday Deals")
                        .build())
                .build());

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Toutes les données existantes du cluster "Recommendation" sont supprimées.
  • Les données de la requête sont analysées et stockées dans de nouveaux clusters "Recommendation".

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

publishFeaturedCluster

Cette API permet de publier un objet FeaturedCluster.

Kotlin

client.publishFeaturedCluster(
            PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    FeaturedCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFeaturedCluster(
            new PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    new FeaturedCluster.Builder()
                        ...
                        .build())
                .build());

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Les données FeaturedCluster existantes du développeur partenaire sont supprimées.
  • Les données de la requête sont analysées et stockées dans le cluster "Featured" mis à jour.

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

publishShoppingCart

Cette API permet de publier un objet ShoppingCartCluster.

Kotlin

client.publishShoppingCart(
            PublishShoppingCartRequest.Builder()
                .setShoppingCart(
                    ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingCart(
            new PublishShoppingCartRequest.Builder()
                .setShoppingCart(
                    new ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Les données ShoppingCart existantes du développeur partenaire sont supprimées.
  • Les données de la requête sont analysées et stockées dans le cluster "Shopping Cart" mis à jour.

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

publishShoppingCarts

Cette API permet de publier plusieurs objets ShoppingCart. Cela s'applique aux développeurs partenaires qui publient des paniers distincts par marchand. Incluez le nom du marchand dans le titre lorsque vous utilisez cette API.

Kotlin

client.publishShoppingCarts(
            PublishShoppingCartClustersRequest.Builder()
                .addShoppingCart(
                    ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingCarts(
            new PublishShoppingCartClustersRequest.Builder()
                .addShoppingCart(
                    new ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Les données ShoppingCart existantes du développeur partenaire sont supprimées.
  • Les données de la requête sont analysées et stockées dans le cluster "Shopping Cart" mis à jour.

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

publishShoppingList

Cette API permet de publier un objet FoodShoppingList.

Kotlin

client.publishFoodShoppingList(
            PublishFoodShoppingListRequest.Builder()
                .setFoodShoppingList(
                    FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFoodShoppingList(
            new PublishFoodShoppingListRequest.Builder()
                .setFoodShoppingList(
                    new FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build());

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Les données FoodShoppingList existantes du développeur partenaire sont supprimées.
  • Les données de la requête sont analysées et stockées dans le cluster "Shopping List" mis à jour.

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

publishShoppingReorderCluster

Cette API permet de publier un objet ShoppingReorderCluster.

Kotlin

client.publishShoppingReorderCluster(
            PublishShoppingReorderClusterRequest.Builder()
                .setReorderCluster(
                    ShoppingReorderCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingReorderCluster(
            new PublishShoppingReorderClusterRequest.Builder()
                .setReorderCluster(
                    new ShoppingReorderCluster.Builder()
                        ...
                        .build())
                .build());

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Les données ShoppingReorderCluster existantes du développeur partenaire sont supprimées.
  • Les données de la requête sont analysées et stockées dans le cluster "Reorder" mis à jour.

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

publishShoppingOrderTrackingCluster

Cette API permet de publier un objet ShoppingOrderTrackingCluster.

Kotlin

client.publishShoppingOrderTrackingCluster(
            PublishShoppingOrderTrackingClusterRequest.Builder()
                .setShoppingOrderTrackingCluster(
                    ShoppingOrderTrackingCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingOrderTrackingCluster(
            new PublishShoppingOrderTrackingClusterRequest.Builder()
                .setShoppingOrderTrackingCluster(
                    new ShoppingOrderTrackingCluster.Builder()
                        ...
                        .build())
                .build());

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Les données ShoppingOrderTrackingCluster existantes du développeur partenaire sont supprimées.
  • Les données de la requête sont analysées et stockées dans le cluster "Shopping Order Tracking" mis à jour.

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

publishUserAccountManagementRequest

Cette API permet de publier une fiche de connexion. L'action de connexion redirige les utilisateurs vers la page de connexion de l'application afin que celle-ci puisse publier du contenu (ou fournir un contenu plus personnalisé).

Les métadonnées suivantes font partie de la fiche de connexion :

Attribut Obligatoire ? Description
URI d'action Obligatoire Lien profond vers l'action (par exemple, accès à la page de connexion de l'application)
Image Facultatif : si aucun titre n'est fourni, vous devez en fournir un

Image affichée sur la fiche

Images au format 16:9 avec une résolution de 1 264 x 712

Titre Facultatif : si aucune image n'est fournie, vous devez en fournir une Titre sur la fiche
Texte de l'action Facultatif Texte affiché sur l'incitation à l'action (par exemple, "Se connecter")
Sous-titre Facultatif Sous-titre facultatif sur la fiche

Kotlin

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Java

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Lorsque le service reçoit la requête, les actions suivantes ont lieu dans une seule transaction :

  • Les données UserAccountManagementCluster existantes du développeur partenaire sont supprimées.
  • Les données de la requête sont analysées et stockées dans le cluster "UserAccountManagementCluster" mis à jour.

En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

updatePublishStatus

Si, pour une raison opérationnelle interne, aucun des clusters n'est publié, nous vous recommandons vivement de mettre à jour l'état de publication à l'aide de l'API updatePublishStatus. Ce point est important pour les raisons suivantes :

  • Il est essentiel d'indiquer l'état dans tous les scénarios, même lorsque le contenu est publié (STATUS == PUBLISHED) pour renseigner les tableaux de bord qui utilisent cet état explicite afin de transmettre l'état et d'autres métriques de votre intégration.
  • Si aucun contenu n'est publié, mais que l'état de l'intégration fonctionne correctement (STATUS == NOT_PUBLISHED), Google peut éviter de déclencher des alertes dans les tableaux de bord concernant l'état de l'application. Cela confirme que le contenu n'est pas publié en raison d'une situation attendue du point de vue du fournisseur.
  • Cela permet aux développeurs de fournir des informations concernant la date de publication des données.
  • Google peut utiliser les codes d'état pour encourager l'utilisateur à effectuer certaines actions dans l'application, afin qu'il puisse afficher ou contourner le contenu de l'application.

Voici la liste des codes d'état de publication éligibles :

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

Si le contenu n'est pas publié parce que l'utilisateur n'est pas connecté, Google vous recommande de publier la fiche de connexion. Si, pour une raison quelconque, les fournisseurs ne peuvent pas publier la fiche de connexion, nous vous recommandons d'appeler l'API updatePublishStatus avec le code d'état NOT_PUBLISHED_REQUIRES_SIGN_IN.

Kotlin

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationClusters

Cette API permet de supprimer le contenu des clusters "Recommendation".

Kotlin

client.deleteRecommendationClusters()

Java

client.deleteRecommendationClusters();

Lorsque le service reçoit la requête, il supprime les données existantes des clusters "Recommendation". En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

deleteFeaturedCluster

Cette API permet de supprimer le contenu du cluster "Featured".

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

Lorsque le service reçoit la requête, il supprime les données existantes du cluster "Featured". En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

deleteShoppingCartCluster

Cette API permet de supprimer le contenu du cluster "Shopping Cart".

Kotlin

client.deleteShoppingCartCluster()

Java

client.deleteShoppingCartCluster();

Lorsque le service reçoit la requête, il supprime les données existantes du cluster "Shopping Cart". En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

deleteShoppingListCluster

Cette API permet de supprimer le contenu du cluster "Shopping List".

Kotlin

client.deleteShoppingListCluster()

Java

client.deleteShoppingListCluster();

Lorsque le service reçoit la requête, il supprime les données existantes du cluster "Shopping List". En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

deleteShoppingReorderCluster

Cette API permet de supprimer le contenu du cluster "Shopping Reorder".

Kotlin

client.deleteShoppingReorderCluster()

Java

client.deleteShoppingReorderCluster();

Lorsque le service reçoit la requête, il supprime les données existantes du cluster "Shopping Reorder". En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

deleteShoppingOrderTrackingCluster

Cette API permet de supprimer le contenu du cluster "Shopping Order Tracking".

Kotlin

client.deleteShoppingOrderTrackingCluster()

Java

client.deleteShoppingOrderTrackingCluster();

Lorsque le service reçoit la requête, il supprime les données existantes du cluster "Shopping Order Tracking". En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

deleteUserManagementCluster

Cette API permet de supprimer le contenu du cluster "UserAccountManagement".

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

Lorsque le service reçoit la requête, il supprime les données existantes du cluster "UserAccountManagement". En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

deleteClusters

Cette API permet de supprimer le contenu d'un type de cluster donné.

Kotlin

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      ...
      .build())

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                ...
                .build());

Lorsque le service reçoit la requête, il supprime les données existantes de tous les clusters correspondant aux types de clusters spécifiés. Les clients peuvent choisir de transmettre un ou plusieurs types de clusters. En cas d'erreur, la requête entière est rejetée, et l'état existant est maintenu.

Gestion des exceptions

Il est fortement recommandé d'écouter le résultat de la tâche à partir des API de publication afin qu'une action de suivi puisse être effectuée pour récupérer et renvoyer une tâche réussie.

Kotlin

client.publishRecommendationClusters(
        PublishRecommendationClustersRequest.Builder()
          .addRecommendationCluster(..)
          .build())
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          // do something
        } else {
          val exception = task.exception
          if (exception is AppEngageException) {
            @AppEngageErrorCode val errorCode = exception.errorCode
            if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
              // do something
            }
          }
        }
      }

Java

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

L'erreur est renvoyée au format AppEngageException. La cause est incluse sous la forme d'un code d'erreur.

Code d'erreur Nom de l'erreur Remarque
1 SERVICE_NOT_FOUND Le service n'est pas disponible sur l'appareil donné.
2 SERVICE_NOT_AVAILABLE Le service est disponible sur l'appareil donné, mais pas au moment de l'appel (par exemple, il est explicitement désactivé).
3 SERVICE_CALL_EXECUTION_FAILURE L'exécution de la tâche a échoué en raison de problèmes de thread. Dans ce cas, vous pouvez réessayer.
4 SERVICE_CALL_PERMISSION_DENIED L'appelant n'est pas autorisé à effectuer l'appel du service.
5 SERVICE_CALL_INVALID_ARGUMENT La requête contient des données non valides (par exemple, un nombre plus élevé que le nombre de clusters autorisé).
6 SERVICE_CALL_INTERNAL Une erreur s'est produite au niveau du service.
7 SERVICE_CALL_RESOURCE_EXHAUSTED L'appel du service est effectué trop fréquemment.

Étape 3 : Gérer les intents de diffusion

En plus d'effectuer des appels d'API de publication de contenu via une tâche, vous devez également configurer un objet BroadcastReceiver pour recevoir la requête de publication de contenu.

L'objectif des intents de diffusion est principalement de réactiver des applications et de forcer la synchronisation des données. Les intents de diffusion ne sont pas conçus pour être envoyés très fréquemment. Ils ne se déclenchent que lorsque le service Engage détermine que le contenu est peut-être obsolète (par exemple, s'il date d'il y a une semaine). De cette façon, l'utilisateur a plus de chances de bénéficier d'une expérience de contenu actualisée, même si l'application n'a pas été exécutée pendant une longue période.

Le BroadcastReceiver doit être configuré de deux manières :

  • Enregistrez dynamiquement une instance de la classe BroadcastReceiver à l'aide de Context.registerReceiver(). Cela permet la communication à partir d'applications restées actives en mémoire.

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
  // broadcast is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is
  // received
  // Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast
  // is received
  // Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast
  // is received
  // Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
  // received
  // Trigger shopping order tracking cluster publish when
  // PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER broadcast is received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION))

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED))

// Register Shopping Cart Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_CART))

// Register Shopping List Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_LIST))

// Register Reorder Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_REORDER_CLUSTER))

// Register Shopping Order Tracking Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER))
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast is
// received

// Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER
// broadcast is received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION));

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));

// Register Shopping Cart Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_CART));

// Register Shopping List Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_LIST));

// Register Reorder Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER));

// Register Shopping Order Tracking Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER));

}
  • Déclarez une implémentation de manière statique avec la balise <receiver> dans le fichier AndroidManifest.xml. Cela permet à l'application de recevoir des intents de diffusion lorsqu'elle n'est pas en cours d'exécution, et de publier le contenu.
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER" />
      </intent-filter>
   </receiver>
</application>

Les intents suivants sont envoyés par le service :

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION Nous vous recommandons de démarrer un appel publishRecommendationClusters lors de la réception de cet intent.
  • com.google.android.engage.action.PUBLISH_FEATURED Nous vous recommandons de démarrer un appel publishFeaturedCluster lors de la réception de cet intent.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART Nous vous recommandons de démarrer un appel publishShoppingCart lors de la réception de cet intent.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST Nous vous recommandons de démarrer un appel publishShoppingList lors de la réception de cet intent.
  • com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER Nous vous recommandons de démarrer un appel publishReorderCluster lors de la réception de cet intent.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER Nous vous recommandons de démarrer un appel publishShoppingOrderTrackingCluster lors de la réception de cet intent.

Workflow d'intégration

Pour vous procurer un guide par étapes sur la validation de votre intégration une fois celle-ci terminée, consultez la page Workflow d'intégration pour les développeurs d'Engage.

Questions fréquentes

Pour en savoir plus, consultez les questions fréquentes concernant le SDK Engage.

Contact

Contactez engage-developers@google.com si vous avez des questions au cours du processus d'intégration. Notre équipe vous répondra dès que possible.

Étapes suivantes

Une fois cette intégration effectuée, procédez comme suit :

  • Envoyez un e-mail à l'adresse engage-developers@google.com et joignez-y votre APK intégré prêt à être testé par Google.
  • Google effectue une vérification et des examens en interne pour s'assurer que l'intégration fonctionne comme prévu. Si des modifications sont nécessaires, nous vous contacterons avec toutes les informations nécessaires.
  • Une fois les tests terminés, si aucune modification n'est nécessaire, nous vous informerons que vous pouvez commencer à publier le fichier APK mis à jour et intégré sur le Play Store.
  • Une fois que nous aurons confirmé la publication de votre APK mis à jour sur le Play Store, vos clusters Recommendation (Recommandations), Featured (Sélection), Shopping Cart (Panier), Shopping List (Liste de courses), Reorder Cluster (Cluster de réorganisation) et Shopping Order Tracking Cluster (Cluster de suivi des commandes) pourront être publiés et visibles par les utilisateurs.