创建自定义商店布局

借助 Google Play 企业版,您可以为企业设计和创建商店布局 客户。您可以将应用分组为多个集群,从而自定义商店布局。 设置商店页面,以及添加快捷链接 。

Google Play 企业版中向最终用户提供的所有应用 必须先由 IT 管理员批准,为用户批准,然后添加到 集群。(如需了解详情,请参阅将应用添加到商店布局中 过程)。

商店布局的元素

商店布局通常由向用户显示的一系列页面组成, Google Play 企业版。每个网页可以包含一个或多个应用组,这些应用称为 以集群的形式运行每个集群包含一个或多个应用。

借助集群,您可以对相关应用进行分组。例如,您可以为 包含Essentials 集群和入门指南 完成集群。Essentials 集群可以包含记事本+、 Google 幻灯片等。“完成任务”集群可能包含应用 例如 OneNote、Wunderlist、Any.do 以及 Google 的其他跟踪、日历和 会议规划应用(参见图 1)。

创建页面时,您还可以在页面的顶部添加最多 10 个快速链接 页面。快捷链接可让用户跳转到其他页面。例如,图 1 显示了 “公司”“通讯”和“财务”页面的快捷链接。

图 1 显示了商店布局在设备上所示的一些关键元素:

<ph type="x-smartling-placeholder">
</ph> 用户设备的示例屏幕,显示了商店的各个元素
    包括快速链接、页面和应用集群。
图 1 - 用户设备的示例屏幕
  • 快速链接:可提供对其他网页的访问权限的可选链接。快速 链接会采用它们所指向的网页的名称。
  • 页面:由一系列应用组成的已命名且可垂直滚动的页面。
  • 集群(也称为“集合”):可水平滚动的已命名 轮播界面如果页面包含单个集群(或者 点击“更多”使之可垂直滚动)。

商店布局元素的限制

在为客户设计和实施商店布局时,请保留这些 请谨记以下限制(其中大多数限制是基于良好界面设计的原则):

  • 每个集群 100 个应用
  • 每页 30 个集群
  • 每页 10 个快捷链接
  • 每家商店 100 页
  • 每个企业 1,000 款产品(已批准的应用)

本地化的页面和集群名称

Google Play 企业版商店布局支持为商店页面提供本地化名称 和存储集群在创建网页或集群时 受支持的语言区域(例如 IETF 语言标记)和关联的本地化名称。 如果用户的语言区域不在支持列表中,系统会选择距离其最近的那个语言区域 有匹配项。例如,如果没有 en-GB,系统会选择 en-US 。如果没有近似匹配,系统会选择 列表。

将应用添加到商店布局中

如果符合以下条件,系统会自动添加 policy.productPolicy 中的所有应用: 使用的是基本商店布局。如果企业使用的是自定义 商店布局,应用仅出现在自定义布局和 productPolicy 列表中 将会显示在设备上“policy.productPolicy”中存在的所有项都是 可在 Play 商店中搜索到

最终用户如要从 Google Play 企业版商店安装应用, 必须与用户的设备兼容并满足以下条件:

  • 已添加到用户的许可名单(使用设备上的 policy.productPolicy) 资源)且 policy.productAvailabilityPolicy 设置为 WHITELIST, OR policy.productAvailabilityPolicy 设置为 ALL(允许搜索 和安装任何应用)。

用户可以使用 Google Play 企业版内置的搜索功能来查找和 安装符合这些条件的任何应用。不过,只有 或者如果您已将该应用添加到

已批准被撤消的应用

管理员可以随时取消批准应用程序(撤消批准)。与以下应用相关的应用: 已撤消的批准状态仍可添加到集群和用户许可名单 用户将无法看到这些应用,也无法通过受管理的 Google Play 商店。如果被撤消批准的应用重新获得批准,系统就会将该应用 在 Google Play 企业版商店中再次向用户提供。

基本商店布局

默认情况下,系统会为您的每个客户启用基本商店布局。通过 基本布局有 1 个页面和 1 个集群,最多显示 1000 个应用。已开启应用 该页面按 product ID 值进行排序。如果您创建自定义 商店布局(通过设置 storeLayoutType ="custom"),则基本的商店布局是 已停用。

