Bewährte Methoden für iOS-Apps

Verwenden Sie beim Entwickeln von iOS-Apps die hier aufgeführten bewährten Methoden zum Verbessern der App-Kompatibilität mit Citrix Endpoint Management für iOS-Geräte.

MDX App SDK Framework und Umschließen

Wenn Ihre App das MDX App SDK-Framework verwendet, müssen Sie sie mit der entsprechenden MDX Toolkit-Version umschließen. Ein Versionskonflikt zwischen den beiden Komponenten kann zu Betriebsfehlern führen.

Um dies zu verhindern, umschließen Sie die App als ISV-App und geben Sie als App-Modus Premium oder Allgemein an. Auf diese Weise können Sie eine umschlossene App bereitstellen. Der Kunde muss die App dann nicht selbst umschließen, wodurch ein Versionskonflikt beim MDX Toolkit vermieden wird. Weitere Informationen über das Umschließen von Apps unabhängiger Softwarehersteller finden Sie unter Umschließen von mobilen iOS-Apps.

Verwenden expliziter App-IDs

Wenn Ihr iOS Developer Enterprise-Konto keine Platzhalter-App-IDs unterstützt, erstellen Sie eine explizite App-ID für jede App, die Sie mit dem MDX Toolkit umschließen möchten. Erstellen Sie außerdem ein Provisioningprofil für jede App-ID.

Hauptthread nicht blockieren

Verwenden Sie keinen blockierenden Code beim Ausführen im Hauptthread. Dies ist eine Richtlinie von Apple, die jedoch für Citrix Endpoint Management noch wichtiger ist. Einige Aktionen brauchen bei einer verwalteten App möglicherweise länger oder können das weitere Ausführen des Threads blockieren. Beispielsweise können Datei-, Datenbank- und Netzwerkvorgänge den ausgeführten Thread blockieren und sollten daher nicht auf dem Hauptthread ausgeführt werden.

Robusten Code schreiben

Insbesondere sollten Sie bei der App-Entwicklung die in den Leitfäden von Apple, z. B. im Apple Application Programming Guide, aufgeführten bewährten Methoden anwenden.

Nur von Apple veröffentlichte Schnittstellen verwenden

Überprüfen Sie Rückgabewerte von allen API-Aufrufen und behandeln Sie alle Ausnahmen, die als Nebeneffekt eines API-Aufrufs auftreten können. Dieser Aufwand stellt eine Fehlerwiederherstellung oder eine ordnungsgemäße Beendigung der App sicher. Obwohl dies eine gängige Programmierpraxis ist, ist es besonders wichtig für verwaltete Apps.

Verschiedene APIs, die normalerweise funktionieren, schlagen fehl, wenn die zugrunde liegende Funktionalität von Citrix Endpoint Management-Richtlinien blockiert wird. Als Beispiele können alle zuvor beschriebenen Funktionen gelten:

  • Netzwerk-APIs schlagen fehl, wenn kein Netzwerk verfügbar ist.
  • Sensor-APIs, z. B. GPS und Kamera, geben NULL-Werte zurück oder lösen eine Ausnahme aus.

Die folgenden Objective-C-Laufzeitselektoren geben einen NULL-Wert zurück, wenn die zugrunde liegende Funktionalität durch eine Citrix Endpoint Management-Richtlinie blockiert wird, und erfordern eine entsprechende Lösung.

Objektklasse: AVCaptureDevice

  • Selektorname: devicesWithMediaType:

Objektklasse: MFMailComposeViewController

  • Selektorname: init:

Objektklasse: MFMessageComposeViewController

  • Selektorname: initWithNibName:bundle:

Objektklasse: NSFileManager

  • Selektorname: URLForUbiquityContainerIdentifier:

Objektklasse: NSUbiquitousKeyValueStore

  • Selektorname: defaultStore:

Objektklasse: PHPhotoLibrary

  • Selektorname: sharedPhotoLibrary:

Objektklasse: UIImagePickerController

  • Selektorname: availableCaptureModesForCameraDevice:

Objektklasse: UIPasteboard

  • Selektorname:

    dataForPasteboardType:

    valueForPasteboardType:

    items:

    dataForPasteboardType:inItemSet:

    valuesForPasteboardType:inItemSet:

Objektklasse: UIPopoverController

  • Selektorname: initWithContentViewController:

Objektklasse: UINavigationController

  • Selektorname:

    ctxInitWithRootViewController:

    ctxPopToViewController:animated:

Umleiten von Laufzeitschnittstellen

Citrix Endpoint Management bietet Interaktion zur UI-PIN-Eingabeaufforderung, damit Sie dies in Ihrer App nicht realisieren müssen.

Um die Bereitschaft von Citrix Endpoint Management sicherzustellen, sollten Sie Objective-C-Laufzeitselektoren nicht umleiten oder ersetzen. Grund dafür ist, dass Citrix Endpoint Management die zugrunde liegenden Methoden mehrerer Objektklassenselektoren swizzelt, um das Laufzeitverhalten von Apps zu steuern und/oder zu ändern. Die folgende Tabelle enthält die Objective-C-Klassenselektoren, die von Citrix Endpoint Management umgeleitet werden:

Objektklassenname: NSURLProtectionSpace

  • Selektorname: serverTrust

Objektklassenname: NSURLAuthenticationChallenge

  • Selektorname: sender

Objektklassenname: NSURLConnection

  • Selektorname:

    sendSynchronousRequest:returningResponse:error:

    initWithRequest:delegate:startImmediately:

    initWithRequest:delegate:

    connectionWithRequest:delegate:

Objektklassenname: NSURLConnectionDelegate

  • Selektorname:

    connection:canAuthenticateAgainstProtectionSpace:

    connection:didReceiveAuthenticationChallenge:

    connection:willSendRequestForAuthenticationChallenge:

Objektklassenname: NSURLSessionConfiguration

  • Selektorname:

    defaultSessionConfiguration

    ephemeralSessionConfiguration

Objektklassenname: ALAssetsLibrary

  • Selektorname: authorizationStatus

Objektklassenname: AVAudioRecorder

  • Selektorname:

    record

    prepareToRecord

    recordForDuration:

    recordAtTime:

    recordAtTime:ForDuration:

Objektklassenname: AVAudioSession

  • Selektorname: recordPermission

Objektklassenname: AVCaptureDevice

  • Selektorname:

    Geräte

    devicesWithMediaType:

Objektklassenname: AVAsset

  • Selektorname: assetWithURL:

Objektklassenname: AVURLAsset

  • Selektorname:

    initWithURL:options:

    URLAssetWithURL:options:

Objektklassenname: AVPlayerItem

  • Selektorname:

    playerItemWithAsset:

    initWithURL:

    playerItemWithURL:

Objektklassenname: AVPlayer

  • Selektorname:

    playerWithPlayerItem:

    initWithPlayerItem:

    initWithURL:

Objektklassenname: CLLocationManager

  • Selektorname: startUpdatingLocation

Objektklassenname: UIScrollView

  • Selektorname: setContentOffset:

Objektklassenname: MFMailComposeViewController

  • Selektorname:

    canSendMail

    init

Objektklassenname: MFMessageComposeViewController

  • Selektorname:

    canSendText

    initWithNibName:Paket:

Objektklassenname: NSFileManager

  • Selektorname: URLForUbiquityContainerIdentifier:

Objektklassenname: NSUbiquitousKeyValueStore

  • Selektorname: defaultStore

Objektklassenname: PHPhotoLibrary

  • Selektorname: authorizationStatus

Objektklassenname: QLPreviewController

  • Selektorname:

    setDataSource:

    canPreviewItem:

Objektklassenname: QLPreviewControllerDataSource

  • Selektorname:

    numberOfPreviewItemsInPreviewController:

    previewController:previewItemAtIndex:

Objektklassenname: SLComposeViewController

  • Selektorname: isAvailableForServiceType:

Objektklassenname: UIActivityViewController

  • Selektorname:

    initWithActivityItems:applicationActivities:

    setExcludedActivityTypes:

Objektklassenname: UIApplication

  • Selektorname:

    openURL:

    canOpenURL:

    setApplicationIconBadgeNumber:

