我们正在处理的
我们拥有此应用,可以离线方式分发给我们的客户(即未上传到Play商店)。分发给每个客户端的应用程序风格几乎是相同的,只是在各处进行了一些调整。我们所有的客户都将此应用共享给其员工使用。基本上,这是一个企业应用程序。
有什么问题
最近,我们的一位客户开始使用MDM(移动设备管理)工具,该工具会阻止未从Google Play下载的应用。显然,我们收到了客户的要求,以查看是否可以在Google Play上上传此应用。
重要的是这里有超过100个客户端,并且提供给每个客户端的应用程序的软件包名称实际上是相同的。因此,这是同一个应用程序,需要在此处和此处进行一些调整。如果我们沿着将应用程序发布到Play商店的路途走下去,我们可能会陷入困惑(我们不想将100种不同的应用程序上传到Play商店-即每个客户一个)。我们从一开始就进行了一些优化,以使多个客户端可以使用同一应用程序(但不能使所有100多个客户端都使用同一应用程序。)。
我在看什么?
我开始研究 Android For Work(AFW),Google私有(private)应用程序,托管的Google Play 并仍在消化这些东西。但是对我而言,这似乎是企业部署/发布应用程序的安全方法,该应用程序只能在特定设备上以特定配置文件下载(如果用户使用同一部手机,则可以将其与用户的个人应用程序和数据区分开来)和工作目的)。
我正在寻找什么解决方案?
但在两种情况下都与Google一起列出),并让我的客户共享
这个程序和他们的员工。
私有(private)岛屿。我想使用相同的软件包分发应用程序
给我所有客户的名字(从到目前为止的读物来看,
可以在Google Play中使用。但我希望有人能指出
事实,如果我错过了什么)。
最佳答案
这是我的解决方案:
创建运行时动态应用程序,以从后端获取数据和配置,并使用其自己的客户端ID 呈现其 View 和数据。
您可以创建一个应用程序并上传到Google Play,但是您应该通过clientId管理客户端,这会使每个应用程序行为分开。此clientId是唯一的,并且是根据您的客户生成的。该解决方案有两个方面。 Android端和服务器端。
1-Android端:我们的应用程序应在Constants中具有如下的baseUrl:
baseUrl = "http://yourCorporation.com/{clienId}/api/"
然后,所有客户端的所有服务都使用相同的URL。 clientId是关键点。您的客户端应用程序的区别是clientId。为了生成api调用的网址,您应该执行以下操作:
Constant.ClientId = scannedQRCode;
url = baseUrl.replace("{client_id}",Contant.ClientId) + apiUrl ;
您必须为每个应在应用程序首次运行时扫描的客户创建QR码。注册后将QR码发送到他/她(您的客户的客户)电子邮件中是很好的。此QR码具有clientId。因此,每个客户端都有自己的服务,并且实际上是作为单独的孤岛工作的,即使您要更改服务器地址,也可以将所有baseUrl放入QR码中,但是不建议这样做,因为您必须为每个客户端创建服务器,这令人头疼。
您甚至可以通过调用config api来处理应用程序的config和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是最好的免费和简单QR码生成服务之一,而this是最好的Android QR码扫描仪库之一。
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);
}