android - 为多个客户端发布 Android 私有(private)应用

标签 android google-play android-for-work

我们正在处理的事情

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

有什么问题

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

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

我在看什么?

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

我在寻找什么解决方案?

  1. 私下部署应用(通过 Google 托管或私下托管 但在这两种情况下都在 Google Play 中列出)并让我的客户分享 这个应用和他们的员工。

  2. 每个客户端的每个私有(private)应用程序都应该是独立的 私有(private)岛屿。我想用相同的包分发应用程序 我所有客户的名字(从我目前所读到的,这可能不是 可以使用 Google play。但我希望有人能指出 事实,如果我遗漏了什么)。

最佳答案

这是我的解决方案:

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

您可以创建单个应用程序并上传到 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;
}
}

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

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

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

@RequestMapping(value = "http://yourCorporation.com/{clienId}/api/customers", method = RequestMethod.GET)
    Customers getCustomers(@PathVariable("clienId") Long clientId) {
        return customerService.findCustomerByClientId(clientId);
    }

关于android - 为多个客户端发布 Android 私有(private)应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45496249/

相关文章:

android - 透明背景不适用于 Bottom Sheet

android - 托管配置 : defining an array of strings

java - 如何并排调整两个 TextView 的大小并使用屏幕宽度的 50%

android - 市场许可示例总是获得许可

java - APK 的不同版本代码,具有 phonegap 构建的 android 应用程序

android - 如何从 Developer Console 中删除被拒绝的应用

android - 如何在 Android 中限制/禁用打印服务)?

Android 管理 API 和 MDM

android - Android monkeyrunner 的 help.py 在哪里

android - 修复 ""com.google"is restricted""错误的重构/重命名步骤