创建自定义商店布局

EMM 可以为每个企业客户创建自定义商店布局。 借助自定义商店布局,您可以设置应用集合、将特定集群添加到 网页,并指定快捷链接。因为您只需定义构成每个渠道的应用 您可以使用集群将相关应用(例如“Essentials”) 和“完成任务”)。用户只能看到具有以下权限的应用: 已由 IT 管理员接受

Google Play EMM API 参考文档中提供了 与用于创建自定义商店布局的关联方法,特别是 StorelayoutpagesStorelayoutclusters。下文中概述的步骤 以下部分将向您介绍一个基本示例。

编程任务

要为您的客户创建自定义 Google Play 企业版商店布局,请执行以下操作: 必须:

  1. 创建 Google+ 信息页
  2. 在页面内创建一个或多个集群
  3. 设置主页

您必须为每一项至少创建一个集群 商店布局,并且该集群必须包含至少一个应用。您还必须设置 首页如果您创建多个网页,可以选择快速设置 在每个页面顶部显示的链接。

创建自定义 Play 企业版商店布局的编程任务包括 下文提供了商店布局的完整示例

创建 Google+ 信息页

一个页面包含一个或多个集群。每个集群至少包含一个应用。 页面是为特定企业创建的,因此您必须调用对 特定企业实例 (enterpriseId)。你可以提供一个方便易用的 每个网页的名称和本地化信息,以及一系列 pageId 以及用户能通过网页到达的网址数量新页面是使用 insert 创建的 操作 (Storelayoutpages.insert),如下所示:

public StorePage createPage(String enterpriseId, String name)
    throws IOException {
  List<LocalizedText> names =
      ImmutableList.of(
          new LocalizedText().setLocale("en").setText(name));
  StorePage storePage = new StorePage();
  storePage.setName(names);
  return androidEnterprise.storelayoutpages()
    .insert(enterpriseId, storePage)
    .execute();
}

创建集群

