webentwicklung-frage-antwort-db.com.de

Veröffentlichen Sie eine private Android-App für mehrere Clients

Womit wir es zu tun haben

Wir haben diese App, die wir offline an unsere Kunden verteilen (d. H. Nicht in den Play Store hochgeladen). Die App-Variante, die an jeden Kunden verteilt wird, ist fast identisch mit ein bisschen Tweak hier und da. Alle unsere Kunden geben diese App an ihre Mitarbeiter zur Nutzung weiter. Grundsätzlich ist dies eine Enterprise App.

Was ist das Problem

Kürzlich hat einer unserer Kunden damit begonnen, ein MDM-Tool (Mobility Device Management) zu verwenden, das Apps blockiert, die nicht von Google Play heruntergeladen wurden. Natürlich haben wir eine Anfrage von unserem Kunden erhalten, ob wir diese App bei Google Play hochladen können oder nicht.

Wichtig dabei ist, dass wir über 100 Clients haben und der Paketname der App, der jedem Client zur Verfügung gestellt wird, tatsächlich der gleiche ist. Es ist also die gleiche App mit ein bisschen Tweak hier und da. Wenn wir die App nicht mehr im Play Store veröffentlichen, könnte dies zu einem Chaos führen (wir möchten nicht 100 verschiedene Apps in den Play Store hochladen, d. H. Eine für jeden Client). Wir führen von Anfang an einige Optimierungen durch, damit mehrere Clients dieselbe App verwenden können (wir können jedoch nicht alle über 100 Clients dazu bringen, dieselbe App zu verwenden.).

Was Schau ich mir da an ?

Ich habe angefangen, mir Android For Work (AFW), private Apps von Google und Managed Google Play anzuschauen und die Dinge noch zu verdauen. Für mich schien es jedoch nur eine sichere Möglichkeit für Unternehmen zu sein, Apps bereitzustellen/zu veröffentlichen, die nur auf bestimmten Geräten und unter einem bestimmten Profil heruntergeladen werden können (wodurch die Dinge von den persönlichen Apps und Daten der Benutzer getrennt bleiben, falls sie das gleiche Telefon für den persönlichen Gebrauch verwenden und Arbeitszweck).

Welche Lösung suche ich?

  1. So stellen Sie eine App privat bereit (hosten Sie sie bei Google oder hosten Sie sie privat, aber in beiden Fällen bei Google Play) und lassen Sie meine Kunden diese App für ihren Mitarbeiter freigeben.

  2. Jede private App für jeden Kunden sollte sich auf einer eigenen kleinen privaten Insel befinden. Ich möchte die App mit dem gleichen Paketnamen an alle meine Kunden verteilen (Nach dem, was ich bisher gelesen habe, ist dies mit Google Play möglicherweise nicht möglich. Ich hoffe jedoch, dass jemand auf Fakten hinweisen kann, wenn mir etwas fehlt).

17
Dibzmania

Dies ist meine Lösung:

Dynamische Laufzeit-App erstellen, die Daten und Konfigurationen aus dem Back-End abruft und deren Ansichten und Daten mit ihrer eigenen Client-ID wiedergibt .

Sie können eine einzelne App erstellen und zu Google Play hochladen. Sie sollten Ihre Kunden jedoch über die clientId verwalten, damit jede App separat agiert. Diese clientId ist eindeutig und wird von Ihren Kunden generiert. Diese Lösung hat zwei Seiten. Android Seite und Serever Seite.

1 - Android Seite: Unsere App sollte eine BaseUrl wie diese in Konstanten haben:

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

Und dann verwenden alle Dienste aller Clients dieselbe URL. clientId ist der Schlüsselpunkt. Der Unterschied Ihrer Client-App ist clientId. Um eine URL von api-call zu generieren, solltest du ungefähr so ​​vorgehen:

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

Sie müssen für jeden Kunden einen QR-Code erstellen, der zuerst in der App gescannt werden soll. Es ist gut, den QR-Code nach der Registrierung an seine E-Mail-Adresse (Kunde Ihres Kunden) zu senden. Dieser QR-Code hat clientId. Daher hat jeder Client seine eigenen Dienste und arbeitet tatsächlich als getrennte Inseln. Auch wenn Sie die Serveradresse ändern möchten, können Sie alle baseUrl in QR-Code einfügen. Dies wird jedoch nicht empfohlen, da Sie Server pro Client erstellen müssen und dies Kopfzerbrechen verursacht .