Objektklassenname: UIDocument

  • Selektorname:

    closeWithCompletionHandler:

    contentsForType:error:

Objektklassenname: UIDocumentInteractionController

  • Selektorname:

    interactionControllerWithURL:

    setURL:

    setDelegate:

    presentPreviewAnimated:

    presentOpenInMenuFromBarButtonItem:animated:

    presentOpenInMenuFromRect:inView:animated:

    presentOptionsMenuFromBarButtonItem:animated:

    presentOptionsMenuFromRect:inView:animated:

Objektklassenname: UIDocumentMenuViewController

  • Selektorname: initWithDocumentTypes:inMode:

Objektklassenname: UIImage

  • Selektorname: imageNamed:

Objektklassenname: UIImagePickerController

  • Selektorname: setSourceType:

    takePicture

    startVideoCapture

    isSourceTypeAvailable:

    isCameraDeviceAvailable:

    isFlashAvailableForCameraDevice:

    availableCaptureModesForCameraDevice:

    setMediaTypes

Objektklassenname: UINavigationController

  • Selektorname:

    ctxInitWithRootViewController:

    ctxPushViewController:animated:

    ctxPopToViewController:animated:

Objektklassenname: UIPasteboard

  • Selektorname:

    generalPasteboard

    pasteboardWithName:create:

    pasteboardWithUniqueName

    setValue:forPasteboardType:

    setData:forPasteboardType:

    setItems:

    addItems:

    dataForPasteboardType:

    valueForPasteboardType:

    numberOfItems

    pasteboardTypes

    pasteboardTypesForItemSet:

    containsPasteboardTypes:

    containsPasteboardTypes:inItemSet:

    Elemente

    itemSetWithPasteboardTypes:

    dataForPasteboardType:inItemSet:

    valuesForPasteboardType:inItemSet:

    Zeichenfolge

    Zeichenfolgen

    URL

    URLs

    Abbildung

    Abbildungen

    color

    colors

Objektklassenname: UIPopoverController

  • Selektorname: initWithContentViewController

Objektklassenname: UIPrintInteractionController

  • Selektorname:

    isPrintingAvailable

    presentAnimated:completionHandler:

    presentFromBarButtonItem:animated:completionHandler:

    presentFromRect:inView:animated:completionHandler:

Objektklassenname: UIViewController

  • Selektorname: presentViewController:animated:completion:

Objektklassenname: UIWebView

  • Selektorname:

    loadRequest:

    setDelegate:

    UIWebViewDelegate

    webView:shouldStartLoadWithRequest:navigationType:

    webViewDidStartLoad:

    webViewDidFinishLoad:

    webView:didFailLoadWithError:

Objektklassenname: UIWindow

  • Selektorname: makeKeyAndVisible

Objektklassenname: UIApplicationDelegate

  • Selektorname:

    applicationDidFinishLaunching:

    application:didFinishLaunchingWithOptions:

    application:willFinishLaunchingWithOptions:

    applicationWillResignActive:

    applicationDidEnterBackground:

    applicationWillEnterBackground:

    applicationDidBecomeActive:

    applicationWillTerminate:

    application:openURL:sourceApplication:annotation:

    application:handleOpenURL:

    applicationProtectedDataWillBecomeUnavailable:

    applicationProtectedDataDidBecomeAvailable:

    application:performFetchWithCompletionHandler:

    application:handleEventsForBackgroundURLSession:completionHandler:

    application:didReceiveLocalNotification:

    application:didReceiveRemoteNotification:

    application:didReceiveRemoteNotification:fetchCompletionHandler:

    application:didRegisterForRemoteNotificationsWithDeviceToken:

    application:didFailToRegisterForRemoteNotificationsWithError:

    applicationSignificantTimeChange:

    application:shouldAllowExtensionPointIdentifier:

Objektklassenname: QLPreviewController

  • Selektorname: allocWithZone:

Sicherstellen der Datenverschlüsselungskompatibilität

Eines der primären Features von MDX ist die transparente Verschlüsselung aller persistenten Daten. Sie brauchen Ihre App zur Nutzung dieses Features nicht zu ändern, es lässt sich sogar nicht direkt umgehen. Der Citrix Endpoint Management-Administrator kann die Verschlüsselung selektiv oder vollständig deaktivieren, nicht jedoch die App.

