Datei aus iCloud für App verwenden

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Datei aus iCloud für App verwenden

    Hallo,

    ich habe meine kleine App, die eine Hobbybrauer Rezeptverwaltung darstellt, diese nutzt eine SQLite Datenbank die man über Dropbox oder WebDAV zwischen iPhone/iPad und Mac/PC Syncen kann. Die SQLite DB muss sein, weil die Desktop App die Datenbank bereitstellt und ich nur darauf aufbaue. Nun hat ein Anwender gefragt, ob man den ganzen Sync der Datei nicht auch über iCloud machen könnte. Ich suche nun schon seid Tagen nach Beispielen wie man denn in seine App iCloud als "Fileprovider" einbinden kann um dann eine Datei zwischen iPhone, iPad, Mac und PC syncen könnte.

    Hat hier vielleicht jemand mal einen Tipp für mich.

    Danke schon mal im voraus.

    Guß

    Dirk
  • Qvex23 schrieb:


    Nun hat ein Anwender gefragt, ob man den ganzen Sync der Datei nicht auch über iCloud machen könnte. Ich suche nun schon seid Tagen nach Beispielen wie man denn in seine App iCloud als "Fileprovider" einbinden kann um dann eine Datei zwischen iPhone, iPad, Mac und PC syncen könnte.
    Mit einem "FileProvider" hat das wenig zu tun. Du beziehst Dich ja nicht wirklich auf ein Synchronisieren auf Datensatz- / Entity-Ebene, sondern mehr auf ein komplettes Kopieren (und damit Ersetzen) der SQLite-Dateien. Da würde ich mir sehr genau die Frage stellen, ob dies die Erwartungshaltung des Benutzers trifft. Letztlich sehe ich drei Optionen, die je nach Antwort auf diese Frage Sinn machen können:
    1. Du speicherst die Dateien in einem "Benutzer-zugänglichen" Verzeichnis - also dem Documents-Ordner - und erlaubst in Deiner App File-Browsing: Dann kann der Benutzer einfach Apple's "Files" App nutzen, um die Dateien beliebig zu kopieren. Einfach, schnell, unkomfortabel und fehlerträchtig.
    2. Du nutzt in Deiner App iCloud-Drive. NSFileManager liefert Dir per URLForUbiquityContainerIdentifier die passende URL und Du schreibst / liest in Deiner App die SQLite-Dateien: Etwas Aufwand für das iCloud-Händling, dann überschaubar, aber nur eingeschränkt komfortable (wg. dem Überschreiben von Änderungen an der DB).
    3. Du überdenkst Deine Datenhaltung und nutzt Core Data auf Basis von CloudKit für die Synchronierung: Fühlt sich richtig an, erfordert aber eine massives Umschreiben und Du hast das Problem des PC-Syncs.
    Es gibt m. E. keinen Königsweg ... ich tendiere zur zweiten Lösung, glaube aber, dass Dein Benutzer etwas anderes möchte ... nämlich eigentlich eine parallele Verwendung der App mit Abgleich der Änderungen. Das bedeutet bei (2.) viel Handarbeit... Bei einem Hobby-Projekt würde ich mir (3.) mal anschauen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke für die Flotte Antwort.
    Ich habe mir schon fast gedacht, das iCloud einfach nicht mit Dropbox oder einem WebDAV vergleichbar ist. Ein umbau auf CoreData mache ich auf gar keinen Fall. Damit würde sich der nutzen der App im nichts auflösen, da diese nur als Companion App zur Desktop App dient und die Desktop App ist in Qt geschrieben und wird von nicht Mac/iOS Entwicklern entwickelt.

    Aber eigentlich "Synchronisiere" ich auch bei Dropbox keine Datensätze, sondern immer nur die Datenbank Datei. Der User muss wissen, das er nie parallel die Datenbank an 2 Geräten nutze darf.
  • Auf dem Device ... und dann hilft nur von o.g. Doku starten. Mühsam fand ich eine sauber Behandlung der Fälle, wenn iCloud nicht verfügbar ist (deaktiviert, nicht konfiguriert), und das Sicherstellen eines abgeschlossenen Downloads (da Du ja nicht auf UIDocument aufsetzt). Bei letzterem hilft z. B. ein coordinateReadingItemAtURL des FileCoordinators...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hi und Danke!!
    Habe mir das mal angeschaut. Das scheint mir alles ziemlich kompliziert zu werden, da meine App natürlich immer davon ausgeht das das Datenbank File im Documents Ordner liegt. Wenn ich das nun umbauen muss, weil das Datenbankfile in einem anderen Ordner liegen muss, damit es in die iCloud gesynct wird, ist mir das zu viel Aufwand. Oder kann ich auch nur die eine Datei aus dem Documentsordner syncen lassen?
  • Qvex23 schrieb:

    Habe mir das mal angeschaut.
    Wirklich?

    Die Option (1.) ermöglicht dem Benutzer nur, Dateien des documents-Ordners Deiner App per "Files"-App zu managen: Löschen, Umbenennen, aber eben auch Kopieren zu anderen Speicherorten, die in Files angeboten werden wie USB-Sticks, Dropbox, Google Drive. Von einem Sync ist da keine Rede.

    Da Deine App ja scheinbar schon in documents schreibt, beschränkt sich die Anpassung auf zwei plist-Einträge. Das empfinde ich nur als mäßig kompliziert :D

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Wirklich?
    Ja, wirklich. Dazu müsste ich in meine App eine weitere Option einfügen die dann "iCloud Sync" heißt und wenn der User diese Option wählt muss die Datenbank Datei dann nicht mehr in:

    Quellcode

    1. FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("kb_daten.sqlite")


    liegen sondern in:

    Quellcode

    1. FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent("kb_daten.sqlite")
    ich weiß gerade nicht wie aufwendig das ist, denn Dropbox und WebDAV Sync haben ja immer in den privaten Container geschrieben und von daher musste ich beim einführen von WebDAV als 2. Option an der stelle nichts verändern.
  • Nochmals nein: Option (1.) arbeitet mit lokalen Daten, für Deine App ändert sich nichts. Durch die plist-Keys erlaubst Du Files nur, den Ordner anzuzeigen. Schlaf' einmal in Ruhe drüber und lesen Dir den Punkt in meinem Post nochmal durch:
    1. Du speicherst die Dateien in einem "Benutzer-zugänglichen" Verzeichnis - also dem Documents-Ordner - und erlaubst in Deiner App File-Browsing: Dann kann der Benutzer einfach Apple's "Files" App nutzen, um die Dateien beliebig zu kopieren. Einfach, schnell, unkomfortabel und fehlerträchtig.

    Mattes

    Edit: Wie gesagt kein Sync, sondern nur die Möglichkeit für den Benutzer, an die Daten zu kommen und diese z. B. über iCloud Drive auf ein anderes Gerät zu kopieren. Zweifelhaft, ob das reicht, aber vielleicht besser als nix.
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Nochmals nein: Option (1.) arbeitet mit lokalen Daten, für Deine App ändert sich nichts. Durch die plist-Keys erlaubst Du Files nur, den Ordner anzuzeigen. Schlaf' einmal in Ruhe drüber und lesen Dir den Punkt in meinem Post nochmal durch:
    1. Du speicherst die Dateien in einem "Benutzer-zugänglichen" Verzeichnis - also dem Documents-Ordner - und erlaubst in Deiner App File-Browsing: Dann kann der Benutzer einfach Apple's "Files" App nutzen, um die Dateien beliebig zu kopieren. Einfach, schnell, unkomfortabel und fehlerträchtig.

    Mattes
    Ja, das ist alles klar. ABER: der Kram soll halt nunmal in die iCloud gesynct werden. Meine Frage war: kann ich den alten Speicherort in die Cloud syncen, oder muss ich ein meiner App sagen "Wenn der User iCloud nutzt ist der neue Pfad zur DB nun ......"