Konfiguration von TheFlex mit Intune
Ein MDM (Mobile Device Management System) ist eine Softwarelösung, die Unternehmen bei der Verwaltung und Sicherung mobiler Geräte wie Smartphones, Tablets und Laptops unterstützt. MDM-Systeme ermöglichen es Unternehmen, Geräte aus der Ferne zu überwachen, zu konfigurieren und zu steuern, unabhängig vom Standort oder dem Netzwerk, mit dem sie verbunden sind. MDM-Systeme sind besonders nützlich für Unternehmen mit einer großen Anzahl von Mitarbeitern, die über mobile Geräte auf Unternehmensressourcen zugreifen.
Der folgende Artikel beschreibt die Vorgehensweise zur Konfiguration der Android-Version von TheFlex mit Microsoft Intune.
App-Configuration-Policy erstellen
Besuchen Sie die Microsoft Endpoint Manager-Website und melden Sie sich mit Ihren Anmeldeinformationen an. Navigieren Sie zu Apps und wählen Sie App-Konfigurationsrichtlinien aus.
Klicken Sie auf Neue Richtlinie erstellen und wählen Sie Managed Devices aus.
Dort kann als Name TheFlex, als Zielplattform Android Enterprise, ein entsprechender Profiltyp und letztendlich die App TheFlex ausgewählt werden.
Konfiguration der Einstellungen
Optional gibt es die Möglichkeit, direkt die erforderlichen Berechtigungen für TheFlex freizuschalten. Folgende Berechtigungen sind für TheFlex notwendig:
- WiFi
- NFC
- Bluetooth
- Camera
- GPS
- Flashlight
- Vibrate
- Audio
- Read Storage
- Write Storage
Im nächsten Schritt müssen die TheFlex-spezifischen Einstellungen konfiguriert werden. Da die wichtigste und auch verpflichtende Einstellung die Startseiten sind, kann dies nicht über die Oberfläche von Intune durchgeführt werden. Der Grund dafür ist, dass mehrere Startseiten konfiguriert werden können und diese Funktion von Intune nicht unterstützt wird.
Aus diesem Grund müssen die Einstellungen als JSON-Daten eingegeben werden:
Intune generiert automatisch Beispieldaten. Die Empfehlung ist, diese in ein anderes Programm wie Notepad++ zu kopieren und dort zu bearbeiten.
Konfiguration normaler Einstellungen
Die meisten Einstellungen sind entweder als "true" oder eine Zahl vordefiniert. Diese können nach Belieben auf den entsprechenden Wert angepasst oder auf dem Standardwert belassen werden.
Wichtig: Für alle Text-Einstellungen schreibt Intune automatisch den Wert STRING_VALUE. Dies muss mindestens durch einen leeren String "" ersetzt werden. Es wird jedoch empfohlen, diesen STRING_VALUE durch eine gültige Einstellung zu ersetzen:
| Einstellung | Mögliche Werte (immer in "" eintragen) |
|---|---|
| Zusätzliche Displays | "none", "PROGLOVE_MARK_DISPLAY_SDK", "NIMMSTA_HS50_SDK" |
| Tastaturverhalten | "default", "deactivated", "Active_on_tap" |
| Sprache | "de_DE", "en_EN" |
| Protokollierung | "ERROR", "WARN", "INFO", "DEBUG" |
Konfiguration der Lizenz
Unter dem Schlüssel flx_license kann als valueString der Lizenzcode eingetragen werden. Auch hier muss der Lizenzcode in Anführungszeichen gesetzt werden, da er sonst von Intune als nicht gültig erkannt wird.
Konfiguration der Startseiten
Es muss mindestens eine Startseite gepflegt sein, da die Konfiguration von TheFlex sonst als nicht gültig abgelehnt und zurückgesetzt wird. Dazu muss im Abschnitt fioriURL_Configuration mindestens eine managedProperty hinzugefügt beziehungsweise konfiguriert werden:
- fioriURLName: Name der Startseite (verpflichtend, darf nicht leer sein)
- fioriURL: URL der Startseite (verpflichtend, darf nicht leer sein)
- fioriURLUsername: Optionaler SAP User
- fioriURLPassword: Optionales SAP Passwort
Empfehlung
Am Ende dieses Artikels ist eine gültige Konfiguration als JSON. Diese kann in Microsoft Intune eingefügt werden. Es empfiehlt sich, direkt einen gültigen Lizenzcode mit einzufügen.
Hinweis
In manchen Fällen kann es sinnvoll sein, dass alle Einstellungen per Intune auf die Geräte übertragen werden außer Username und Passwort.
Dies kann notwendig sein, wenn zwar alle Einstellungen zentral verwaltet werden sollen, die Nutzer jedoch trotzdem ihre persönlichen Zugangsdaten für bestimmte Startseiten abspeichern können sollen.
Um dies mit Intune zu ermöglichen, muss als fioriURLUsername und fioriURLPassword ein "/" (einen einfachen Schrägstrich) in Intune eingetragen werden. Falls das Gerät ein "/" empfängt, wird es die lokale Einstellung nicht überschreiben.
Auswahl von Benutzergruppen
Im nächsten Schritt muss konfiguriert werden, für welche Geräte- oder Benutzergruppen diese Konfigurationsrichtlinie gelten soll.
Anschließend werden die App und die Einstellungen von Intune automatisch an alle ausgewählten Geräte verteilt.
Achtung
Falls TheFlex bereits installiert und konfiguriert war, zum Beispiel zum lokalen Testen, dann müssen die Einstellungen zurückgesetzt werden. Dies kann entweder in den TheFlex- oder den allgemeinen Android-Einstellungen durchgeführt werden.
Beispiel-JSON für eine Intune-Konfiguration
Das folgende JSON ist eine vollständige Vorlage mit allen verfügbaren TheFlex-Einstellungen. Es kann in den Intune-JSON-Editor kopiert und nach Bedarf angepasst werden. Belasse alle Top-Level-Keys und ändere nur deren Werte: der Validator unten behandelt jeden Top-Level-Key als Pflichtfeld.
Eigenes JSON prüfen
Du hast bereits eine Konfiguration? Füge sie unten in den Validator ein, um sie vor dem Import in Intune gegen diese Referenz zu prüfen. Die Prüfung läuft vollständig im Browser und zeigt dir genau, was falsch ist.
{
"kind": "androidenterprise#managedConfiguration",
"productId": "app:de.flexus.apps.theflex",
"managedProperty": [
{ "key": "flx_license", "valueString": "" },
{
"key": "fioriURL_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "fioriURLName", "valueString": "Meine App" },
{ "key": "fioriURL", "valueString": "https://mein-sap-system.example.com" },
{ "key": "fioriURLUsername", "valueString": "" },
{ "key": "fioriURLPassword", "valueString": "" }
]
}
]
},
{ "key": "menuStartpagesEnabled", "valueBool": true },
{
"key": "menuStartpage_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Kommissionierung" },
{ "key": "menuStartpageUrl", "valueString": "https://mein-sap-system.example.com/picking" },
{ "key": "menuStartpageFolder", "valueString": "Lager/Zone A" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Wareneingang" },
{ "key": "menuStartpageUrl", "valueString": "https://mein-sap-system.example.com/wareneingang" },
{ "key": "menuStartpageFolder", "valueString": "Lager/Zone A" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Inventur" },
{ "key": "menuStartpageUrl", "valueString": "https://mein-sap-system.example.com/inventur" },
{ "key": "menuStartpageFolder", "valueString": "Lager" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Dashboard" },
{ "key": "menuStartpageUrl", "valueString": "https://mein-sap-system.example.com/dashboard" },
{ "key": "menuStartpageFolder", "valueString": "" }
]
}
]
},
{ "key": "adminPassword", "valueString": "" },
{ "key": "requirePasswordLaunchpad", "valueBool": false },
{ "key": "SslUntrustIgnore", "valueBool": false },
{ "key": "flxBlockCopyPaste", "valueBool": false },
{ "key": "FlxCertChooser", "valueBool": false },
{ "key": "FlxUseSmartcard", "valueBool": false },
{ "key": "NFCConfig", "valueString": "" },
{ "key": "FlxPdfViewerEnabled", "valueBool": true },
{ "key": "FlxProgressIndicator", "valueBool": true },
{ "key": "FlxDebugMode", "valueBool": false },
{ "key": "FLXShowStatusBar", "valueBool": true },
{ "key": "FLXShowNavigationBar", "valueBool": true },
{ "key": "FlxToolbarOverlap", "valueBool": true },
{ "key": "FlxShowCloseButton", "valueBool": false },
{ "key": "FlxKeepScreenOn", "valueBool": false },
{ "key": "FlxConnectionStatus", "valueBool": false },
{ "key": "ZoomAmount", "valueInteger": 100 },
{ "key": "flxSelectedLanguage", "valueString": "" },
{ "key": "FLXSoftInputModeResize", "valueBool": true },
{ "key": "flxKeyboardPreferences", "valueString": "default" },
{ "key": "flxPairedDevice", "valueString": "none" },
{ "key": "flxPairedDevice_ScanMode", "valueString": "default" },
{ "key": "ClearSessions", "valueBool": true },
{ "key": "ClearCacheOnExit", "valueBool": true },
{ "key": "ClearCookieOnSwitchingLaunchpad","valueBool": true },
{ "key": "ClearCacheOnSwitchingLaunchpad", "valueBool": true },
{ "key": "LogLevel", "valueString": "ERROR" },
{
"key": "customScript_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "customScriptDescription", "valueString": "Mein Skript" },
{ "key": "customScriptName", "valueString": "https://mein-sap-system.example.com*" },
{ "key": "customScriptCode", "valueString": "console.log('TheFlex bereit');" },
{ "key": "customScriptActive", "valueBool": true }
]
}
]
},
{
"key": "customCSSSet_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "customCSSDescription", "valueString": "Mein CSS" },
{ "key": "customCSSName", "valueString": "https://mein-sap-system.example.com*" },
{ "key": "customCSSCode", "valueString": "body { font-size: 16px; }" },
{ "key": "customCSSActive", "valueBool": true }
]
}
]
},
{
"key": "customKeyboardSet_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "inputType", "valueString": "default" },
{ "key": "cKeyboard", "valueString": "{ 'rows': [{ 'buttons': [{ 'text': 'ENTER', 'function': 'ENTER', 'color': '#ffff33', 'weight': 1 }] }] }" },
{ "key": "customParameter", "valueString": "" }
]
}
]
},
{
"key": "scanConfig_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "scanConfigName", "valueString": "EAN-13" },
{ "key": "scanConfigLengthRule", "valueString": "EXACT" },
{ "key": "scanConfigMatchLength", "valueInteger": 13 },
{ "key": "scanConfigMatchText", "valueString": "" },
{
"key": "scanConfigActions",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "scanConfigActionType", "valueString": "CUT_FIRST" },
{ "key": "scanConfigActionCount", "valueInteger": 1 },
{ "key": "scanConfigActionText", "valueString": "" }
]
}
]
}
]
}
]
}
]
}Hinweis
JSON unterstützt keine Kommentare. Die Struktur oben dient zur Übersichtlichkeit in dieser Dokumentation. Passe die Werte nach Bedarf an, aber belasse alle Top-Level-Keys.
Erklärung aller Intune JSON Keys
Die Spalte Erforderlich zeigt, ob ein Key vorhanden sein muss. Alle Top-Level-Keys sind erforderlich (ihr Wert darf trotzdem leer sein, z.B. eine leere Lizenz). Bei Keys innerhalb einer Liste (Startseiten, Skripte, CSS, Tastaturen, Scan-Konfigurationen) gilt "Erforderlich", sobald ein solcher Eintrag vorhanden ist. Du kannst dein eigenes JSON mit dem Validator im vorherigen Abschnitt gegen diese Regeln prüfen.
Lizenz
| Key | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
flx_license | string | Ja | TheFlex-Lizenzschlüssel |
Klassische Startseiten (fioriURL_Configuration)
| Key | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
fioriURLName | string | Ja | Anzeigename |
fioriURL | string | Ja | URL |
fioriURLUsername | string | Nein | SAP-Benutzername - "/" erhält den lokalen Wert |
fioriURLPassword | string | Nein | SAP-Passwort - "/" erhält den lokalen Wert |
Menü-Startseiten
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
menuStartpagesEnabled | bool | Ja | false | Ordnerbasierte Menünavigation aktivieren. Hinweis: Wenn aktiviert, werden die klassischen Startseiten (fioriURL_Configuration) nicht mehr im Menü angezeigt. |
menuStartpageTitle | string | Ja | - | Anzeigename |
menuStartpageUrl | string | Ja | - | URL der Startseite |
menuStartpageFolder | string | Ja | "" | Ordnerpfad für diesen Eintrag. Der Key muss vorhanden sein, der Wert darf aber leer sein. Mit "/" als Trennzeichen für Unterordner, z.B. "Lager/Zone A". Alle Einträge mit gleichem Pfad erscheinen im selben Ordner. Leer ("") = Root-Ebene, kein Ordner. |
Beispiele für Ordnerpfade
Der Wert von menuStartpageFolder bestimmt, wo im Menü der Eintrag erscheint:
| Wert | Position im Menü |
|---|---|
"" | Root-Ebene - direkt im Menü, kein Ordner |
"Lager" | Im Ordner Lager |
"Lager/Zone A" | Im Unterordner Zone A innerhalb von Lager |
Das JSON-Beispiel oben erzeugt folgende Menüstruktur:
📁 Lager
📁 Zone A
📄 Kommissionierung
📄 Wareneingang
📄 Inventur
📄 DashboardEinträge mit identischem Pfad werden automatisch im selben Ordner gruppiert. Ordner werden implizit angelegt - sie müssen nicht separat definiert werden.
Sicherheit
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
adminPassword | string | Ja | "" | Admin-Passwort für den Einstellungszugang |
requirePasswordLaunchpad | bool | Ja | false | Passwort beim Startseitenwechsel verlangen |
SslUntrustIgnore | bool | Ja | false | HTTPS-Verbindungen mit ungültigem Zertifikat erlauben |
flxBlockCopyPaste | bool | Ja | false | Kopieren und Einfügen aus Web-Inhalten sperren |
FlxCertChooser | bool | Ja | false | Zertifikatsauswahl-Dialog beim Login anzeigen |
FlxUseSmartcard | bool | Ja | false | NFC-Smartcard-Authentifizierung aktivieren |
NFCConfig | string | Ja | "" | Smartcard-Konfiguration (via QR importiert) |
Benutzeroberfläche
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
FLXShowStatusBar | bool | Ja | true | Android-Statusleiste anzeigen |
FLXShowNavigationBar | bool | Ja | true | Android-Navigationsleiste anzeigen |
FlxToolbarOverlap | bool | Ja | true | Toolbar überlagert Inhalte statt sie zu verschieben |
FlxShowCloseButton | bool | Ja | false | Schließen-Button in der Toolbar anzeigen |
FlxKeepScreenOn | bool | Ja | false | Bildschirm immer eingeschaltet lassen |
FlxConnectionStatus | bool | Ja | false | Verbindungsstatus-Anzeige einblenden |
ZoomAmount | string | Ja | "100" | Seitenzoom in Prozent |
flxSelectedLanguage | string | Ja | "" | App-Sprache: "" (System), "de_DE", "en_EN" |
Tastatur
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
FLXSoftInputModeResize | bool | Ja | true | Tastatur verschiebt UI-Elemente nach oben |
flxKeyboardPreferences | string | Ja | "default" | Tastaturverhalten: "default", "Active_on_tap", "deactivated" |
Gekoppeltes Gerät (Backhand-Scanner)
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
flxPairedDevice | string | Ja | "none" | "none", "PROGLOVE_MARK_DISPLAY_SDK", "NIMMSTA_HS50_SDK" |
flxPairedDevice_ScanMode | string | Ja | "default" | "default", "onlyBarcodes", "onlyQRCode" |
Cache & Cookies
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
ClearSessions | bool | Ja | true | Session-Daten beim App-Beenden löschen |
ClearCacheOnExit | bool | Ja | true | Datei-Cache beim App-Beenden löschen |
ClearCookieOnSwitchingLaunchpad | bool | Ja | true | Cookies beim Startseitenwechsel löschen |
ClearCacheOnSwitchingLaunchpad | bool | Ja | true | Datei-Cache beim Startseitenwechsel löschen |
PDF & Anzeige
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
FlxPdfViewerEnabled | bool | Ja | true | PDF-Links im eingebetteten Viewer öffnen |
FlxProgressIndicator | bool | Ja | true | Ladeindikator am Bildschirmrand anzeigen |
FlxDebugMode | bool | Ja | false | Erweitertes Debug-Logging aktivieren |
Logging
| Key | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
LogLevel | string | Ja | "ERROR" | "ERROR", "WARNING", "INFO", "DEBUG" |
Eigene Skripte (customScript_Configuration)
| Key | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
customScriptDescription | string | Ja | Anzeigename |
customScriptName | string | Ja | URL-Muster für das Skript (z.B. "https://mein-system.com*") |
customScriptCode | string | Ja | JavaScript-Code |
customScriptActive | bool | Ja | Aktivieren/deaktivieren |
Eigenes CSS (customCSSSet_Configuration)
| Key | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
customCSSDescription | string | Ja | Anzeigename |
customCSSName | string | Ja | URL-Muster |
customCSSCode | string | Ja | CSS-Code |
customCSSActive | bool | Ja | Aktivieren/deaktivieren |
Eigene Tastaturen (customKeyboardSet_Configuration)
| Key | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
inputType | string | Ja | Eingabetyp: "default", "text", "password", "number", "email", "tel", "textarea", "custom" |
cKeyboard | string | Ja | Tastatur-Layout als JSON-String |
customParameter | string | Nein | Optionaler Parameter für "custom" |
Scan-Konfiguration (scanConfig_Configuration)
| Key | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
scanConfigName | string | Ja | Anzeigename |
scanConfigLengthRule | string | Ja | Regeltyp: "FALLBACK", "EXACT", "AT_MOST", "AT_LEAST", "LENGTH_RANGE", "STARTS_WITH", "ENDS_WITH", "CONTAINS" |
scanConfigMatchLength | integer | Bedingt | Ziellänge (erforderlich für längenbasierte Regeln) |
scanConfigMatchLengthMax | integer | Bedingt | Maximallänge (erforderlich nur für LENGTH_RANGE) |
scanConfigMatchText | string | Bedingt | Textmuster (erforderlich für STARTS_WITH, ENDS_WITH, CONTAINS) |
scanConfigActions | bundle array | Ja | Liste der Aktionen, die auf einen passenden Scan angewendet werden |
Scan-Aktionen (scanConfigActions - verschachteltes Bundle-Array):
| Key | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
scanConfigActionType | string | Ja | "CUT_FIRST", "CUT_LAST", "TAKE_FIRST", "TAKE_LAST", "PREFIX", "SUFFIX", "INSERT_AT", "EXTRACT", "REPLACE", "REMOVE_LEADING_ZEROS", "REMOVE_TRAILING_ZEROS", "PAD_LEFT", "PAD_RIGHT", "UPPERCASE", "LOWERCASE" |
scanConfigActionCount | integer | Bedingt | Numerischer Parameter (Zeichenanzahl, Position) |
scanConfigActionCount2 | integer | Bedingt | Zweiter numerischer Parameter (z.B. Länge bei EXTRACT) |
scanConfigActionText | string | Bedingt | Textparameter (Präfix/Suffix, Suchwert, Füllzeichen) |
scanConfigActionText2 | string | Nein | Ersetzungswert (bei REPLACE) |