Dies ist eines der wichtigeren Merkmale von MDX und erfordert die Kenntnis folgender Punkte:

  • Die Dateiverschlüsselung gilt für den gesamten systemeigenen Code, der in verwalteten Prozessen ausgeführt wird.

    Die Implementierung der Dateiverschlüsselung unterstützt den gesamten systemeigenen Code, nicht nur Code für Apps, die Apple-Frameworks und die Apple Objective-C-Laufzeit verwenden. Eine ausschließlich in der und für die Objective-C-Laufzeit implementierte Dateiverschlüsselung kann leicht überwunden werden.

  • Einige Framework-APIs, z. B. solche der Klassen AVPlayer, UIWebView und QLPreviewController, werden von iOS-Dienstprozessen in einem anderen Ausführungskontext als dem der verwalteten Apps eines Benutzers implementiert.

    Diese Dienstprozesse können MDX-verschlüsselte Dateidaten nicht entschlüsseln. Daher muss die verwaltete App dem Dienstprozess eine temporäre unverschlüsselte Kopie der Daten bereitstellen. Die Kopie wird von der verwalteten App nach 5 Sekunden gelöscht. Es ist wichtig, dass Sie sich der Einschränkung bewusst sind, wenn Sie diese Klassen verwenden. Der Grund ist, dass wir durch die Apple-Implementierung der spezifischen Klassen die Kontrolle über die Einschränkung der Daten verlieren, die diesen Klassen zur Verfügung gestellt werden.

  • Die Speicherzuordnung ist für die Citrix Endpoint Management-Verschlüsselung problematisch, da sie erfordert, dass eine App für Dateien E/A-Systemaufrufschnittstellen aufruft.

    Nach der Speicherzuordnung einer Datei werden E/A-Anforderungen für die Datei außerhalb des App-Kontexts unter Umgehung der Citrix Endpoint Management-Verschlüsselung verwaltet. Alle POSIX mmap(2)-Aufrufe verwalteter Apps werden als MAP_PRIVATE und MAP_ANON zugewiesen und keiner Dateiverschlüsselung zugeordnet. Während des mmap-Aufrufs wird versucht, alle zugewiesenen Daten einzulesen, wenn eine entsprechende Dateibeschreibung vorliegt, da jegliche anschließende Auslagerung von Daten durch das Betriebssystem zum Lesen verschlüsselter Daten ohne Entschlüsselung durch Citrix Endpoint Management führt. Diese Methode war bei allen mit Citrix Endpoint Management getesteten Apps erfolgreich, da die Menge der dem Speicher zugewiesenen Daten klein ist und innerhalb von Apps keine Speicherseitenfreigaben erfolgen.

  • Verschlüsselung erzeugt spürbaren Mehraufwand. Die Datenträger-E/A muss optimiert werden, um Leistungseinbußen zu verhindern. Es kann beispielsweise ein Cache auf App-Ebene implementiert werden, da wiederholt die gleichen Informationen gelesen und geschrieben werden.

  • Citrix Endpoint Management verschlüsselt nur Instanzen von Apple libsqlite.dylib. Wenn die Anwendung eine direkte Verknüpfung mit einer private Version der libsqlite.dylib verwendet und/oder sie einbettet, werden die Datenbankinstanzen dieser privaten Bibliothek nicht von Citrix Endpoint Management verschlüsselt.

  • Apple SQLite-Datenbanken werden von Citrix Endpoint Management über die Ebene des virtuellen SQLite-Dateisystems verschlüsselt.

    Es kann hier zu Leistungsproblemen kommen. Die Standardgröße des Datenbankcaches ist 2000 Seiten bzw. 8 MB. Für eine große Datenbank muss die Cachegröße möglicherweise per SQLite-PRAGMA erhöht werden. Im Objective-C-Core Data-Framework kann das SQLite-PRAGMA als Optionswörterbuch zusammen mit dem Objekt des persistenten Speichers zum Objekt des persistenten Speichercontrollers hinzugefügt werden.

  • Der SQLite-WAL-Modus wird nicht unterstützt, da die Bibliothek mit Datei-E/A-Schnittstellen neu verknüpft wird und intern die Speicherzuordnung intensiv genutzt wird.

  • NSURLCache DiskCache ist bei iOS über eine SQLite-Datenbank implementiert. Citrix Endpoint Management deaktiviert den zugewiesenen Datenträgercache, da diese Datenbank von nicht verwalteten iOS-Dienstprozessen referenziert wird.

  • Es folgt eine Liste der hartcodierten ausgeschlossenen Dateipfadnamensmuster:

    • .plist: Ausgeschlossen, da iOS-Systemprozesse außerhalb des Prozesskontexts Zugriff haben.
    • .app: Legacyteilzeichenfolge im Anwendungspaketnamen. Die Teilzeichenfolge ist veraltet, da ein expliziter Anwendungspaketpfad jetzt ausgeschlossen ist.
    • .db: Eine Datei mit diesem Suffix wird nicht verschlüsselt, wenn es keine SQLite-Datenbank ist.
    • /System/Library: Dateipfade im Sandboxverzeichnis des App-Pakets und Dateipfade außerhalb der App-Datensandbox können nicht verschlüsselt werden. Eine unter iOS installierte App ist schreibgeschützt und in einem anderen Verzeichnis als die von ihr bei ihrer Ausführung erzeugten und gespeicherten Datendateien.
    • Library/Preferences: Auf Dateien wird von iOS direkt zugegriffen. Normalerweise sind in diesem Pfad nur PLIST-Dateien.
    • /com.apple.opengl/: iOS greift direkt auf die Dateien zu.
    • csdk.db: Legacy Citrix SSLSDK-SQLite-Datenbank
    • /Library/csdk.sql: Citrix SSLSDK-SQLite-Datenbank
    • CtxLog_: Präfix der Citrix-Protokolldatei
    • CitrixMAM.config: MDX-interner Dateiname
    • CitrixMAM.traceLog: Legacy-MDX-interner Dateiname
    • CtxMAM.log: MDX-interner Dateiname
    • data.999: MDX-interner Dateiname
    • CTXWrapperPersistentData: MDX-interner Dateiname
    • /Documents/CitrixLogs: MDX-Protokollverzeichnis
    • /Document/CitrixLogs.zip: Name des komprimierten MDX-Protokollverzeichnisses
    • Jede Datei im App-Bundle-Verzeichnispfad: Schreibgeschütztes Verzeichnis der App-Dateien
  • Citrix Endpoint Management ersetzt zur Laufzeit Instanzen der Apple-Objective-C-QLPreviewController-Objektklasse durch eine Instanz der privaten Citrix Endpoint Management-SecureViewController-Klasse. Die Citrix Endpoint Management-SecureViewController-Klasse wird aus der Apple-Objective-C-UIWebView-Objektklasse abgeleitet. Die QLPreviewController-Objektklasse unterstützt einige Dateiformate nativ, die von der UIWebView-Objektklasse nicht nativ unterstützt werden (z. B. die Audio- und PDF-Dateien).

  • Zur Erzielung der optimalen Leistung sollten Datei-E/A-Anforderungen für Dateioffsets ausgegeben werden, die ein Vielfaches von 4096 Byte sind, sowie für eine Länge, die ebenfalls ein Vielfaches von 4096 Byte ist.

  • Das Dateimodusflag O_NONBLOCK wird von der Citrix Endpoint Management-Verschlüsselung nicht unterstützt. Dieses Dateimodusflag wird bei der Verarbeitung durch Citrix Endpoint Management aus der Modusliste entfernt.

