我们正在处理的事情
我们有这个应用程序,我们以离线方式分发给我们的客户(即没有上传到Play商店)。分发给每个客户的应用程序风格几乎完全相同,只是在这里和那里进行一些调整。我们所有的客户都将这个应用程序分享给员工使用。基本上这是一个企业应用程序。
问题是什么
最近,我们的一位客户开始使用MDM(移动设备管理)工具来阻止未从Google Play下载的应用。很明显,我们收到了客户的请求,要求我们是否可以在Google Play上上传此应用。
重要的是我们有超过100个客户端,并且提供给每个客户端的应用程序的包名实际上是相同的。所以它是相同的应用程序,在这里和那里进行一些调整。如果我们沿着将应用程序发布到游戏商店的道路,我们可能会陷入混乱(我们不想将100个不同的应用程序上传到游戏商店 - 即每个客户端一个)。我们正在进行一些优化,以便多个客户可以使用相同的应用程序(但我们不能让所有100多个客户使用相同的应用程序。)。
我在看什么?
我开始关注 Android For Work(AFW),Google私有应用,托管Google游戏,并且仍在消化这些内容。但对我而言,它似乎只是企业部署/发布应用程序的安全方式,只能在特定设备上和特定配置文件下下载(这样可以将用户的个人应用程序和数据分开,以防他们将相同的手机用于个人和工作目的)。
我在寻找什么样的解决方案?
私下部署应用(通过Google托管或私有托管) 但在两种情况下都列出了谷歌播放)并让我的客户分享 这个应用程序与他们的员工。
每个客户的每个私人应用都应该是自己的 私人岛屿。我想用相同的包分发应用程序 我所有客户的名字(从我到目前为止所读到的,这可能不是 可以使用Google Play。但我希望有人可以指出 如果我遗漏了某些事实,那就是事实。
答案 0 :(得分:7)
这是我的解决方案:
创建运行时动态应用,从后端获取数据和配置,并使用自己的客户端ID 呈现其视图和数据。
您可以创建单个应用并上传到Google Play,但您应该通过clientId管理您的客户,这会使每个应用分离。此clientId是唯一的,并根据您的客户生成。这个解决方案有两个方面。 Android端和Serever端。
1 - Android方面:我们的应用应该在常量中使用这样的baseUrl:
FILE-Test
然后所有客户端的所有服务都使用相同的URL。 clientId是关键点。您的客户端应用程序的区别是clientId。为了生成api-call网址,您应该执行以下操作:
baseUrl = "http://yourCorporation.com/{clienId}/api/"
您必须为应在首次运行的应用中扫描的客户创建QR码。将注册后的QR码发送给他/她(客户的客户)电子邮件是很好的。这个QR码有clientId。因此,每个客户都有自己的服务,并且真正作为独立的岛工作,即使你想要更改服务器地址,你可以将所有baseUrl放在QR码中,但这不建议,因为你必须为每个客户创建服务器,这很头疼。
你甚至可以通过调用一个返回 customConfigDto 作为json的配置API来处理你app的配置和UI元素:
Constant.ClientId = scannedQRCode;
url = baseUrl.replace("{client_id}",Contant.ClientId) + apiUrl ;
通过此配置渲染您的视图。所有这些都按照 clientId 在每个应用中分离。 我喜欢QR码,因为它非常方便和优雅,适合您的情况,但您可以通过许多其他方式进入此clientId。 This是最好的免费和简单的QR码生成服务之一,this是最好的QR码扫描器库之一。
2 - 服务器端:您必须在服务器端处理step1,这很容易。您可以让所有其他实体拥有它的实体调用客户端。因为您应该将所有数据保存在一个地方,但由客户分开。您还可以在Spring中映射这样的API:
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;
}
}
答案 1 :(得分:3)
好的,长期的解决方案:
不要为不同的应用使用相同的包名称。创建一个多模块项目,为核心设置一个模块,共享内容,并为每个客户端添加一个模块,您可以在其中调整所需内容并根据构建类型动态配置包名称。这样,您可以为CI服务器和其他所有内容使用相同的程序包名称,并在发布应用程序时使用其他程序包名称。
可行的简短解决方法:
将该应用发布为已关闭的Google Play测试版,并仅向此客户发送邀请。这样他就可以通过游戏商店将应用程序分发给他的员工,其他客户也没有注意到我无法确定它会不知道你面对的是哪种MDM工具,但是因为测试版渠道应用程序没有&#39 ; t需要未知的起源权限,你应该没事。
答案 2 :(得分:2)
Google Play现在允许开发人员将应用程序私下发布到最多20个Managed Play组织(或企业)。为此(从help center复制的说明):
答案 3 :(得分:1)
如果您需要相同的软件包名称,则必须执行类似EJoshuaS建议的操作:管理一个应用程序版本内的不同配置。您无法在Google Play上部署相同的应用包,因此无法拥有多个应用。
如果你打开拥有不同的软件包,你可以在Android Manifest中为每个软件包更改软件包名称,然后以另一个应用程序的形式发布。您需要在导入R文件的任何位置更改包,并且需要确保Manifest中的所有类引用都包含整个类路径(<activity android:name="[full.package].MainActivity">
而不是<activity android:name=".MainActivity">
)。这非常混乱,在配置管理方面很糟糕,所以它一般不是一个很好的解决方案,但它可能适合你。
答案 4 :(得分:1)
我开始关注Android For Work(AFW),Google私有应用,托管Google游戏以及仍在消化这些内容。
这可能非常适合AFW。
但对我而言,它似乎只是企业部署/发布应用程序的安全方式,只能在特定设备和特定配置文件下下载
这就是MDM所做的,是的,但还有更多。使用Android for Work,您还可以使用Managed Configurations来传递应用程序的配置。这可用于更改后端网址等。
它确实支持你的第二个要求,但我知道第一个要求太少,无法确定。虽然您可以在Google Play for Work上私下托管和推出应用,但我不知道将其私下分发给多个客户。
使用此Google API的明显好处是您无需自己构建任何内容。此外,大多数MDM都支持Android for Work API,因此域管理员可以批量购买应用程序并将其分发给员工。请查看AppConfig Community,其中显示了包含这些API和最佳实践的MDM提供商。
无论你决定什么,你都应该好好看看Android for Work,因为你所描述的正是它的目的。最初的设置很痛苦,并且方式关于它们如何工作和一起玩的信息太少,但是花几天时间试图找出它可能比仅仅构建自己的托管解决方案更好那么你也必须坚持下去。