Product Documentation

Bewährte Methoden für iOS-Apps

27. Februar 2018

Verwenden Sie beim Entwickeln von iOS-Apps die hier aufgeführten bewährten Methoden zum Verbessern der App-Kompatibilität mit XenMobile.

MDX App SDK-Framework und Umschließung

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. Einzelheiten über das Umschließen von ISV-Apps finden Sie unter Umschließen von mobilen iOS-Apps in der MDX Toolkit-Dokumentation.

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, und ein Provisioningprofil für jede App-ID.

Hauptthread nicht blockieren

Bei Ausführung auf dem Hauptthread verwenden Sie keinen blockierenden Code. Dies ist eine Richtlinie von Apple, die jedoch für XenMobile noch wichtiger ist. Einige Aktionen brauchen bei einer verwalteten App möglicherweise länger oder blockieren sogar die weitere Threadausführung. Datei-, Datenbank- und Netzwerkvorgänge können beispielsweise den ausgeführten Thread blockieren und sollten daher nicht auf dem Hauptthread ausgeführt werden.

Schreiben Sie robusten Code

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.

Verwenden Sie nur von Apple veröffentlichte Schnittstellen.

Prüfen Sie die Rückgabewerte aller API-Aufrufe und behandeln Sie Ausnahmen, die als Nebenwirkung eines API- Aufrufs auftreten, durch ordnungsgemäßes Wiederherstellen oder Beenden der App. Diese bewährte Methode gilt allgemein bei der Programmierung, für verwaltete Apps ist sie jedoch besonders wichtig.

Verschiedene APIs, die normalerweise immer funktionieren, schlagen fehl, wenn die zugrunde liegende Funktionalität von XenMobile-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 XenMobile-Richtlinie blockiert wird, und erfordern eine entsprechende Lösung.

Objektklasse Selektorname
AVCaptureDevice devicesWithMediaType:
MFMailComposeViewController init:
MFMessageComposeViewController initWithNibName:Paket:
NSFileManager URLForUbiquityContainerIdentifier:
NSUbiquitousKeyValueStore defaultStore:
PHPhotoLibrary sharedPhotoLibrary:
UIImagePickerController availableCaptureModesForCameraDevice:
UIPasteboard dataForPasteboardType:
  valueForPasteboardType:
  items:
  dataForPasteboardType:inItemSet:
  valuesForPasteboardType:inItemSet:
UIPopoverController initWithContentViewController:
UINavigationController ctxInitWithRootViewController:
  ctxPopToViewController:animated:

Umleiten von Laufzeitschnittstellen

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

Zur Gewährleistung der Eignung für XenMobile wird empfohlen, Objective-C-Laufzeitselektoren nicht umzuleiten oder zu ersetzen, da XenMobile 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 XenMobile umgeleitet werden:

Objektklassenname Selektorname
NSURLProtectionSpace serverTrust
NSURLAuthenticationChallenge sender
NSURLConnection sendSynchronousRequest:returningResponse:error:
  initWithRequest:delegate:startImmediately:
  initWithRequest:delegate:
  connectionWithRequest:delegate:
NSURLConnectionDelegate connection:canAuthenticateAgainstProtectionSpace:
  connection:didReceiveAuthenticationChallenge:
  connection:willSendRequestForAuthenticationChallenge:
NSURLSessionConfiguration defaultSessionConfiguration
  ephemeralSessionConfiguration
ALAssetsLibrary authorizationStatus
AVAudioRecorder record
  prepareToRecord
  RecordForDuration:
  RecordAtTime:
  RecordAtTime:ForDuration:
AVAudioSession recordPermission
AVCaptureDevice devices
  devicesWithMediaType:
AVAsset assetWithURL:
AVURLAsset initWithURL:options:
  URLAssetWithURL:options:
AVPlayerItem PlayerItemWithAsset:
  initWithURL:
  playerItemWithURL:
AVPlayer playerWithPlayerItem:
  initWithPlayerItem:
  initWithURL:
CLLocationManager startUpdatingLocation
UIScrollView setContentOffset:
MFMailComposeViewController canSendMail
  init
MFMessageComposeViewController canSendText
  initWithNibName:Paket:
NSFileManager URLForUbiquityContainerIdentifier:
NSUbiquitousKeyValueStore defaultStore:
PHPhotoLibrary authorizationStatus
QLPreviewController setDataSource:
  canPreviewItem:
QLPreviewControllerDataSource numberOfPreviewItemsInPreviewController:
  previewController:previewItemAtIndex:
SLComposeViewController isAvailableForServiceType:
UIActivityViewController initWithActivityItems:applicationActivities:
  setExcludedActivityTypes:
UIApplication openURL:
  canOpenURL:
  setApplicationIconBadgeNumber:
UIDocument closeWithCompletionHandler:
  contentsForType:error:
UIDocumentInteractionController interactionControllerWithURL:
  setURL:
  setDelegate:
  presentPreviewAnimated:
  presentOpenInMenuFromBarButtonItem:animated:
  presentOpenInMenuFromRect:inView:animated:
  presentOptionsMenuFromBarButtonItem:animated:
  presentOptionsMenuFromRect:inView:animated:
UIDocumentMenuViewController initWithDocumentTypes:inMode:
UIImage imageNamed:
UIImagePickerController setSourceType:
  takePicture
  startVideoCapture
  isSourceTypeAvailable:
  isCameraDeviceAvailable:
  isFlashAvailableForCameraDevice:
  availableCaptureModesForCameraDevice:
  setMediaTypes
UINavigationController ctxInitWithRootViewController:
  ctxPushViewController:animated:
  ctxPopToViewController:animated:
UIPasteboard generalPasteboard
  pasteboardWithName:create:
  pasteboardWithUniqueName
  setValue:forPasteboardType:
  setData:forPasteboardType:
  setItems:
  addItems:
  dataForPasteboardType:
  valueForPasteboardType:
  numberOfItems
  pasteboardTypes
  pasteboardTypesForItemSet:
  containsPasteboardTypes:
  containsPasteboardTypes:inItemSet:
  Elemente
  itemSetWithPasteboardTypes:
  dataForPasteboardType:inItemSet:
  valuesForPasteboardType:inItemSet:
  string
  strings
  URL
  URLs
  Bild
  Bilder
  color
  colors
UIPopoverController initWithContentViewController
UIPrintInteractionController isPrintingAvailable
  presentAnimated:completionHandler:
  presentFromBarButtonItem:animated:completionHandler:
  presentFromRect:inView:animated:completionHandler:
UIViewController presentViewController:animated:completion:
UIWebView loadRequest:
  setDelegate:
UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:
  webViewDidStartLoad:
  webViewDidFinishLoad:
  webView:didFailLoadWithError:
UIWindow makeKeyAndVisible
UIApplicationDelegate 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:
QLPreviewController allocWithZone:

Datenverschlüsselung und iOS 9

Wichtig:

Mit dem MDX Toolkit 10.0.x umschlossene Apps können nicht unter iOS 9 ausgeführt werden. ISV-Apps müssen mit dem MDX Toolkit 10.2 erneut umschlossen werden. Die Benutzer müssen die aktualisierten Apps installieren, bevor sie ein Geräteupgrade auf iOS 9 durchführen. Wenn ein Benutzer versucht, eine mit dem MDX Toolkit 10.0.x umschlossene App unter iOS 9 zu installieren, kann die App nicht aktualisiert werden und der Benutzer muss eine mit dem MDX Toolkit 10.2 umschlossene Version der App installieren.

Aufgrund der Änderungen an iOS 9 ist die MDX-Verschlüsselung nicht für Daten verfügbar, die aus einer umschlossenen App auf ein iOS 9-Gerät heruntergeladen werden. Ein Gerätepasscode ist für die Verschlüsselung von App-Daten mit der iOS-Dateiverschlüsselung erforderlich. Zum Schützen der Daten stehen folgende Optionen zur Auswahl:

  • Standardmäßig erfordern umschlossene Apps auf iOS 9-Geräten eine PIN oder einen Passcode.
  • Neben dem Erzwingen einer PIN bzw. eines Passcodes können Sie auch eine minimale iOS-Datenschutzklasse für Apps festlegen, es sei denn, in iOS ist bereits eine höhere Schutzebene festgelegt

Zur Unterstützung des iOS-Sicherheitsgrads gibt es im MDX Toolkit 10.2 die neue Richtlinie “Gerätepasscode”, durch die eine PIN oder ein Passcode auf iOS 9-Geräten erzwungen wird. Standardmäßig ist diese Richtlinie Ein. Die Richtlinie wird auf App-Basis angewendet und kann bei Ausführung von XenMobile im MDM- und im MAM-Modus verwendet werden.