Verschlüsselung und Benutzerentropie

Eine Citrix Endpoint Management-Verschlüsselungsoption macht es erforderlich, dass Benutzer eine PIN eingeben, bevor der Verschlüsselungsschlüssel generiert werden kann. Diese Option wird als “Benutzerentropie” bezeichnet. Sie kann für Apps bestimmte Probleme verursachen.

Insbesondere ist vor Eingabe einer PIN kein Zugriff auf Dateien oder Datenbanken möglich. Entsprechende E/A-Vorgänge, die ausgeführt werden müssen, bevor das PIN-Eingabe-UI angezeigt werden kann, schlagen fehl.

Um sicherzustellen, dass dieses Problem bei Ihrer App nicht auftritt, testen Sie diese mit aktivierter Benutzerentropie. Die Citrix Endpoint Management-Clienteigenschaft “Encrypt secrets using Passcode” fügt Benutzerentropie hinzu. Die Eigenschaft ist standardmäßig deaktiviert und kann über die Citrix Endpoint Management-Konsole unter Konfigurieren > Einstellungen > Mehr > Clienteigenschaften konfiguriert werden.

Dateneinschluss – Kompatibilität

  • Kein Remoteansichtcontroller bietet Einschlusssicherheit (z. B. Datenverschlüsselung, Blockieren von Ausschneiden, Kopieren und Einfügen per Richtlinie usw.), da Remoteansichtcontroller in einem anderen Prozesskontext als die mit MDX verwaltete App ausgeführt werden.
  • Die Kopieraktion ist die einzige von UIResponder unterstützte Aktion. Andere Aktionen, z. B. Ausschneiden oder Löschen, werden nicht unterstützt.
  • AirDrop wird nur auf UI-Ebene abgefangen, nicht aber auf einer niedrigeren Ebene.
  • MFI und Bluetooth werden nicht abgefangen.