Sie können sogar mit Konfigurations- und UI-Elementen Ihrer App umgehen, indem Sie eine Konfigurations-API aufrufen, die customConfigDto als json zurückgibt:

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;
}
}

Und rendern Sie Ihre Ansichten mit diesen Konfigurationen. All dies funktioniert getrennt pro App durch ihre clientId . Ich bevorzuge QR-Code, weil er sehr handlich und elegant ist und in Ihren Fall passt. Sie können diese clientId jedoch auf viele andere Arten eingeben. Dies ist einer der besten kostenlosen und einfachen QR-Code-Generierungsdienste, und dies ist eine der besten QR-Code-Scanner-Bibliotheken für Android.

2 - Serverseitig: Sie müssen Schritt 1 serverseitig handhaben und es ist sehr einfach. Sie können Entity-Aufrufe Client haben, die alle anderen Entities haben. Weil Sie alle Ihre Daten an einem Ort aufbewahren sollten, aber von Ihren Kunden getrennt. Sie können APIs wie diese auch im Frühjahr zuordnen:

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

Basierend auf Ihren Aussagen können Sie dies eher mit der Konfigurationsverwaltung lösen, als jedem Client vollständig separate APKs zu senden.

Google hat einen privaten Kanal, aber auf der Grundlage der Dokumentation scheint es viel mehr darauf ausgerichtet zu sein, eine einzelne Mitgliederliste zu haben (dh, sobald Sie Zugriff haben, haben Sie Zugriff auf den gesamten privaten Kanal), als einen stark angepassten Zugriff (dh bestimmte Personen haben Zugriff) zu bestimmten Elementen im Kanal).

Eine Alternative, die ich vorschlage: Lassen Sie alle Clients die gleiche APK herunterladen. Geben Sie jedem einen kundenspezifischen "Aktivierungscode" für Ihre App. Wenn die App zum ersten Mal gestartet wird, ruft sie einen Webdienst auf und übergibt ihm den Aktivierungscode. Auf der Serverseite verwenden Sie den Aktivierungscode, um den Client zu identifizieren und geben dann Daten zur richtigen Konfiguration an den Client zurück. Dann können Sie die gleiche APK an alle in Ihrem privaten Kanal verteilen und sie nach der Installation remote konfigurieren.

Ein Hauptvorteil dieses Schemas besteht darin, dass Sie für eine Organisation mehrere Konfigurationen haben können. Geben Sie dem Client einfach eine Auswahl von mehreren Aktivierungscodes, von denen jeder eine bestimmte Konfiguration enthält. Wenn Sie zum Beispiel eine App haben, die sowohl von Hafenarbeitern als auch von Hausmeistern verwendet wird (und ich werfe hier nur ein Beispiel aus), können Sie den Hafenarbeitern einen Aktivierungscode und den Hausmeistern einen zweiten Aktivierungscode geben, und Sie können diesen dann problemlos eingeben ihnen verschiedene Konfigurationen.

4
EJoshuaS

Die gute, lange Lösung:

Verwenden Sie nicht den gleichen Paketnamen für verschiedene Apps. Erstellen Sie ein Multimodul-Projekt, legen Sie ein Modul für den Core und die gemeinsam genutzten Inhalte fest und fügen Sie für jeden Client ein Modul hinzu, in dem Sie die erforderlichen Änderungen vornehmen und den Paketnamen dynamisch basierend auf dem Build-Typ konfigurieren können. Auf diese Weise können Sie den gleichen Paketnamen für Ihren CI-Server und alles andere verwenden und beim Freigeben der App einen anderen Paketnamen verwenden .

Die kurze Problemumgehung, die möglicherweise funktioniert:

Veröffentlichen Sie die App als geschlossene Betaversion von Google Play und senden Sie Einladungen nur an diesen Client. Auf diese Weise kann er die App über den Play Store an seine Mitarbeiter verteilen, und die anderen Kunden werden es nicht bemerken. Ich kann nicht garantieren, dass sie funktionieren, ohne zu wissen, mit welchem ​​MDM-Tool Sie konfrontiert sind. Da für Beta-Channel-Apps jedoch keine unbekannten Ursprungsberechtigungen erforderlich sind Du solltest in Ordnung sein.

