Skip to content

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.

Screenshot der Intune App Configuration Policy

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.

Screenshot der Intune App Configuration Policy

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

Screenshot der Intune Android Permissions

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:

Screenshot der Intune Android JSON Einstellungen

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:

EinstellungMö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.

Screenshot der Intune user Groups

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.

json
{
  "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

KeyTypErforderlichBeschreibung
flx_licensestringJaTheFlex-Lizenzschlüssel

Klassische Startseiten (fioriURL_Configuration)

KeyTypErforderlichBeschreibung
fioriURLNamestringJaAnzeigename
fioriURLstringJaURL
fioriURLUsernamestringNeinSAP-Benutzername - "/" erhält den lokalen Wert
fioriURLPasswordstringNeinSAP-Passwort - "/" erhält den lokalen Wert
KeyTypErforderlichStandardBeschreibung
menuStartpagesEnabledboolJafalseOrdnerbasierte Menünavigation aktivieren. Hinweis: Wenn aktiviert, werden die klassischen Startseiten (fioriURL_Configuration) nicht mehr im Menü angezeigt.
menuStartpageTitlestringJa-Anzeigename
menuStartpageUrlstringJa-URL der Startseite
menuStartpageFolderstringJa""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:

WertPosition 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
📄 Dashboard

Einträge mit identischem Pfad werden automatisch im selben Ordner gruppiert. Ordner werden implizit angelegt - sie müssen nicht separat definiert werden.

Sicherheit

KeyTypErforderlichStandardBeschreibung
adminPasswordstringJa""Admin-Passwort für den Einstellungszugang
requirePasswordLaunchpadboolJafalsePasswort beim Startseitenwechsel verlangen
SslUntrustIgnoreboolJafalseHTTPS-Verbindungen mit ungültigem Zertifikat erlauben
flxBlockCopyPasteboolJafalseKopieren und Einfügen aus Web-Inhalten sperren
FlxCertChooserboolJafalseZertifikatsauswahl-Dialog beim Login anzeigen
FlxUseSmartcardboolJafalseNFC-Smartcard-Authentifizierung aktivieren
NFCConfigstringJa""Smartcard-Konfiguration (via QR importiert)

Benutzeroberfläche

KeyTypErforderlichStandardBeschreibung
FLXShowStatusBarboolJatrueAndroid-Statusleiste anzeigen
FLXShowNavigationBarboolJatrueAndroid-Navigationsleiste anzeigen
FlxToolbarOverlapboolJatrueToolbar überlagert Inhalte statt sie zu verschieben
FlxShowCloseButtonboolJafalseSchließen-Button in der Toolbar anzeigen
FlxKeepScreenOnboolJafalseBildschirm immer eingeschaltet lassen
FlxConnectionStatusboolJafalseVerbindungsstatus-Anzeige einblenden
ZoomAmountstringJa"100"Seitenzoom in Prozent
flxSelectedLanguagestringJa""App-Sprache: "" (System), "de_DE", "en_EN"

Tastatur

KeyTypErforderlichStandardBeschreibung
FLXSoftInputModeResizeboolJatrueTastatur verschiebt UI-Elemente nach oben
flxKeyboardPreferencesstringJa"default"Tastaturverhalten: "default", "Active_on_tap", "deactivated"

Gekoppeltes Gerät (Backhand-Scanner)

KeyTypErforderlichStandardBeschreibung
flxPairedDevicestringJa"none""none", "PROGLOVE_MARK_DISPLAY_SDK", "NIMMSTA_HS50_SDK"
flxPairedDevice_ScanModestringJa"default""default", "onlyBarcodes", "onlyQRCode"

Cache & Cookies

KeyTypErforderlichStandardBeschreibung
ClearSessionsboolJatrueSession-Daten beim App-Beenden löschen
ClearCacheOnExitboolJatrueDatei-Cache beim App-Beenden löschen
ClearCookieOnSwitchingLaunchpadboolJatrueCookies beim Startseitenwechsel löschen
ClearCacheOnSwitchingLaunchpadboolJatrueDatei-Cache beim Startseitenwechsel löschen

PDF & Anzeige

KeyTypErforderlichStandardBeschreibung
FlxPdfViewerEnabledboolJatruePDF-Links im eingebetteten Viewer öffnen
FlxProgressIndicatorboolJatrueLadeindikator am Bildschirmrand anzeigen
FlxDebugModeboolJafalseErweitertes Debug-Logging aktivieren

Logging

KeyTypErforderlichStandardBeschreibung
LogLevelstringJa"ERROR""ERROR", "WARNING", "INFO", "DEBUG"

Eigene Skripte (customScript_Configuration)

KeyTypErforderlichBeschreibung
customScriptDescriptionstringJaAnzeigename
customScriptNamestringJaURL-Muster für das Skript (z.B. "https://mein-system.com*")
customScriptCodestringJaJavaScript-Code
customScriptActiveboolJaAktivieren/deaktivieren

Eigenes CSS (customCSSSet_Configuration)

KeyTypErforderlichBeschreibung
customCSSDescriptionstringJaAnzeigename
customCSSNamestringJaURL-Muster
customCSSCodestringJaCSS-Code
customCSSActiveboolJaAktivieren/deaktivieren

Eigene Tastaturen (customKeyboardSet_Configuration)

KeyTypErforderlichBeschreibung
inputTypestringJaEingabetyp: "default", "text", "password", "number", "email", "tel", "textarea", "custom"
cKeyboardstringJaTastatur-Layout als JSON-String
customParameterstringNeinOptionaler Parameter für "custom"

Scan-Konfiguration (scanConfig_Configuration)

KeyTypErforderlichBeschreibung
scanConfigNamestringJaAnzeigename
scanConfigLengthRulestringJaRegeltyp: "FALLBACK", "EXACT", "AT_MOST", "AT_LEAST", "LENGTH_RANGE", "STARTS_WITH", "ENDS_WITH", "CONTAINS"
scanConfigMatchLengthintegerBedingtZiellänge (erforderlich für längenbasierte Regeln)
scanConfigMatchLengthMaxintegerBedingtMaximallänge (erforderlich nur für LENGTH_RANGE)
scanConfigMatchTextstringBedingtTextmuster (erforderlich für STARTS_WITH, ENDS_WITH, CONTAINS)
scanConfigActionsbundle arrayJaListe der Aktionen, die auf einen passenden Scan angewendet werden

Scan-Aktionen (scanConfigActions - verschachteltes Bundle-Array):

KeyTypErforderlichBeschreibung
scanConfigActionTypestringJa"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"
scanConfigActionCountintegerBedingtNumerischer Parameter (Zeichenanzahl, Position)
scanConfigActionCount2integerBedingtZweiter numerischer Parameter (z.B. Länge bei EXTRACT)
scanConfigActionTextstringBedingtTextparameter (Präfix/Suffix, Suchwert, Füllzeichen)
scanConfigActionText2stringNeinErsetzungswert (bei REPLACE)