Unterstützung für Symboldateien

Das Umschließen mit MDX erfordert, dass mindestens ein Symbol vorliegt, das als Homebildschirmsymbol oder App-Symbol verwendet werden kann. App-Entwickler können ihre Symbole dem Bestandskatalog hinzufügen oder die Schlüssel CFBundleIcons oder CFBundleIconFiles in Info.plist verwenden.

Das MDX Toolkit verwendet das erste Symbol in der Liste der plist-Speicherorte in der Datei Info.plist:

  • CFBundleIcons
  • CFBundlePrimaryIcon
  • CFBundleIconFiles
  • UINewsstandIcon
  • CFBundleDocumentTypes

Wenn keiner dieser Schlüssel in der Datei Info.plist gefunden wird, identifiziert das MDX Toolkit eines der folgenden Symbole im Stammordner des App-Bündels:

  • Icon.png
  • Icon-60@2x.png
  • Icon-72.png
  • Icon-76.png

Netzwerk und Micro VPN

MDX verwaltet zurzeit nur direkt von einer App ausgegebene Netzwerkaufrufe. Einige DNS-Abfragen werden direkt vom Apple-Framework ausgegeben und daher nicht von MDX verwaltet.

Mehrere Citrix Endpoint Management-Richtlinienoptionen stehen Administratoren für das Netzwerk zur Verfügung.

Mit der Netzwerkzugriffsrichtlinie kann die Netzwerkaktivität einer App verhindert, zugelassen oder umgeleitet werden:

Wichtig:

Das MDX Toolkit Version 18.12.0 enthält neue Richtlinien, die ältere Richtlinien kombinieren oder ersetzen. Die Richtlinie “Netzwerkzugriff” kombiniert “Netzwerkzugriff”, “Bevorzugter VPN-Modus” und “VPN-Moduswechsel zulassen”. Die Richtlinie “Ausschlussliste” ersetzt “Split-Tunnelausschlussliste”. Die Richtlinie “Micro-VPN-Sitzung erforderlich” ersetzt “Onlinesitzung erforderlich”. Einzelheiten finden Sie unter Was ist neu in früheren Releases.

“Tunnel - Web-SSO” ist der Name für Secure Browse in den Einstellungen. Das Verhalten ist dasselbe.

