iCloud Backup und Restore einer Realm Datenbank

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iCloud Backup und Restore einer Realm Datenbank

    Guten Morgen Dies ist mein Code um meine Datenbank zu sichern:


    Quellcode

    1. let fileManager = FileManager.default

    Quellcode

    1. private func retrieveLocalRealmURL() -> URL {
    2. let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    3. let documentaryDirectory = urls[0]
    4. let realmURL = documentaryDirectory.appendingPathComponent("default.realm");
    5. return realmURL
    6. }
    7. private func backupRealmToiCloudDrive() {
    8. let backgroundQueue = DispatchQueue.global(qos: .background)
    9. backgroundQueue.async {
    10. guard
    11. let ubiquityURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)
    12. else {
    13. return
    14. }
    15. let iCloudDriveURL = ubiquityURL.appendingPathComponent("Documents")
    16. let iCloudRealmURL = iCloudDriveURL.appendingPathComponent("default.realm")
    17. let fileExists = FileManager.default.fileExists(atPath: iCloudDriveURL.path, isDirectory: nil)
    18. func copy() {
    19. let localRealmURL = self.retrieveLocalRealmURL()
    20. do {
    21. try FileManager.default.copyItem(at: localRealmURL, to: iCloudRealmURL)
    22. DispatchQueue.main.async {
    23. let alert = UIAlertController(title: "Sicherung erfolgreich", message: "Die Datenbank wurde erfolgreich in iCloud wiederhergestellt.", preferredStyle: .alert)
    24. alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    25. self.present(alert, animated: true, completion: nil)
    26. }
    27. print("Realm File succesfully uploaded to iCloud")
    28. } catch {
    29. print(error.localizedDescription)
    30. }
    31. }
    32. if fileExists {
    33. self.deleteExistedFile(iCloudRealmURL)
    34. copy()
    35. print("File already existts, deleting old copy")
    36. } else {
    37. do {
    38. try FileManager.default.createDirectory(at: iCloudDriveURL, withIntermediateDirectories: true, attributes: nil)
    39. copy()
    40. } catch {
    41. print(error.localizedDescription)
    42. }
    43. }
    44. }
    45. }
    46. private func deleteExistedFile(_ url: URL) {
    47. let fileCoordinator = NSFileCoordinator(filePresenter: nil)
    48. fileCoordinator.coordinate(writingItemAt: url, options: .forDeleting, error: nil) { deleteURL in
    49. do {
    50. let fileExists = FileManager.default.fileExists(atPath: deleteURL.path, isDirectory: nil)
    51. if fileExists {
    52. try FileManager.default.removeItem(at: deleteURL)
    53. }
    54. } catch {
    55. print(error.localizedDescription)
    56. }
    57. }
    58. }
    Alles anzeigen



    Und dies derjenige um die Datei wiederherzustellen:


    Quellcode

    1. private func restoreRealmFromiCloudDrive() {
    2. let backgroundQueue = DispatchQueue.global(qos: .background)
    3. backgroundQueue.async {
    4. guard let ubiquityURL = FileManager.default.url(forUbiquityContainerIdentifier: nil) else {
    5. return
    6. }
    7. let iCloudDriveURL = ubiquityURL.appendingPathComponent("Documents")
    8. let iCloudRealmURL = iCloudDriveURL.appendingPathComponent("default.realm")
    9. let fileExists = FileManager.default.fileExists(atPath: iCloudRealmURL.path, isDirectory: nil)
    10. if fileExists {
    11. let defaultRealmFileURL = Realm.Configuration.defaultConfiguration.fileURL
    12. let localRealmURL = self.retrieveLocalRealmURL()
    13. let fileCoordinator = NSFileCoordinator(filePresenter: nil)
    14. fileCoordinator.coordinate(writingItemAt: localRealmURL, options: .forReplacing, error: nil) { writeURL in
    15. do {
    16. print("Realm File exists on iCloud")
    17. if FileManager.default.fileExists(atPath: defaultRealmFileURL!.path) {
    18. try FileManager.default.removeItem(at: defaultRealmFileURL!)
    19. }
    20. try FileManager.default.copyItem(at: iCloudRealmURL, to: defaultRealmFileURL!)
    21. DispatchQueue.main.async {
    22. let alert = UIAlertController(title: "Restore Successful", message: "The restore from iCloud Drive was successful", preferredStyle: .alert)
    23. alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    24. self.present(alert, animated: true, completion: nil)
    25. }
    26. } catch {
    27. print(error.localizedDescription)
    28. print("No Realm File on iCloud")
    29. }
    30. }
    31. }
    32. }
    33. }
    Alles anzeigen
    Und hier noch meine Entitlements:


    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    3. <plist version="1.0">
    4. <dict>
    5. <key>aps-environment</key>
    6. <string>development</string>
    7. <key>com.apple.developer.icloud-container-identifiers</key>
    8. <array>
    9. <string>iCloud.com.Fahrtenbuch</string>
    10. </array>
    11. <key>com.apple.developer.icloud-services</key>
    12. <array>
    13. <string>CloudKit</string>
    14. <string>CloudDocuments</string>
    15. </array>
    16. <key>com.apple.developer.ubiquity-container-identifiers</key>
    17. <array>
    18. <string>iCloud.Fahrtenbuch</string>
    19. </array>
    20. </dict>
    21. </plist>
    Alles anzeigen
    Die Entitlements bzw. der Identfier wurde für den Post hier gekürzt.

    Ich kann nun in meiner App mit einem Backup Button ein Backup hochladen, und mit dem Restorebutton wiederherstellen. Getestet habe ich dies, indem ich ein Backup erstellt habe, danach einige Datenbankeinträge gelöscht und dann wiederhergestellt habe.

    Das Problem ist jedoch, dass sobald die App gelöscht und neu installiert wird, der Restore nicht mehr durchgeführt wird. Es gibt in diesem Fall auch keine console prints beim aufrufen der Restore funktion.

    Hintergrund für die gesamte Backupfunktion ist der, dass die App nicht für den Appstore gedacht ist.

    Kann mir da jemand helfen?

    Viele Grüsse,

    Stephan
    MacBook Pro 16" M2 Max 32 GB RAM, - iPad Pro 12.9" M1 256 GB WiFi+Cellular - iPhone 14 Pro 256 GB - Apple Watch Ultra

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Thaddäus ()