集群包含应用组。先创建集群,然后才能 添加到页面中。如需创建集群,请调用以下内容的 insert 操作: Storelayoutclusters 并传递以下属性的值:

  • 集群应包含的 productId 列表(例如, Gmail 的productIdapp:com.google.android.gm
  • 简单易懂的集群名称,例如 Get Things 完成
  • 应与集群关联的 enterpriseId
  • pageId(针对应包含该集群的页面)
  • 集群在页面上的展示位置(第一个、第二个,以此类推)

示例如下:

private String insertCluster(String enterpriseId, String pageId, String name,
    List<String> productIds, String orderInPage) throws IOException {
  StoreCluster storeCluster = new StoreCluster();
  storeCluster.setName(
      ImmutableList.of(
          new LocalizedText().setLocale("en").setText(name)));
  storeCluster.setProductId(productIds);
  storeCluster.setOrderInPage(orderInPage);
  return androidEnterprise.storelayoutclusters()
    .insert(enterpriseId, pageId, storeCluster)
    .execute()
    .getId();
}

设置主页

用户设备上的 Google Play 企业版中显示的第一个页面是 首页作为 EMM,您需要为每位客户定义首页。通过 页面始终可见(即使页面为空),且无法删除。

在此示例中,系统会为指定的 enterpriseId:

public StoreLayout getStoreLayout(String enterpriseId) throws IOException {
  return androidEnterprise
    .enterprises()
    .getStoreLayout(enterpriseId)
    .execute();
}

下一个示例通过提供 客户的enterpriseId和该客户的pageId 主页:

public StoreLayout setStoreLayout(String enterpriseId, String homepageId)
    throws IOException {
  StoreLayout storeLayout = new StoreLayout();
  storeLayout.setHomepageId(homepageId);

  return androidEnterprise
    .enterprises()
    .setStoreLayout(enterpriseId, storeLayout)
    .execute();
}

快速链接显示在每个页面的顶部,让用户能够轻松进行导航 。要使用快速链接,请先获取pageId 页面(由 insert 返回)并添加指向该页面的链接。例如,如果您 创建三个 pageIdp1p2p3 的网页,您可以添加快捷链接 从第一个网页复制到其他两个网页,其代码如下所示:

StorePage storePage = new StorePage();
storePage.setName(
    ImmutableList.of(new LocalizedText().setLocale("en").setText(title)));
storePage.setLink(ImmutableList.of("p2", "p3");
return androidEnterprise.storelayoutpages()
  .update(enterpriseId, "p1", storePage)
  .execute();

示例

下面是一个完整示例,创建了一个基本存储区,其中包含 链接网页。每个页面均包含大量类似的应用。每个网页 通过指定客户的 enterpriseId 并设置页面 name 来创建 获取其 pageId,然后使用它创建指向 页面。

// Create a basic page and return the pageId.
private String insertPage(String enterpriseId, String title,
    List<String> links) throws IOException {
  List<LocalizedText> names =
      ImmutableList.of(new LocalizedText().setLocale("en").setText(title));
  StorePage page = new StorePage();
  page.setName(names);
  page.setLink(links);
  return enterprise.storelayoutpages().insert(enterpriseId, page).execute().getId();
}

public StoreLayout setStoreLayout(String enterpriseId, String homepageId)
    throws IOException {
  StoreLayout storeLayout = new StoreLayout();
  storeLayout.setHomepageId(homepageId);

  return androidEnterprise
      .enterprises()
      .setStoreLayout(enterpriseId, storeLayout)
      .execute();
}

private String insertCluster(String enterpriseId, String pageId, String name,
    List<String> productIds, String orderInPage) throws IOException {
  StoreCluster cluster = new StoreCluster();
  List<LocalizedText> names =
      ImmutableList.of(new LocalizedText().setLocale("en").setText(name));
  cluster.setName(names);
  cluster.setProductId(productIds);
  cluster.setOrderInPage(orderInPage);
  return androidEnterprise.storelayoutclusters()
      .insert(enterpriseId, pageId, cluster)
      .execute()
      .getId();
}

private void updatePage(String enterpriseId, String pageId, String title,
    List<String> links) throws IOException {
  List<LocalizedText> names =
      ImmutableList.of(new LocalizedText().setLocale("en").setText(title));
  StorePage page = new StorePage();
  page.setName(names);
  page.setLink(links);
  enterprise.storelayoutpages()
      .update(enterpriseId, pageId, page).execute();
}

private void makeStore(String enterpriseId) throws IOException {
  // Create the pages.
  String page1 = insertPage(enterpriseId, "Home");
  String page2 = insertPage(enterpriseId, "Productivity");
  String page3 = insertPage(enterpriseId, "Accounting");

  // Set the homepage (page that displays by default when store is opened).
  setStoreLayout(enterpriseId, page1);

  // Add the links to the pages. This makes a small tree.
  updatePage(enterpriseId, page1, "Home", ImmutableList.of(page2, page3));
  updatePage(enterpriseId, page2, "Productivity", ImmutableList.of(page1));
  updatePage(enterpriseId, page3, "Accounting", ImmutableList.of(page1));

  // Add clusters with contents.
  insertCluster(
      enterpriseId,
      page1,
      "Getting Things Done",
      ImmutableList.of(
          "app:com.mytodolist",
          "app:com.google.android.gm",
          "app:com.google.android.docs"),
      "1");
  insertCluster(
      enterpriseId,
      page1,
      "Strategy",
      ImmutableList.of(
          "app:com.myplanner",
          "app:com.stratego"),
      "2");
  insertCluster(
      enterpriseId,
      page2,
      "Editors",
      ImmutableList.of(
          "app:com.myeditor",
          "app:com.betteredit",
          "app:com.lazyguy"),
      "1");
  insertCluster(
      enterpriseId,
      page2,
      "Time Management",
      ImmutableList.of(
          "app:com.mytimetracker",
          "app:com.lazygal",
          "app:com.lazyguy"),
      "2");
  insertCluster(
      enterpriseId,
      page2,
      "Accounting",
      ImmutableList.of(
          "app:com.mymoney",
          "app:com.taxpro",
          "app:com.balances"),
      "3");
}