Mit dem MDX Toolkit 10.2 umschlossene Apps verwenden die MDX-Verschlüsselung nur für SQLite-Datenbanken und Schlüsselbunde. SQLite-Datenbanken bilden die Basis für das komplexere Permanentspeichermodell mit Apple Core Data. Die anderen Core Data-Modelle benötigen Dateiobjekte im Apple-Dateisystem in der App-Sandbox.

Andere Richtlinien und iOS 9:

  • iOS 9 hat keine Auswirkungen auf das Benutzerentropie-Feature, das über den Schlüssel Encrypt secrets using Passcode aktiviert wird. Schlüsselbund und Tresor auf Geräten sind nicht betroffen.
  • Auf iOS 9-Geräten wird mit der Richtlinie “Verschlüsselung aktivieren” nur die Verschlüsselung von Datenbank und Schlüsselbund aktiviert. Auf älteren iOS-Geräten wird mit der Richtlinie weiterhin auch die MDX-Dateiverschlüsselung aktiviert.
  • Zum zusätzlichen Schutz der Daten auf Geräten mit aktiviertem Passcode bietet das MDX App SDK eine höhere iOS-Verschlüsselungsebene für Dateien, die von diesen Apps auf Geräten gespeichert werden. Die iOS-Dateiverschlüsselung hat mehrere Datenschutzstufen. Die neue Richtlinie “Mindestdatenschutzklasse” ermöglicht die Angabe einer Schutzklasse für App-Daten, sofern nicht bereits eine höhere Schutzebene in iOS festgelegt ist. Die Richtlinie kann auf folgende Werte eingestellt werden:

Vollständig, es sei denn, Datei ist offen: Ist eine Datei beim Sperren des Geräts geöffnet, steht sie für die App weiterhin zur Verfügung. Dieser Wert entspricht NSFileProtectionCompleteUnlessOpen. Standardwert.

Vollständig: Wird ein Gerät gesperrt, stehen Dateien nicht mehr zur Verfügung. Dieser Wert entspricht NSFileProtectionNone.

Bis zum ersten Entsperren: Wenn ein Gerät neu gestartet wird, bleiben Dateien gesperrt und können nicht angezeigt werden, bis der Benutzer das Gerät zum ersten Mal entsperrt. Dieser Wert entspricht NSFileProtectionCompleteUntilFirstUserAuthentication.

Keine: Dateien werden nicht gesondert geschützt und können jederzeit angezeigt und bearbeitet werden. Dieser Wert entspricht NSFileProtectionNone.

Wichtig: Entwickler sollten unbedingt umschlossene Apps testen, die Hintergrundverarbeitungsschritte durchführen (z. B. Inhaltsaktualisierungen auf gesperrten Geräten oder Hintergrundsynchronisierungen).

Diese Richtlinie ist ausgeblendet. Um die Richtlinie in XenMobile anzuzeigen, öffnen Sie für die App die Datei policy_metadata.xml (in Applications/Citrix/MDXToolkit/data) und ändern Sie im Abschnitt MinimumDataProtectionClass den Wert für PolicyHidden in false. Nachdem Sie die App umschlossen haben, wird die Richtlinie angezeigt, wenn Sie die App XenMobile hinzufügen.

Benutzererfahrung:

  • Nach dem Upgrade einer mit dem MDX Toolkit 10.2 umschlossenen App werden die Benutzer beim Starten der App von MDX aufgefordert, einen Gerätepasscode zu erstellen, wenn noch keiner existiert. MDX entschlüsselt dann die vorhandenen mit MDX verschlüsselten Dateien und schützt sie mit der iOS-Dateiverschlüsselung.
  • Wenn ein Benutzer versucht, eine mit dem MDX Toolkit 10.0.x umschlossene App unter iOS 9 zu installieren, kann die App nicht aktualisiert werden und der Benutzer muss eine mit dem MDX Toolkit 10.2 umschlossene Version der App installieren.

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 XenMobile-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 mit MDX verschlüsselte Dateien nicht entschlüsseln, weshalb die verwaltete App dem Dienstprozess ein temporäres unverschlüsseltes Exemplar der Daten bereitstellen muss, das von ihr nach 5 Sekunden gelöscht wird. Es ist wichtig, dass Sie sich dieser Einschränkung bei der Verwendung dieser Klassen bewusst sind, denn die Art wie diese Klassen bei Apple implementiert sind, bewirkt den Verlust der Einschlusskontrolle für ihre Daten.

  • Die Speicherzuordnung ist für die XenMobile-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 XenMobile-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 XenMobile führt. Diese Methode war bei allen mit XenMobile 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.

  • XenMobile 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 XenMobile verschlüsselt.

  • Apple SQLite-Datenbanken werden von XenMobile ü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. XenMobile deaktiviert den zugewiesenen Datenträgercache, da diese Datenbank von nicht verwalteten iOS-Dienstprozessen referenziert wird.

  • In der folgenden Tabelle sind die hartcodierten ausgeschlossenen Dateipfad-Namensmuster aufgeführt:

       
    .plist Ausgeschlossen aufgrund von Zugriff durch iOS-Systemprozesse außerhalb des Prozesskontext.
    .app Legacy-Teilzeichenfolge 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 Sandbox-Verzeichnis des App-Pakets und Dateipfade außerhalb der App-Daten-Sandbox 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/ Auf Dateien wird von iOS direkt zugegriffen.
    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 Verzeichnis mit komprimierten MDX-Protokollen
    Alle Dateien im Verzeichnispfad des App-Pakets Schreibgeschütztes Verzeichnis der App-Dateien
  • XenMobile ersetzt zur Laufzeit Instanzen der Apple-Objective-C-QLPreviewController-Objektklasse durch eine Instanz der privaten XenMobile-SecureViewController-Klasse. Die XenMobile-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 XenMobile-Verschlüsselung nicht unterstützt. Dieses Dateimodusflag wird bei der Verarbeitung durch XenMobile aus der Modusliste entfernt.

