Google 正在构建一个设备上的界面,该界面按垂直领域组织用户的应用,并为个性化应用内容使用和发现提供新的沉浸式体验。此全屏体验为开发者合作伙伴提供了一个机会,让他们可以在其应用之外的专用频道中展示他们最好的丰富内容。
本指南包含开发者合作伙伴将他们的购物内容集成到此新界面区域以及现有 Google 界面(如娱乐空间)的说明,使用 Engage SDK 来填充这两个界面。
集成细节
术语
此集成包括以下五种集群类型:推荐、精选、购物车、购物清单、重新订购和购物订单跟踪。
推荐集群显示来自单个开发者合作伙伴的个性化购物建议。这些建议可以根据用户进行个性化设置或进行概括(例如,趋势商品)。根据需要使用这些建议来显示产品、事件、促销、优惠券、订阅等。
您的推荐采用以下结构
推荐集群:包含来自同一开发者合作伙伴的一组推荐的 UI 视图。
ShoppingEntity:表示集群中单个商品的对象。
精选集群在单个 UI 分组中展示来自多个开发者合作伙伴的选定英雄
ShoppingEntity
。将有一个精选集群,它位于 UI 顶部附近,优先于所有推荐集群。每个开发者合作伙伴允许在精选集群中发布单个 ShoppingEntity。购物车集群在单个 UI 分组中显示来自多个开发者合作伙伴的购物车预览,提示用户完成未完成的购物车。将有一个购物车集群,它位于 UI 顶部附近,优先于所有推荐集群。每个开发者合作伙伴允许在购物车集群中广播最多 3 个
ShoppingCart
实例。您的购物车采用以下结构
购物车集群:包含来自多个开发者合作伙伴的购物车预览的 UI 视图。
购物车: 代表单个开发者合作伙伴的购物车预览的物件,将在购物车集群中显示。
ShoppingCart
必须显示购物车中商品的总数,还可以包括用户购物车中某些商品的图片。
购物清单 集群显示来自多个开发者合作伙伴的购物清单的快速预览,这些清单在一个 UI 分组中,提示用户返回相应的应用程序以更新和完成他们的清单。只有一个购物清单集群。
重新排序 集群显示来自多个开发者合作伙伴的上一个订单的快速预览,这些订单在一个 UI 分组中,提示用户重新排序。只有一个重新排序集群。
重新排序集群必须显示用户先前订单中的商品总数,并且必须还包括以下内容之一
- 用户先前订单中 X 个商品的图片。
- 用户先前订单中 X 个商品的标签。
购物订单跟踪 集群显示来自许多开发者合作伙伴的待处理或最近完成的购物订单的快速预览,在一个 UI 分组中,允许用户跟踪他们的订单。
只有一个 ShoppingOrderTracking 集群,它显示在 UI 的顶部附近,优先级高于所有推荐集群。每个开发者合作伙伴都可以在购物订单跟踪集群中广播多个 ShoppingOrderTrackingEntity 项目。
您的 ShoppingOrderTrackingCluster 采用以下结构
- 购物订单跟踪集群: 包含来自许多开发者合作伙伴的订单跟踪预览组的 UI 视图
- ShoppingOrderTrackingEntity: 代表单个开发者合作伙伴的购物订单跟踪预览的物件,将在购物订单跟踪集群中显示。 ShoppingOrderTrackingEntity 必须显示订单状态和订单时间。我们强烈建议为 ShoppingOrderTrackingEntity 填充预计送达时间,因为该时间将在提供时显示给用户。
预备工作
最低 API 等级: 19
将 com.google.android.engage:engage-core
库添加到您的应用程序
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'
}
有关更多信息,请参见 Android 11 中的软件包可见性。
总结
该设计基于对 绑定服务 的实现。
客户可以发布的数据受以下不同集群类型的限制
集群类型 | 集群限制 | 集群中的最大实体限制 |
---|---|---|
推荐集群 | 最多 5 个 | 最多 25 个 ShoppingEntity |
特色集群 | 最多 1 个 | 最多 1 个 ShoppingEntity |
购物车集群 | 最多 1 个 | 最多 3 个 ShoppingCart 多个购物车仅适用于每个商家都有单独购物车的应用程序。 |
购物清单集群 | 最多 1 个 | 最多 1 个 ShoppingListEntity |
购物重新排序集群 | 最多 1 个 | 最多 1 个 ReorderEntity |
购物订单跟踪集群 | 最多 3 个 | 最多 3 个 ShoppingOrderTrackingEntity |
步骤 1: 提供实体数据
SDK 已定义不同的实体来表示每个项目类型。以下实体受购物类别支持
ShoppingEntity
ShoppingCart
ShoppingList
Reorder
ShoppingOrderTracking
下面的图表概述了每种类型的可用属性和要求。
ShoppingEntity
ShoppingEntity
物件代表开发者合作伙伴想要发布的产品、促销、优惠、订阅或活动。
ShoppingEntity
属性 | 要求 | 描述 | 格式 |
---|---|---|---|
海报图片 | 必需 | 必须提供至少一张图片。 | 有关指南,请参见 图片规范。 |
操作 URI | 必需 |
应用程序中显示有关实体详细信息的页面的深层链接。 注意: 您可以使用深层链接进行归因。 请参阅此常见问题解答 |
URI |
标题 | 可选 | 实体的名称。 | 自由文本 推荐文本大小: 不超过 90 个字符(文本太长可能会显示省略号) |
价格 - 当前 | 有条件地需要 |
实体的当前价格。 如果提供了划线价格,则必须提供。 |
自由文本 |
价格 - 划线 | 可选 | 实体的原始价格,将在 UI 中划掉。 | 自由文本 |
呼叫 | 可选 | 如果可用,则呼叫以突出显示实体的促销、活动或更新。 | 自由文本 推荐文本大小: 不超过 45 个字符(文本太长可能会显示省略号) |
呼叫脚注 | 可选 | 呼叫的脚注文本。 | 自由文本 推荐文本大小: 不超过 45 个字符(文本太长可能会显示省略号) |
评级(可选) - 注意: 所有评级都使用我们的标准星级评级系统显示。 | |||
评级 - 最大值 | 可选 | 评级量表的最大值。 如果还提供了评级的当前值,则必须提供。 |
数字 >= 0.0 |
评级 - 当前值 | 可选 | 评级量表的当前值。 如果还提供了评级的最大值,则必须提供。 |
数字 >= 0.0 |
评级 - 计数 | 可选 |
实体评级的计数。 注意: 如果您的应用程序控制如何向用户显示计数,请提供此字段。使用简洁的字符串。例如,如果计数为 1,000,000,请考虑使用 1M 之类的缩写,以便计数不会在较小的显示尺寸上被截断。 |
字符串 |
评级 - 计数值 | 可选 | 实体评级的计数。 注意: 如果您自己不处理显示缩写逻辑,请提供此字段。如果 Count 和 Count Value 都存在,则向用户显示 Count。 |
长 |
DisplayTimeWindow(可选) - 设置内容在表面上显示的时间窗口 | |||
开始时间戳 | 可选 |
内容应在表面上显示后的纪元时间戳。 如果没有设置,内容有资格在表面上显示。 |
以毫秒为单位的纪元时间戳 |
结束时间戳 | 可选 |
内容不再在表面上显示后的纪元时间戳。 如果没有设置,内容有资格在表面上显示。 |
以毫秒为单位的纪元时间戳 |
ShoppingCart
属性 | 要求 | 描述 | 格式 |
---|---|---|---|
操作 URI | 必需 |
合作伙伴应用程序中购物车的深层链接。 注意: 您可以使用深层链接进行归因。 请参阅此常见问题解答 |
URI |
商品数量 | 必需 |
购物车中的商品数量(不仅仅是商品数量)。 例如: 如果购物车中有 3 件相同的衬衫和 1 顶帽子,则此数字应为 4。 |
整数 >= 1 |
操作文本 | 可选 |
购物车上按钮的号召性用语文本(例如,您的购物袋)。 如果开发人员没有提供操作文本,则查看购物车 是默认值。 此属性在版本 1.1.0 及更高版本中受支持。 |
字符串 |
标题 | 可选 | 购物车的标题(例如,您的购物袋)。 如果开发人员没有提供标题,则您的购物车 是默认值。 如果开发者合作伙伴为每个商家发布单独的购物车,请在标题中包含商家名称。 |
自由文本 推荐文本大小: 不超过 25 个字符(文本太长可能会显示省略号) |
购物车图片 | 可选 | 购物车中每个商品的图片。 最多可以提供 10 张图片,按优先级排序;实际显示的图片数量取决于设备的外形尺寸。 |
有关指南,请参见 图片规范。 |
项目标签 | 可选 | 购物清单中商品的标签列表。 实际显示的标签数量取决于设备的外形尺寸。 |
自由文本标签列表 推荐文本大小: 不超过 20 个字符(文本太长可能会显示省略号) |
最后一次用户交互时间戳 | 可选 | 从纪元开始经过的毫秒数,标识用户最后一次与购物车交互的时间。 这将由发布每个商家单独购物车的开发者合作伙伴作为输入传递,并且可能用于排名。 |
以毫秒为单位的纪元时间戳 |
DisplayTimeWindow(可选) - 设置内容在表面上显示的时间窗口 | |||
开始时间戳 | 可选 |
内容应在表面上显示后的纪元时间戳。 如果没有设置,内容有资格在表面上显示。 |
以毫秒为单位的纪元时间戳 |
结束时间戳 | 可选 |
内容不再在表面上显示后的纪元时间戳。 如果没有设置,内容有资格在表面上显示。 |
以毫秒为单位的纪元时间戳 |
ShoppingList
属性 | 要求 | 描述 | 格式 |
---|---|---|---|
操作 URI | 必需 |
合作伙伴应用程序中购物清单的深层链接。 注意: 您可以使用深层链接进行归因。 请参阅此常见问题解答 |
URI |
商品数量 | 必需 | 购物清单中的商品数量。 | 整数 >= 1 |
标题 | 可选 |
清单的标题(例如,您的杂货清单)。 如果开发人员没有提供标题,则购物清单 是默认值。 |
自由文本 推荐文本大小: 不超过 25 个字符(文本太长可能会显示省略号) |
项目标签 | 必需 | 购物清单中商品的标签列表。 必须提供至少 1 个标签,并且最多可以提供 10 个标签,按优先级排序;实际显示的标签数量取决于设备的外形尺寸。 |
自由文本标签列表 推荐文本大小: 不超过 20 个字符(文本太长可能会显示省略号) |
ShoppingReorderCluster
属性 | 要求 | 描述 | 格式 |
---|---|---|---|
操作 URI | 必需 |
合作伙伴应用程序中重新排序的深层链接。 注意: 您可以使用深层链接进行归因。 请参阅此常见问题解答 |
URI |
操作文本 | 可选 |
重新排序按钮的号召性用语文本(例如,再次订购)。 如果开发人员没有提供操作文本,则重新排序 是默认值。 此属性在版本 1.1.0 及更高版本中受支持。 |
字符串 |
商品数量 | 必需 |
先前订单中的商品数量(不仅仅是商品数量)。 例如: 如果先前订单中有 3 杯小咖啡和 1 个羊角面包,则此数字应为 4。 |
整数 >= 1 |
标题 | 必需 | 重新排序项目的标题。 | 自由文本 推荐文本大小: 不超过 40 个字符(文本太长可能会显示省略号) |
项目标签 | 可选 (如果未提供,则应提供海报图片) |
先前订单的项目标签列表。 最多可以提供 10 个标签,按优先级排序;实际显示的标签数量取决于设备的外形尺寸。 |
自由文本列表 推荐每个标签的文本大小: 不超过 20 个字符(文本太长可能会显示省略号) |
海报图片 | 可选 (如果未提供,则应提供项目标签) |
先前订单中商品的图片。 最多可以提供 10 张图片,按优先级排序;实际显示的图片数量取决于设备的外形尺寸。 |
有关指南,请参见 图片规范。 |
ShoppingOrderTrackingCluster
属性 | 要求 | 描述 | 格式 |
---|---|---|---|
标题 | 必需 |
正在跟踪的包裹/商品的简短标题或跟踪号。 |
自由文本 推荐文本大小: 50 个字符(文本太长会显示省略号) |
订单类型 | 必需 |
正在跟踪的包裹/商品的简短标题或跟踪号。 |
枚举: IN_STORE_PICKUP、SAME_DAY_DELIVERY、MULTI_DAY_DELIVERY |
状态 | 必需 |
订单的当前状态。 例如: “即将延迟”、 “正在运输”、 “延迟”、 “已发货”、 “已送达”、 “缺货”、 “订单已准备好” |
自由文本 推荐文本大小: 25 个字符(文本太长会显示省略号) |
订单时间 | 必需 |
以毫秒为单位的纪元时间戳,表示订单下达的时间。 如果不存在预计送达时间窗口,则将显示订单时间 |
以毫秒为单位的纪元时间戳 |
操作 URI | 必需 |
合作伙伴应用程序中订单跟踪的深层链接。 |
URI |
OrderDeliveryTimeWindow(可选) - 设置订单从下达订单时间到预计/实际送达时间的跟踪时间窗口。 | |||
OrderDeliveryTimeWindow - 开始时间 | 可选 |
以毫秒为单位的纪元时间戳,表示订单将送达或准备好取货的时间。 |
以毫秒为单位的纪元时间戳 |
OrderDeliveryTimeWindow - 结束时间 | 可选 |
以毫秒为单位的纪元时间戳,表示订单将送达或准备好取货的时间。 |
以毫秒为单位的纪元时间戳 |
海报图片 | 可选 | 订单中包含的某个项目/商品的图片。 推荐的纵横比为 1:1 |
有关指南,请参见 图片规范。 |
商品数量 | 可选 | 订单中的商品数量。 | 整数 >= 1 |
描述 | 可选 | 描述订单中商品的单段文本。 注意: 描述或副标题列表将显示给用户,而不是两者都显示。 |
自由文本 推荐文本大小: 180 个字符 |
副标题列表 | 可选 | 最多 3 个副标题,每个副标题都是一行文本。 注意: 描述或副标题列表将显示给用户,而不是两者都显示。 |
自由文本 推荐每个副标题的文本大小: 最多 50 个字符 |
订单价值 - 当前价格 | 可选 | 订单的当前价值。 | 自由文本 |
订单号 | 可选 | 可以用来唯一标识订单的订单号/ID。 |
自由文本 推荐文本大小: 最多 25 个字符 |
跟踪号 | 可选 | 订单/包裹送达的跟踪号,如果订单需要送达。 |
自由文本 推荐文本大小: 最多 25 个字符 |
图片规范
以下是图像资产的必要规格
长宽比 | 最小像素 | 推荐像素 |
---|---|---|
正方形 (1x1) 适用于非特色集群 |
300x300 | 1200x1200 |
横向 (1.91x1) 适用于特色集群 |
600x314 | 1200x628 |
纵向 (4x5) | 480x600 | 960x1200 |
文件格式
PNG、JPG、静态 GIF、WebP
最大文件大小
5120 KB
其他建议
- 图像安全区域:将重要内容放在图像中心 80% 的区域内。
- 使用透明背景,以便图像可以在深色和浅色主题设置中正常显示。
步骤 2:提供集群数据
建议在后台执行内容发布作业(例如,使用 WorkManager)并定期或按事件(例如,每次用户打开应用程序或用户将某些内容添加到购物车时)进行调度。
AppEngageShoppingClient
负责发布购物集群。
以下 API 用于在客户端发布集群
isServiceAvailable
publishRecommendationClusters
publishFeaturedCluster
publishShoppingCart
publishShoppingCarts
publishShoppingList
publishShoppingReorderCluster
publishShoppingOrderTrackingCluster
publishUserAccountManagementRequest
updatePublishStatus
deleteRecommendationsClusters
deleteFeaturedCluster
deleteShoppingCartCluster
deleteShoppingListCluster
deleteShoppingReorderCluster
deleteShoppingOrderTrackingCluster
deleteUserManagementCluster
deleteClusters
isServiceAvailable
此 API 用于检查服务是否可用于集成,以及内容是否可以在设备上呈现。
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
此 API 用于发布 RecommendationCluster
对象列表。
一个 RecommendationCluster
对象可以具有以下属性
属性 | 要求 | 描述 |
---|---|---|
ShoppingEntity 列表 | 必需 | 构成此推荐集群的推荐的 ShoppingEntity 对象列表。 |
标题 | 必需 | 推荐集群的标题。 推荐文本大小: 不超过 25 个字符(文本太长可能会显示省略号) |
副标题 | 可选 | 推荐集群的副标题。 |
操作 URI | 可选 |
指向合作伙伴应用程序中用户可以查看完整推荐列表的页面的深度链接。 注意: 您可以使用深层链接进行归因。 请参阅此常见问题解答 |
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());
当服务收到请求时,会在一个事务内执行以下操作
- 删除所有现有的推荐集群数据。
- 解析请求中的数据并将其存储在新的推荐集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
publishFeaturedCluster
此 API 用于发布一个 FeaturedCluster
对象。
Kotlin
client.publishFeaturedCluster( PublishFeaturedClusterRequest.Builder() .setFeaturedCluster( FeaturedCluster.Builder() ... .build()) .build())
Java
client.publishFeaturedCluster( new PublishFeaturedClusterRequest.Builder() .setFeaturedCluster( new FeaturedCluster.Builder() ... .build()) .build());
当服务收到请求时,会在一个事务内执行以下操作
- 删除开发人员合作伙伴的现有
FeaturedCluster
数据。 - 解析请求中的数据并将其存储在更新的特色集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
publishShoppingCart
此 API 用于发布一个 ShoppingCartCluster
对象。
Kotlin
client.publishShoppingCart( PublishShoppingCartRequest.Builder() .setShoppingCart( ShoppingCart.Builder() ... .build()) .build())
Java
client.publishShoppingCart( new PublishShoppingCartRequest.Builder() .setShoppingCart( new ShoppingCart.Builder() ... .build()) .build())
当服务收到请求时,会在一个事务内执行以下操作
- 删除开发人员合作伙伴的现有
ShoppingCart
数据。 - 解析请求中的数据并将其存储在更新的购物车集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
publishShoppingCarts
此 API 用于发布多个 ShoppingCart
对象。这适用于开发人员合作伙伴针对每个商家发布独立的购物车。使用此 API 时,请在标题中包含商家名称。
Kotlin
client.publishShoppingCarts( PublishShoppingCartClustersRequest.Builder() .addShoppingCart( ShoppingCart.Builder() ... .build()) .build())
Java
client.publishShoppingCarts( new PublishShoppingCartClustersRequest.Builder() .addShoppingCart( new ShoppingCart.Builder() ... .build()) .build())
当服务收到请求时,会在一个事务内执行以下操作
- 删除开发人员合作伙伴的现有
ShoppingCart
数据。 - 解析请求中的数据并将其存储在更新的购物车集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
publishShoppingList
此 API 用于发布一个 FoodShoppingList
对象。
Kotlin
client.publishFoodShoppingList( PublishFoodShoppingListRequest.Builder() .setFoodShoppingList( FoodShoppingListEntity.Builder() ... .build()) .build())
Java
client.publishFoodShoppingList( new PublishFoodShoppingListRequest.Builder() .setFoodShoppingList( new FoodShoppingListEntity.Builder() ... .build()) .build());
当服务收到请求时,会在一个事务内执行以下操作
- 删除开发人员合作伙伴的现有
FoodShoppingList
数据。 - 解析请求中的数据并将其存储在更新的购物清单集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
publishShoppingReorderCluster
此 API 用于发布一个 ShoppingReorderCluster
对象。
Kotlin
client.publishShoppingReorderCluster( PublishShoppingReorderClusterRequest.Builder() .setReorderCluster( ShoppingReorderCluster.Builder() ... .build()) .build())
Java
client.publishShoppingReorderCluster( new PublishShoppingReorderClusterRequest.Builder() .setReorderCluster( new ShoppingReorderCluster.Builder() ... .build()) .build());
当服务收到请求时,会在一个事务内执行以下操作
- 删除开发人员合作伙伴的现有
ShoppingReorderCluster
数据。 - 解析请求中的数据并将其存储在更新的重新排序集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
publishShoppingOrderTrackingCluster
此 API 用于发布一个 ShoppingOrderTrackingCluster
对象。
Kotlin
client.publishShoppingOrderTrackingCluster( PublishShoppingOrderTrackingClusterRequest.Builder() .setShoppingOrderTrackingCluster( ShoppingOrderTrackingCluster.Builder() ... .build()) .build())
Java
client.publishShoppingOrderTrackingCluster( new PublishShoppingOrderTrackingClusterRequest.Builder() .setShoppingOrderTrackingCluster( new ShoppingOrderTrackingCluster.Builder() ... .build()) .build());
当服务收到请求时,会在一个事务内执行以下操作
- 删除开发人员合作伙伴的现有
ShoppingOrderTrackingCluster
数据。 - 解析请求中的数据并将其存储在更新的购物订单跟踪集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
publishUserAccountManagementRequest
此 API 用于发布登录卡片。登录操作将用户引导至应用程序的登录页面,以便应用程序可以发布内容(或提供更多个性化的内容)。
以下元数据是登录卡片的一部分:
属性 | 要求 | 描述 |
---|---|---|
操作 URI | 必需 | 指向操作的深度链接(即导航至应用程序登录页面) |
图像 | 可选 - 如果未提供,则必须提供标题 |
卡片上显示的图像 16x9 长宽比图像,分辨率为 1264x712 |
标题 | 可选 - 如果未提供,则必须提供图像 | 卡片上的标题 |
操作文本 | 可选 | 卡片上显示的 CTA 中的文本(即登录) |
副标题 | 可选 | 可选的卡片上的副标题 |
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());
当服务收到请求时,会在一个事务内执行以下操作
- 删除开发人员合作伙伴的现有
UserAccountManagementCluster
数据。 - 解析请求中的数据并将其存储在更新的 UserAccountManagementCluster 集群中。
如果出现错误,整个请求将被拒绝,并且将保留现有状态。
updatePublishStatus
如果由于任何内部业务原因未发布任何集群,我们强烈建议使用updatePublishStatus API 更新发布状态。这很重要,因为
- 在所有情况下提供状态,即使在内容发布时(STATUS == PUBLISHED),对于填充使用此明确状态来传达集成健康状况和其他指标的仪表板至关重要。
- 如果未发布任何内容,但集成状态未中断(STATUS == NOT_PUBLISHED),则 Google 可以避免在应用程序健康状况仪表板中触发警报。这证实了内容未发布是由于提供者方面预期的情况造成的。
- 它有助于开发人员提供有关何时发布数据以及何时未发布数据的见解。
- Google 可能会使用状态代码来提示用户在应用程序中执行某些操作,以便他们可以查看应用程序内容或克服它。
符合条件的发布状态代码列表如下
// 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
如果由于用户未登录而未发布内容,则 Google 建议发布登录卡片。如果由于任何原因提供者无法发布登录卡片,则我们建议使用状态代码NOT_PUBLISHED_REQUIRES_SIGN_IN调用updatePublishStatus API。
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
此 API 用于删除推荐集群的内容。
Kotlin
client.deleteRecommendationClusters()
Java
client.deleteRecommendationClusters();
当服务收到请求时,它会从推荐集群中删除现有数据。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
deleteFeaturedCluster
此 API 用于删除特色集群的内容。
Kotlin
client.deleteFeaturedCluster()
Java
client.deleteFeaturedCluster();
当服务收到请求时,它会从特色集群中删除现有数据。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
deleteShoppingCartCluster
此 API 用于删除购物车集群的内容。
Kotlin
client.deleteShoppingCartCluster()
Java
client.deleteShoppingCartCluster();
当服务收到请求时,它会从购物车集群中删除现有数据。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
deleteShoppingListCluster
此 API 用于删除购物清单集群的内容。
Kotlin
client.deleteShoppingListCluster()
Java
client.deleteShoppingListCluster();
当服务收到请求时,它会从购物清单集群中删除现有数据。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
deleteShoppingReorderCluster
此 API 用于删除购物重新排序集群的内容。
Kotlin
client.deleteShoppingReorderCluster()
Java
client.deleteShoppingReorderCluster();
当服务收到请求时,它会从购物重新排序集群中删除现有数据。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
deleteShoppingOrderTrackingCluster
此 API 用于删除购物订单跟踪集群的内容。
Kotlin
client.deleteShoppingOrderTrackingCluster()
Java
client.deleteShoppingOrderTrackingCluster();
当服务收到请求时,它会从购物订单跟踪集群中删除现有数据。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
deleteUserManagementCluster
此 API 用于删除 UserAccountManagement 集群的内容。
Kotlin
client.deleteUserManagementCluster()
Java
client.deleteUserManagementCluster();
当服务收到请求时,它会从 UserAccountManagement 集群中删除现有数据。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
deleteClusters
此 API 用于删除给定集群类型的内容。
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());
当服务收到请求时,它会从与指定集群类型匹配的所有集群中删除现有数据。客户端可以选择传递一个或多个集群类型。如果出现错误,整个请求将被拒绝,并且将保留现有状态。
错误处理
强烈建议监听发布 API 的任务结果,以便可以采取后续操作来恢复并重新提交成功的任务。
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 } } } });
错误作为带有原因(作为错误代码包含在内)的 AppEngageException
返回。
错误代码 | 注意 |
---|---|
SERVICE_NOT_FOUND |
给定设备上没有此服务。 |
SERVICE_NOT_AVAILABLE |
给定设备上有此服务,但在调用时不可用(例如,已明确禁用)。 |
SERVICE_CALL_EXECUTION_FAILURE |
由于线程问题,任务执行失败。在这种情况下,可以重试。 |
SERVICE_CALL_PERMISSION_DENIED |
调用者无权进行服务调用。 |
SERVICE_CALL_INVALID_ARGUMENT |
请求包含无效数据(例如,超出允许的集群数量)。 |
SERVICE_CALL_INTERNAL |
服务端存在错误。 |
SERVICE_CALL_RESOURCE_EXHAUSTED |
服务调用过于频繁。 |
步骤 3:处理广播意图
除了通过作业进行内容发布 API 调用外,还需要设置一个 BroadcastReceiver
来接收内容发布请求。
广播意图的主要目的是重新激活应用程序并强制数据同步。广播意图并非旨在频繁发送。仅在 Engage 服务确定内容可能已过时(例如,一周前)时才会触发它。这样,即使应用程序长时间未执行,用户也可以更加确信拥有新鲜的内容体验。
必须通过以下两种方式设置 BroadcastReceiver
- 使用
Context.registerReceiver()
动态注册BroadcastReceiver
类的实例。这使仍然驻留在内存中的应用程序能够进行通信。
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)); }
- 在您的
AndroidManifest.xml
文件中使用<receiver>
标签静态声明实现。这允许应用程序在未运行时接收广播意图,并且还允许应用程序发布内容。
<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>
服务将发送以下 意图
com.google.android.engage.action.PUBLISH_RECOMMENDATION
建议在收到此意图时启动publishRecommendationClusters
调用。com.google.android.engage.action.PUBLISH_FEATURED
建议在收到此意图时启动publishFeaturedCluster
调用。com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART
建议在收到此意图时启动publishShoppingCart
调用。com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST
建议在收到此意图时启动publishShoppingList
调用。com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER
建议在收到此意图时启动publishReorderCluster
调用。com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER
建议在收到此意图时启动publishShoppingOrderTrackingCluster
调用。
集成工作流程
有关完成集成后验证集成的分步指南,请参见 Engage 开发人员集成工作流程。
常见问题解答
有关常见问题解答,请参见 Engage SDK 常见问题解答。
联系我们
如有任何问题,请在集成过程中联系 [email protected]。我们的团队会尽快回复。
下一步
完成此集成后,您的下一步操作如下
- 发送电子邮件至 [email protected] 并附加您已集成的 APK,以便 Google 进行测试。
- Google 会进行验证并进行内部审查,以确保集成按预期工作。如果需要更改,Google 会与您联系并提供必要的详细信息。
- 测试完成后,如果不需要更改,Google 会与您联系,通知您可以开始将更新的集成 APK 发布到 Play 商店。
- Google 确认您的更新的 APK 已发布到 Play 商店后,您的推荐、精选、购物车、购物清单、重新排序群集和购物订单跟踪群集可能会发布并对用户可见。