Die folgenden Optionen stehen zur Auswahl:

  • Vorherige Einstellungen verwenden: Standardmäßig werden die Werte aus früheren Richtlinien verwendet. Wenn Sie diese Option ändern, sollten Sie nicht auf Vorherige Einstellungen verwenden zurückkehren. Beachten Sie auch, dass Änderungen an den neuen Richtlinien erst wirksam werden, nachdem der Benutzer die App auf Version 18.12.0 oder später aktualisiert.
  • Blockiert: Netzwerk-APIs, die von Ihrer App verwendet werden, schlagen fehl. Ein solcher Fehler sollte gemäß der o. a. Richtlinie durch ein kontrolliertes Beenden der App behandelt werden.
  • Uneingeschränkt: Alle Netzwerkaufrufe gehen direkt und sind nicht getunnelt.
  • Tunnel - Vollständiges VPN: Der gesamte Datenverkehr der verwalteten App wird über den Citrix Gateway-Tunnel geleitet.
  • Tunnel - Web-SSO: Die HTTP/HTTPS-URL wird neu geschrieben. Diese Option erlaubt nur das Tunneln von HTTP- und HTTPS-Datenverkehr. Große Vorteile von Tunnel - Web-SSO sind Single Sign-On (SSO) für HTTP- und HTTPS-Datenverkehr und die PKINIT-Authentifizierung. Unter Android ist die Einrichtung dieser Option mit geringem Mehraufwand verbunden, es bildet daher die bevorzugte Option für Webbrowsingvorgänge.
  • Tunnel - Vollständiges VPN und Web-SSO: Ermöglicht bei Bedarf den automatischen Wechsel zwischen VPN-Modi. Wenn eine Netzwerkanfrage fehlschlägt, weil eine Authentifizierungsanfrage nicht im gewählten VPN-Modus verarbeitet werden kann, wird ein anderer Modus versucht.

Einschränkungen

  • Benutzer können Videos, die auf internen Websites gehostet werden, nicht in mit dem MDX Toolkit umschlossenen iOS-Apps wiedergeben, weil die Videos in einem Media Player-Prozess auf dem Gerät wiedergegeben werden, den MDX nicht abfängt.
  • NSURLSession-Downloads im Hintergrund (NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier) werden nicht unterstützt.
  • UDP-Datenverkehr wird blockiert, wenn die Netzwerkzugriffsrichtlinie auf Blockiert festgelegt ist. Der UDP-Datenverkehr wird nicht getunnelt, wenn die Netzwerkzugriffsrichtlinie auf Tunnel - Vollständiges VPN festgelegt ist.
  • Mit MDX umschlossenen Apps können keinen Socket-Server instanziieren, der auf eingehende Verbindungen lauscht. Allerdings können mit MDX umschlossene Apps ein Client-Socket zum Herstellen einer Verbindung mit einem Server verwenden.

Unterstützung für Drittanbieter-Bibliotheken

Bei einigen App-Frameworks bestehen Kompatibilitätsprobleme mit Citrix Endpoint Management:

  • Apps, die mit der plattformübergreifenden Entwicklungsumgebung Xamarin entwickelt wurden, werden unterstützt. Citrix deklariert nicht offiziell die Unterstützung für andere plattformübergreifenden Entwicklungsumgebungen, da zu wenig Anwendungsbeispiele vorliegen und Tests durchgeführt wurden.
  • SQLCipher funktioniert nicht mit Verschlüsselung, da es die Speicherzuordnung verwendet. Eine Lösung besteht darin, SQLCipher nicht zu verwenden. Eine zweite Lösung besteht darin, die Datenbankdatei über eine entsprechende Richtlinie von der Verschlüsselung auszunehmen. Ein Citrix Endpoint Management-Administrator muss die Richtlinie über die Citrix Endpoint Management-Konsole konfigurieren.
  • Bei einer direkten Verknüpfung von App-Bibliotheken und Drittanbieter-Bibliotheken mit den OpenSSL-Bibliotheken libcrypto.a und libssl.a kann aufgrund fehlender Symbole und mehrfacher Symboldefinitionen ein Verknüpfungsfehler auftreten.
  • Für Apps, die Unterstützung für den Apple Dienst für Push-Benachrichtigungen erfordern, müssen spezifische, von Apple geforderte Schritte befolgt werden.
  • Citrix Endpoint Management legt die SQLite-Datenbankversion explizit auf 1 fest, um die Write Ahead Logging-Datei (WAL) und die Unterstützung für speicherzugewiesene Dateien innerhalb von SQLite-Datenbanken zu deaktivieren. Der direkte Zugriff auf SQLite-Schnittstellen in Version 2 und 3 von SQLite schlägt fehl.