20

我们正在处理的

我们有这个应用程序,我们以离线方式分发给我们的客户(即未上传到 Play 商店)。分发给每个客户端的应用程序风格几乎与这里和那里的一些调整相同。我们所有的客户都将此应用程序分享给他们的员工以供使用。基本上这是一个企业应用程序。

有什么问题

最近,我们的一位客户开始使用 MDM(移动设备管理)工具,该工具会阻止未从 Google Play 下载的应用程序。显然,我们收到了客户的请求,看看我们是否可以在 Google Play 上上传这个应用程序。

这里重要的是我们有超过 100 个客户端,并且提供给每个客户端的应用程序包名称实际上是相同的。所以它是同一个应用程序,在这里和那里进行了一些调整。如果我们继续将应用程序发布到 Play 商店,我们可能会陷入混乱(我们不想将 100 个不同的应用程序上传到 Play 商店 - 即每个客户端一个)。我们正在做一些优化,以便多个客户端可以使用同一个应用程序(但我们不能让所有 100 多个客户端都使用同一个应用程序。)。

我在看什么?

我开始研究Android For Work (AFW)、Google 私人应用程序、托管 Google Play并且仍在消化这些东西。但对我来说,这似乎只是企业部署/发布应用程序的一种安全方式,这些应用程序只能在特定设备上和特定配置文件下下载(这样可以将事情与用户的个人应用程序和数据分开,以防他们将同一部手机用于个人和工作目的)。

我正在寻找什么解决方案?

  1. 私下部署应用程序(使用 Google 托管或私下托管但在两种情况下都使用 Google play 列出)并让我的客户与他们的员工共享此应用程序。

  2. 每个客户的每个私人应用程序都应该在自己的私人小岛上。我想将具有相同包名称的应用程序分发给我的所有客户(从我目前所读的内容来看,这可能无法通过 Google play 实现。但我希望如果我遗漏了什么,有人可以指出事实)。

4

6 回答 6

10

这是我的解决方案:

创建运行时动态应用程序,从后端获取数据和配置,并使用自己的客户端 ID 呈现其视图和数据

您可以创建单个应用程序并上传到 google play,但您应该通过 clientId 管理您的客户端,使每个应用程序的行为分开。此 clientId 是唯一的,并且是根据您的客户生成的。这个解决方案有两个方面。Android端和服务器端。

1 - Android 端:我们的应用程序应该在常量中有一个这样的 baseUrl:

baseUrl = "http://yourCorporation.com/{clienId}/api/" 

然后所有客户端的所有服务都使用相同的 url。clientId 是关键点。您的客户端应用程序的区别是 clientId。要生成 api-call 的 url,您应该执行以下操作:

Constant.ClientId = scannedQRCode;
url = baseUrl.replace("{client_id}",Contant.ClientId) + apiUrl ;

您必须为应在应用程序首次运行时扫描的客户创建 QR 码。注册后最好将二维码发送到他/她(您客户的客户)的电子邮件。这个二维码有clientId。因此,每个客户端都有自己的服务,并且实际上是独立的岛屿,即使您想更改服务器地址,也可以将所有 baseUrl 放入 QR 码中,但不建议这样做,因为您必须为每个客户端创建服务器,这很令人头疼。

您甚至可以通过调用配置 api 来处理应用程序的配置和 UI 元素,该 api 将customConfigDto作为 json 返回,如下所示:

public class CustomConfigDto {

String colorPrimary ;
String colroPrimaryDark ;
String colorAccent ;
int tabCounts;

//and more...


public String getColorPrimary() {
    return colorPrimary;
}

public void setColorPrimary(String colorPrimary) {
    this.colorPrimary = colorPrimary;
}

public String getColroPrimaryDark() {
    return colroPrimaryDark;
}

public void setColroPrimaryDark(String colroPrimaryDark) {
    this.colroPrimaryDark = colroPrimaryDark;
}

public String getColorAccent() {
    return colorAccent;
}

public void setColorAccent(String colorAccent) {
    this.colorAccent = colorAccent;
}

public int getTabCounts() {
    return tabCounts;
}

public void setTabCounts(int tabCounts) {
    this.tabCounts = tabCounts;
}
}

并通过此配置呈现您的视图。所有这些工作都由他们的clientId每个应用程序分开。

我更喜欢 QR 码,因为它非常方便和优雅,适合您的情况,但是您可以通过许多其他方式输入此 clientId。是最好的免费和简单的二维码生成服务之一,是安卓最好的二维码扫描器库之一。

2 - 服务器端:您必须在服务器端处理 step1,这很容易。您可以让所有其他实体都拥有它的实体调用客户端。因为您应该将所有数据保存在一个地方,但由您的客户分开。你也可以在 Spring 中像这样映射 API:

@RequestMapping(value = "http://yourCorporation.com/{clienId}/api/customers", method = RequestMethod.GET)
    Customers getCustomers(@PathVariable("clienId") Long clientId) {
        return customerService.findCustomerByClientId(clientId);
    }
于 2017-08-15T08:18:48.957 回答
5

根据您所说,这听起来更像是您可以通过配置管理来解决这个问题,而不是向每个客户端发送完全独立的 APK。

Google 有一个私人频道,但根据文档,它似乎更倾向于拥有一个单一的会员列表(即,一旦您被授予访问权限,您就可以访问整个私人频道)而不是高度自定义的访问权限(即某些人可以访问到频道中的某些项目)。

我建议的替代方案:让所有客户端下载相同的 APK。为您的应用程序提供每个客户端特定的“激活码”。当应用程序第一次启动时,它会调用一个 Web 服务并将其激活码传递给它;在服务器端,您使用激活码来识别客户端,然后将正确配置的数据返回给客户端。然后,您可以将相同的 APK 分发给您的私人频道上的每个人,并在安装后远程配置它。

此方案的一个主要优点是您可以为一个组织进行多种配置。只需让客户选择几个激活码,每个激活码都会给他们一个特定的配置。例如,如果您有一个码头工人和看门人都使用的应用程序(我只是在这里抛出一个例子),您可以给码头工人一个激活码,给看门人第二个激活码,然后您可以轻松地给他们不同的配置。

于 2017-08-11T19:20:15.867 回答
4

Google Play 现在允许开发者私下向多达 20 个 Managed Play 组织(或企业)发布应用程序。为此(从帮助中心复制的说明):

  • 登录到 Google Play 控制台
  • 转到定价和分发 > 用户程序 > 托管 Google Play
  • 选中启用高级托管 Google Play 功能框
  • 选中将此应用程序私下定位到组织列表框
  • 单击选择组织
  • 对于您要将应用程序发布到的每个组织,输入组织 ID 和描述(或名称),然后单击添加。每个应用最多可以输入 20 个组织。
于 2017-11-20T16:48:57.167 回答
3

好的,长期的解决方案:

不要为不同的应用程序使用相同的包名称。创建一个多模块项目,为核心、共享内容设置一个模块,并为每个客户端添加一个模块,您可以在其中调整所需内容并根据构建类型动态配置包名称。这样,您可以为 CI 服务器和其他所有内容使用相同的包名称,并在发布应用程序时使用另一个包名称

可能有效的简短解决方法:

将应用程序发布为封闭的 google play 测试版,并仅向该客户发送邀请。这样他就可以通过 Play 商店将应用程序分发给他的员工,而其他客户不会注意到我不能保证它会在不知道您所面临的 MDM 工具的情况下工作,但由于 beta 通道应用程序不需要未知来源权限,你应该没事。

于 2017-08-15T05:54:03.313 回答
1

我开始研究 Android For Work (AFW)、Google 私有应用程序、托管 Google Play 并且仍在消化这些东西。

这可能非常适合AFW。

但在我看来,这只是企业部署/发布应用程序的一种安全方式,只能在特定设备和特定配置文件下下载

这就是 MDM 所做的,是的,但还有更多。使用 Android for Work,您还拥有托管配置,可让您为应用程序传递配置。这可用于更改后端 url 等。

它肯定支持您的第二个要求,但我对第一个要求知之甚少。虽然您可以在 Google Play for Work 上私下托管和推出应用程序,但我不知道将其私下分发给多个客户。

使用此 Google API 的明显好处是您不必自己构建任何东西。此外,大多数 MDM 都支持那些 Android for Work API,因此域管理员可以批量购买应用程序并将其分发给员工。查看AppConfig 社区,该社区展示了包含这些 API 和最佳实践的 MDM 提供程序。

无论您做出什么决定,您都应该好好看看 Android for Work,因为您所描述的正是它的用途。最初的设置很痛苦,关于它如何工作和一起玩的信息太少了,但是花几天时间试图弄清楚可能比仅仅构建自己的托管解决方案要好,然后你也必须维护.

于 2017-08-12T17:46:47.207 回答
1

如果您想要相同的包名称,则必须执行 EJoshuaS 建议的操作:在一个应用程序版本中管理不同的配置。您将无法在 Google Play 上部署多个具有相同软件包的应用。

如果您愿意拥有不同的软件包,您可以在 Android Manifest 中为每个软件包更改软件包名称,然后作为不同的应用程序发布。您需要在导入 R 文件的任何地方更改包,并且需要确保 Manifest 中的所有类引用都包含整个类路径(<activity android:name="[full.package].MainActivity">而不是<activity android:name=".MainActivity">)。这变得相当混乱,并且在配置管理方面很糟糕,所以它通常不是一个很好的解决方案,但它可能对你有用。

于 2017-08-12T17:15:47.637 回答