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.

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. 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, 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 Citrix Endpoint Management 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 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 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

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

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

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

  • 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
  • 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 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 Citrix Endpoint Management-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 Netzwerkzugriffsrichtlinie auf “Tunnel zum internen Netzwerk” festgelegt ist, werden alle Netzwerkaufrufe über Citrix 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 Citrix 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 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 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.
  • 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.