Wie schreibe und lese ich Realm im Background?

Realm-Tipps #1
Inhaltsverzeichnis
    Add a header to begin generating the table of contents

    1. Übersicht

    Wer Daten verarbeitet, während die App nicht geöffnet ist, stößt schnell auf das Problem, dass Apple mittels NSFileProtection die Daten der App verschlüsselt, während die App im Background ist. Vor allem, wenn man Daten von Servern abrufen oder einkommende Sensordaten verarbeiten und speichern möchte, stößt man hier schnell auf Probleme, mit der folgenden Fehlermeldung: open() failed: Operation not permitted.

    Um dies zu verhindern, müssen zwei Dinge an den Realm Standart-Einstellungen angepasst werden. Zum einen, muss der Ordner in dem die Realm Datei abgelegt wird, zum Schreiben freigegeben werden. Damit dies jedoch klappt, muss der Ordner erstmal geändert werden, da Realm in der Standard-Konfiguration, in den Documents Ordner der App schreibt, welcher nicht zum Schreiben im Background freigeschaltet werden kann. Dieser hat im Simulator beispielsweise, den folgenden Pfad: file:///Users/Username/Library/Developer/CoreSimulator/Devices/2C44ABD7-90A1-46B7-A033-7BA33CC64E50/data/Containers/Data/Application/62FAECEB-4AA6-4A74-83DE-EB6F4F4BD3A3/Documents/RealmData/default.realm Di,

    2. Ändern des Ordners für die Realm Dateien

    Zum Ändern des Realm-Ordners kannst du die folgenden Schritte umsetzen. Dabei bist du natürlich frei in der Wahl des Speicherortes. Ich habe der einfachheitshalber im Beispiel einen Unterordner im Documents Ordner angelegt.
     
    1. Zum ändern des Pfades, muss man sich zuerst, den aktuellen Pfad ausgeben lassen. Dies geschieht über die Funktion
      NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true), welche dir den Pfad des Documents Ordners deiner App ausgibt.
    2. Anschließend wandelst du diesen in einen String um und hängst den Namen des neuen Unterordners an. Wichtig: Mit dieser Methode erstellst du einen Unterordner im Documents Ordners, in welchem dann deine Realm-Datei abgelegt wird (Du kannst natürlich auch ein komplett anderes Verzeichnis nutzen).
    3. Als nächsten Schritt prüfst du mittels FileManager.default.fileExists(atPath: dataPath), ob der Pfad bereits vorhanden ist. Falls dies nicht der Fall ist, legst du den Pfad mit der Funktion  FileManager.default.createDirectory(atPath: dataPath, withIntermediateDirectories: false, attributes: nil) an.
    4.  Abschließend musst du den neuen Pfad noch in das URL-Format umwandeln und entsprechend in der Realm Standard Konfiguration hinterlegen. Dazu nutzt du zuerst die URL() Funktion, mit der du Objekte vom Typ-String in eine URL umwandeln kannst. Diese URL kannst du nun in der Realm-Konfiguration hinterlegen. Das funktioniert über Realm.Configuration.defaultConfiguration.fileURLWichtig: Da Realm nicht den Ordner zum speichern benötigt, sondern direkt die Datei, musst du die URL noch über appendPathComponent(“RealmName.realm“) hinterlegen.
    Wichtig: Damit der neue Ordner durchgängig benutzt, solltest du die Anpassung direkt im AppDelegate vornehmen. Wenn du bereits eine laufende App im AppStore hast, musst du wissen, das du eine neue Realm-Datei anlegst und die Daten aus deiner alten Realm-Datei nicht mehr in der Standard-Konfiguration hinterlegt sind. In diesem Fall bietet es sich an, die alte Realm-Datei in den neuen Ordner zu verschieben.

    3. Verschlüsselung des Realm-Ordners anpassen

    Nachdem du sichergestellt hast, dass deine Realm-Dateien nicht mehr im Documents Ordner abgelegt werden, kannst du den FileProtectionType deines neuen Ordners anpassen und so sicherstellen, dass deine App auch während sie im Background ist, im Realm lesen und schreiben kann. Zur Umsetzung gehe wie folgt vor:
     
    1. Initialisiere einen Realm über Realm().
    2. Mittels  configuration.fileURL!.deletingLastPathComponent().path bekommst du den Pfad deines aktuellen Realms. Dabei sieht man, dass die letzte Komponente des Pfads gelöscht wird. Dies geschieht, da die letzte Komponente die Realm-Datei ist, wir aber den gesamten Order anpassen wollen. (Anmerkung: Falls in deinem Code noch verfügbar, kannst du den Pfad aus Teil 1 nutzen).
    3. Die Einstellungen des Pfades änderst du nun wie folgt:  FileManager.default.setAttributes([FileAttributeKey(rawValue: FileAttributeKey.protectionKey.rawValue): FileProtectionType.completeUntilFirstUserAuthentication],
      ofItemAtPath: folderPath)
      . Beachte dabei das du hier für FileProtectionType unterschiedliche Optionen wählen kannst, je nachdem wie sicher die Daten deiner Nutzer sein müssen.

    4. Quellen

    Kommentar verfassen

    Deine E-Mail-Adresse wird nicht veröffentlicht.

    DAs selfmade-projekt

    Geld verdienen im Internet, wie geht das?

    Scroll to Top