3
Fco P.

Mit Google Play kann ein Entwickler jetzt eine App für bis zu 20 Managed Play-Organisationen (oder -Unternehmen) privat veröffentlichen. Dazu (Anweisungen aus der Hilfe kopiert):

  • Melden Sie sich bei Google Play Console an.
  • Gehen Sie zu Preise & Vertrieb> Benutzerprogramme> Verwaltetes Google Play .
  • Aktivieren Sie das Kontrollkästchen Erweiterte verwaltete Google Play-Funktionen aktivieren .
  • Aktivieren Sie das Kontrollkästchen Diese App privat auf eine Liste von Organisationen ausrichten .
  • Klicken Sie auf Organisationen auswählen .
  • Geben Sie für jede Organisation, für die Sie die App veröffentlichen möchten, die Organisations-ID und eine Beschreibung (oder einen Namen) ein und klicken Sie auf Hinzufügen . Sie können bis zu 20 Organisationen pro App eingeben.
2
Fred

Wenn Sie den gleichen Paketnamen möchten, müssen Sie etwas tun, was EJoshuaS vorgeschlagen hat: Verwalten Sie die verschiedenen Konfigurationen in einer App-Version. Es ist nicht möglich, mehr als eine App mit demselben Paket auf Google Play bereitzustellen.

Wenn Sie verschiedene Pakete haben möchten, können Sie einfach den Paketnamen im Android-Manifest für jedes Paket ändern und als andere App veröffentlichen. Sie müssten das Paket überall dort ändern, wo Sie die R-Datei importieren, und Sie müssten sicherstellen, dass alle Klassenreferenzen in Ihrem Manifest den gesamten Klassenpfad enthalten (<activity Android:name="[full.package].MainActivity"> statt <activity Android:name=".MainActivity">). Das wird ziemlich verwirrend und ist in Bezug auf das Konfigurationsmanagement furchtbar. Es ist also im Allgemeinen keine großartige Lösung, aber es könnte für Sie funktionieren.

1
windedmoose

Ich habe angefangen, mir Android For Work (AFW), private Apps von Google und Managed Google Play anzuschauen und die Dinge noch zu verdauen.

Dies würde wahrscheinlich gut zu AFW passen.

Für mich war es jedoch nur eine sichere Möglichkeit für Unternehmen, Apps bereitzustellen/zu veröffentlichen, die nur auf bestimmten Geräten und unter einem bestimmten Profil heruntergeladen werden können

Genau das macht ein MDM, aber es steckt noch mehr dahinter. Mit Android for Work haben Sie auch Verwaltete Konfigurationen , mit denen Sie eine Konfiguration für die App übergeben können. Dies kann verwendet werden, um Backend-URLs usw. zu ändern.

Es unterstützt sicher Ihre zweite Anforderung, aber ich weiß zu wenig, um über die erste sicher zu sein. Sie können eine App in Google Play for Work zwar privat hosten und einführen, ich weiß jedoch nicht, wie Sie sie privat an mehrere Kunden verteilen können.

Der offensichtliche Vorteil der Verwendung dieser Google-API besteht darin, dass Sie nichts selbst erstellen müssen. Außerdem unterstützen die meisten MDMs diese Android for Work-APIs, sodass ein Domänenadministrator die App in großen Mengen kaufen und an die Mitarbeiter verteilen kann. In der AppConfig Community finden Sie MDM-Anbieter, die diese APIs und Best Practices enthalten.

Was auch immer Sie sich entscheiden, Sie sollten sich Android for Work auf jeden Fall genau ansehen, denn was Sie beschreiben, ist genau das, wofür es gedacht ist. Die anfängliche Einrichtung ist mühsam und es gibt way zu wenig Informationen darüber, wie das alles funktioniert und wie es zusammenspielt, aber ein paar Tage damit zu verbringen, es herauszufinden, könnte besser sein, als nur eine eigene verwaltete Lösung zu erstellen, die Sie haben dann müssen auch pflegen.

1
David Medenjak