Verschlüsselung und Benutzerentropie

Eine XenMobile-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 XenMobile-Clienteigenschaft “Encrypt secrets using Passcode” fügt Benutzerentropie hinzu. Die Eigenschaft ist standardmäßig deaktiviert und kann über die XenMobile-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 Homebildschirm-Symbol 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 XenMobile-Richtlinienoptionen stehen Administratoren für das Netzwerk zur Verfügung. Mit der Netzwerkzugriffsrichtlinie kann die Netzwerkaktivität einer App wie folgt verhindert, zugelassen oder umgeleitet werden:

  • Standardmäßig ist das Netzwerk für Apps vollständig blockiert. Wenn die Netzwerkzugriffsrichtlinie auf Blockiert festgelegt ist, schlagen von der App verwendete Netzwerk-APIs fehl. Ein solcher Fehler sollte gemäß der o. a. Richtlinie durch ein kontrolliertes Beenden der App behandelt werden.
  • Wenn die Netzwerkzugriffrichtlinie auf Uneingeschränkt festgelegt ist, werden alle Netzwerkaufrufe direkt und nicht durch den Tunnel geroutet.
  • Wenn die Netzwerkzugriffrichtlinie auf Tunnel zum internen Netzwerk festgelegt ist, werden alle Netzwerkaufrufe über NetScaler Gateway geroutet. Das Tunneling unter dieser Richtlinie wird über die Richtlinie “Bevorzugter VPN-Modus” gesteuert.

Die Richtlinie “Bevorzugter VPN-Modus” bestimmt den Anfangsmodus für Verbindungen mit einem Tunnel zum internen Netzwerk:

  • Ist die Richtlinie “Bevorzugter VPN-Modus” auf Secure Browse festgelegt, wird die http/https-URL neu geschrieben. Mit “Secure Browse” ist nur ein Tunneling von http- und https-Datenverkehr möglich. Große Vorteile von Secure Browse sind Single Sign-On (SSO) für http- und https-Datenverkehr und die PKINIT-Authentifizierung. Unter Android ist die Einrichtung von Secure Browse mit geringem Mehraufwand verbunden, es bildet daher die bevorzugte Option für Webbrowsing-Vorgänge.
  • Wenn die Richtlinie “Bevorzugter VPN-Modus” auf Vollständiger VPN-Tunnel festgelegt ist, wird der gesamte Datenverkehr der verwalteten App über NetScaler Gateway getunnelt.

Einschränkungen:

  • WkWebView wird nicht unterstützt.
  • 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. UDP-Datenverkehr wird nicht getunnelt, wenn die Netzwerkzugriffsrichtlinie auf Tunnel zum internen Netzwerk 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 XenMobile:

  • 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 XenMobile-Administrator muss die Richtlinie über die XenMobile-Konsole konfigurieren.
  • Bei einer direkten Verknüpfung von App-Bibliotheken und Drittanbieter-Bibliotheken mit den OpenSSL-Bibliotheken libcrypto.a und libssl.a können aufgrund fehlender Symbole und mehrfacher Symboldefinitionen 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.
  • XenMobile 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.