Drive und oder Dropbox Synchronisierung für eine Android App (WebApp / Angular / Cordova)

  • Antworten:12
RobSchmi
  • Forum-Beiträge: 7

31.08.2020, 21:04:03 via Website

Hi,

ich suche jemanden, der mir mit der Synchronisierung der Daten meiner App in Google Drive oder Dropbox hilft. Gerne auch gegen ein gewisses Endgeld! Ich brauche eine stabile Lösung auf Angular Basis die auch mit ausfallendem Netz etc... gescheit umgeht. Das Ziel ist also, dass User ihre Daten in ihren privaten Drive oder Dropbox Account synchronisieren können und die Daten dann auf einem anderen Gerät weiter nutzen können und umgedreht.

Meine aktuellen Bemühungen laufen eigentlich ganz gut. Komme an die Daten, kann diese senden, sprich Sync läuft soweit. Nur leider bekomme ich die ganzen Eventualitäten (App wird wären Up- oder Download gekillt, Netz weg oder schlecht beim Up- oder Download, Konfliktbehandlung bei den Dateiversionen wenn so ein Fall eintritt etc...) nicht in den Griff. Es ist halt so schade weil der Sync ja schon läuft. :( Darum wäre ich auch bereit etwas Geld in die Hand zu nehmen.

Die technische Grundlage ist ein Angular Projekt das per Cordova in den App Store gebracht wurde und per Electron später in den Windows Store soll. Also keine Native Android App!

Ich brauche also Hilfe bei einer Lösung auf Basis von Angular und den REST APIs von GDrive oder Dropbox. Eben damit ich diese mit Cordova aber auch Electron weiter nutzen kann.

Sofern ich für sowas hier überhaupt richtig bin? :) Wenn nicht, vielleicht hat ja jemand eine bessere Idee?

Spezifischere Infos, auch zu einer möglichen Vergütung gerne per PM.

Danke
Ronny

— geändert am 02.09.2020, 11:20:29

Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.09.2020, 18:45:35 via Website

Hallo Ronny,
herzlich wilkommen hier im Forum :)
Ich habe den Beitrag mal ins Entwicklerforum geschoben.



Vorab: Die meisten hier entwickeln mit Java/Kotlin nativ, daher sind die Cordova kenntnisse eher gering ;)

Wie speicherst du denn bisher die Daten und um welche Daten geht es?
Dein Angular Frontend muss diese ja irgendwo oder wie ablegen.
Je nach Datenhaltung muss auch deinsync passend sein.

Es gibt (alte) Dropbox Sync Libs, mit wlechen das gehen könnte:
https://github.com/ccoenraets/phonegap-dropbox-sync
Alternativ sowas selber implementieren.

Oder aus Angular direkt die GDrive bzw. Dropbox API nutzen und die Dateien direkt lesen/schreiben.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
RobSchmi
Kommentieren
RobSchmi
  • Forum-Beiträge: 7

02.09.2020, 10:30:41 via Website

Hi Pascal,

schön hier zu sein und danke fürs Verschieben.

Pascal P.

Vorab: Die meisten hier entwickeln mit Java/Kotlin nativ, daher sind die Cordova kenntnisse eher gering ;)

Das hatte ich fast schon befürchtet. :)

Wie speicherst du denn bisher die Daten und um welche Daten geht es?
Dein Angular Frontend muss diese ja irgendwo oder wie ablegen.

Aktuell speichere ich die Daten über ein Cordova-Plugin direkt in das native Dateisystem.

Es gibt (alte) Dropbox Sync Libs, mit wlechen das gehen könnte:
(darf noch keine Links posten, darum ist der raus)

Hab ich mir schon angeschaut und ist leider keiner wirklich Option.

Oder aus Angular direkt die GDrive bzw. Dropbox API nutzen und die Dateien direkt lesen/schreiben.

Genau den Ansatz verfolge ich aktuell. Er erscheint mir auch als sinnvollste Lösung, da ich die Synchronisierung ja auch in der Windows Version meiner App benutzen möchte. Und da bringt mir dann ja ein Cordova-Plugin, welches das dann ggf. tut nix.

Meine Bemühungen in die Angular und GDRIVE / Dropbox API Richtung laufen auch eigentlich ganz gut. Der Sync funktioniert ja aber ich bekomme die ganzen Eventualitäten (App wird wären Up- oder Download gekillt, Netz weg oder schlecht beim Up- oder Download, Konfliktbehandlung bei den Dateiversionen wenn so ein Fall eintritt etc...) nicht gescheit abgefangen. Das ist, was mich aktuell, zumindest bei diesen für mich wichtigen Feature, zum Aufgeben zwingt. Es ist halt so schade weil es ja eigentlich läuft. :( Darum wäre ich auch bereit etwas Geld in die Hand zu nehmen. Aber wo finde ich nun jemanden, der genau das kann bzw. mir sagt wie es geht / gehen könnte?

— geändert am 02.09.2020, 11:22:45

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.09.2020, 11:48:08 via Website

Wieso kannst du das nicht korrekt abfangen?
Du musst natürlich deine Daten auch weiterhin auf dem Gerät speichern und dann mit Dropbox ö.ä. abgleichen, wenn Verbindung da ist etc. Dropbox/GDrive als alleiniger Datenspeicher wird nicht funktionieren.
Zudem: Soll das synchronisieren dauerhaft passieren oder nur auf Knopfdruck, d.h. wenn der User das möchte?
Zweiteres wäre vermutlich einfacher, da du dann nicht ständig einen Abgleich brauchst und dann die eventualtitäten nicht so wichtig sind.
So wie hier:
https://www.carlserver.com/blog/post/use-dropbox-for-persistent-storage-with-an-angular-application
Im on Error solltest du doch alle Errors bekommen oder?

Alternativ kannst du natürlich mit Java ein Cordova Plugin implementieren, das dir die Daten synchronisiert.
Dieses kannst du dann aus deiner App antriggern und es führt einne sync durch:
https://cordova.apache.org/docs/de/latest/guide/platforms/android/plugin.html

  • Volle funktionalität und nutzbarkeit der GDrive API bzw. Dropbox API Klassen für Android
  • du solltest gut Java können fürs Plugin
  • Für Windows darfst du das analog als Plugin schreiben, aber vermutlich in einer Windows näheren Sprache z.b. C++ oder C#
  • Für eine IOS Protierung bräcuhtest du wiederum ein Cordova Plugin für IOS

Ansonsten bleibt dir immernoch die Daten auf dem Gerät zu exporiteren z.b. im ein Zip und dieses den User übertragen lassen bzw. wirklich nur auf knopfdruck zu synchronisieren.
Oder du übernimmst das speichern serverseitig, dann hat halt nicht jeder User seine Daten bei sich.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
RobSchmi
Kommentieren
RobSchmi
  • Forum-Beiträge: 7

02.09.2020, 12:46:38 via Website

Also ein eigenes Cordova Plugin schreiben oder schreiben lassen ergibt für mich keinen Sinn. Alleine wegen Updates der Plugins bei neuen Android Version etc... und, viel wichtiger, dem Punkt, dass ich dann in Windows mit C loszulegen muss was garantiert nix bei mir wird.

Daten auf das Gerät speichern biete ich aktuell ja schon als Export an. Aber wer will schon seine Daten immer an den PC senden, dort importieren und wieder zurück. Macht für den User und eine ernst gemeinte Windows Version keinen Sinn.

Die Synchronisierung müsste nicht unbedingt durchgehend laufen. Wäre sicher besser aber per Klick wäre denke ich auch OK. Aber auch während solch einem Sync kann ja viel passieren. Ich schau mir morgen deinen ersten Link mal genauer an. Vielleicht bringt der mich ja schon ein wenig weiter.

Ich melde mich in jedem Fall mit dem Ergebnis wieder. Wenn bis dahin noch jemand Ideen hat oder sich selbst anbieten will, nur zu! Bin für jede Hilfe dankbar.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.09.2020, 13:28:12 via Website

Ohne die Anforderung, dass es in der eigenen Dropbox liegen muss würde das ganze sicher auch einfacher gehen, denn dann könnntest du einfach eine API anbieten, die die Daten auf deinen Server schiebt.
Klar kann während solch einem Sync auch was passieren, aber was macht das schon?
Mehr als das der User 2x syncem uss weil es das erste mal nicht geklappt hat, kann doch nicht passieren oder?

Was ist denn hier dein Worst case szenario? vlt musst du auch nur dienen eigenen algorithmus zum sync ändern um das zu verbessern.

Grob skizziert wie ich es angehen würde:
(ohne zusammenfüung der Daten, immer nur ein Gerät ist aktiv und kann syncen)
1. Vergleich Dateidatum Cloud mit lokal, wenn online geändert dann download
2. Wenn lokal geändert dann upload
3. nachträglich überprüfen ob die Datei auch wirklich passend angekommen ist, wenn nich => fehlermeldung oder wiederholen.

Wenn etwa schief geht, kann ich das über 3. ermitteln und dann schritt 1&2 erneut ausführen.

Oder beim upload: Online die bestehende Datei umbenennen, dann upload.
Wenn etwas schief gehtl merkst du das, wenn deine Datei dort nie ankommt und kannst es wiederholen.

Ergo es gibt genug möglichkeiten sowas allein über Dateiexistenz oder einer Datei .syncfile oder so zu machen.

Von welchen Dateigrößen sprechen wir? So lange kann ein Upload oder download bei reinen Datendateien ja nicht dauern

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
RobSchmi
Kommentieren
RobSchmi
  • Forum-Beiträge: 7

02.09.2020, 21:50:04 via Website

Also es können mehrere Dateien sein, die von ein paar KB bis max. 5 MB gehen. Ein eigener Server ist keine Optionen. Ich möchte das jeder User seine Daten selbst bei sich hat. Zudem möchte ich auch keinen Server bezahlen und viel wichtiger, mich nicht um die Sicherheit der Daten kümmern. Klar es gibt auch dinge wie Firebase bzw. Googles Cloud dahinter aber das ist für mich keine Option. Monatliche Kosten bei einer App ohne Monatliche Zahlung, macht in meinen Augen keinen richtigen Sinn. Und wie gesagt, ich finde seine Daten bei sich zu haben auch persönlich sehr nett und mag selbst auch keine Abos . :)

Hilfreich?
Kommentieren
RobSchmi
  • Forum-Beiträge: 7

11.09.2020, 09:51:04 via Website

Pascal P.

Hey Pascal,
danke für deine ganzen Tipps. Bin erst jetzt dazu gekommen alles mal gründlich durchzuschauen und zu durchdenken.

Wieso kannst du das nicht korrekt abfangen?

Hier mal genau die Probleme die ich haben.

Problem 1 (Upload und Download)
Der Upload wird angestoßen und es passiert etwas. Beispiele: Internet weg, App wird vom User gekillt, App wird von Android gekillt weil sie bei z.B. zu langsamen Internet zu lange im Hintergrund liegt etc… Bei native Android Apps gibt’s dafür ja fertige Lösungen die all diese Dinge überwachen und komfortabel lösen. Aber eben leider wohl nicht für meine Variante.

Problem 2 (Die Synchronisierung / Umgang mit den Versionen)
Wie beschrieben arbeite ich mit Zeitstempeln und den Infos, die ich lokal sammeln (was wurde gelöscht, verändert etc...) um, wenn Internet da, zu prüfen was mit den Files passieren soll. Dabei gibt es diverse Fallstricke, die ich hier kurz mal in zwei Beispielen anschneiden möchte.

1: User hat ein Projekt bei Dropbox liegen und arbeitet an dem gleichen Projekt, ohne Internet, an seinem Handy. Etwas später öffnet er das gleiche Projekt auf seinem Notebook und ändert dort etwas. Das Notebook hat Netz und sendet die Version an Dropbox. Dann hat sein Handy wieder Internet und nun kommt es ja zu einem Konflikt. Die Version auf Dropbox Seite ist ja nun neuer und würde somit eigentlich die Handy Seite überschreiben. Das wäre natürlich doof und lässt sich ja durch uns nicht so wirklich abfangen.

2: User löscht ein Projekt auf seinem Handy, ohne Internet. Dann merke ich mir zwar, dass und wann das Projekt gelöscht wurde aber wenn der User nun auf dem Notebook an dem gleichen Projekt, das ja wegen fehlendem Netz noch nicht gelöscht wurde, arbeitet und dieses hochgeladen wird so muss ich ja nun entscheiden, was mache ich mit dem gelöschten Projekt auf dem Handy? Da die Dropbox Version ja neuer als die Löschung ist. Also wieder runterladen oder nicht etc…

Unterm Strich brauche ich eine gescheite Logik, die mit all diesen Dingen gescheit umgeht. Ich kann mir beim besten Willen nicht vorstellen, dass kleine Entwickler sowas einfach selbst schreiben, da es ja so viele Eventualitäten in diesem Zusammenhang geben kann.

DIE LÖSUNG WÄRE
Das beste und sauberste wäre sowas wie pouchDB, nur mit Dropbox und/oder Drive als Backend.

(Hier war der Link von dir zu carlserver, darf ich als Neuer nicht posten)
Im on Error solltest du doch alle Errors bekommen oder?

So mache ich es ja gerade aber er kümmert sich in seinem Beispiel ja auch nicht um die oben angesprochenen Punkte.

Ansonsten bleibt dir immernoch die Daten auf dem Gerät zu exporiteren z.b. im ein Zip und dieses den User übertragen lassen bzw. wirklich nur auf knopfdruck zu synchronisieren.

In die Richtung hab ich auch schon überlegt. Aber ein Projekt mit ein paar Bildern Drin, kann schon mal etwas größer werden. Das geht dann natürlich gut auf den Upload. Ich bin mir nicht sicher auf welche Akzeptanz so eine Lösung treffen würde. Zudem wird damit ja auch Problem 1 (siehe oben) nicht gelöst.

Oder du übernimmst das speichern serverseitig, dann hat halt nicht jeder User seine Daten bei sich.

Hier scheue ich etwas die Kosten und das ich mich ggf. um den Server kümmern muss. Weil gerade wenn persönliche Daten von Usern im Spiel sind könnte es ja auch rechtliche so eine Sache werden oder?

Wie würdest du denn sowas am ehesten angehen? Über sowas wie Firebase gibts ja gute Ansätze, wobei ich mir nicht sicher bin ob das mit Cordova läuft. Und wenn es ein paar mehr Daten sind, kostet das ja schon etwas an Geld. Und eigener Server, muss ja auch abgesichert etc... werden.

Ach alles schwierig...

Wie gesagt, am besten wäre sowas wie pouchDB, nur mit Dropbox und/oder Drive als Backend. Gibts denn sowas nicht?

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.09.2020, 14:06:09 via Website

Wie gesagt, am besten wäre sowas wie pouchDB, nur mit Dropbox und/oder Drive als Backend. Gibts denn sowas nicht?

Scheint nicht so sonst hättest du oder ich was gefunden.

Server, klar musst du den absichern, warten und bezahlen, aber wenn du nicht monatilich hunderttausende User hast, reicht eine Billigvariante für 2-4€ im Monat, das muss einem der Spaß halt Wert sein.
Rechtlich absichern musst du dich halt wegen den Datenschutz, also brauchst du eine passende Datenschutzerklärung etc (brauchst du für die App auch!)

Bei nativen Android Apps gibts sowas klar, aber du bist halt nicht nativ, deswegen ist das einer der großen Nachteile die ich bei Frameworks wie Cordova sehe, dass du halt bei sowas eingeschränkt bist.

Die Beiden konflikte kannst du aber auflösen. Mach es wie das GIT Prinzip, wer zuerst kommt malt zuerst, ergo läd hoch und wenn dann jemand danach kommt, werden die Daten gemerged und konflikte behoben.
Dann muss der User entscheiden, wie er die Versionen zusammenführen will, das kannst du nicht verhindern.
Dieser hat dann auswahlmöglichkeiten:
- Nimm die neuste aus der Dropbox
- Vergleiche beide Versionen
- Nimm die meines Gerätes

Und dann halt ensprechend die Daten verarbeiten.

Beim löschen genauso, hier brauchst du auch eine Userinteraktion, eben den Fall schildern: " Die Remoteversion wurde aktualisiert obwohl diese gelöscht werden sollte. Was tun?"
- Serverversion löschen
- Löschen abbrechen und geänderte Version laden

Du kannst (auch mit Android nativen Apps) nicht immer automatisch entscheiden, welcher Stand jetzt gültig ist. Einen "Merge" Schritt hast du immer mal wieder ( i.d.r soweit es geht automatisch) und wenns nicht automatisch geht muss de User entscheiden.

Anders wirst du das Problem nicht in den Griff bekommen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
RobSchmi
Kommentieren
RobSchmi
  • Forum-Beiträge: 7

12.09.2020, 12:20:00 via Website

Hey Pascal,

danke für deinen Einsatz! (cool)

Pascal P.

Server, klar musst du den absichern, warten und bezahlen, aber wenn du nicht monatlich hunderttausende User hast, reicht eine Billigvariante für 2-4€ im Monat, das muss einem der Spaß halt Wert sein.

Naja, da man in meiner App ja Dateien hinterlegen kann, ist nichtngerade absehbar wie viel Speicher ich brauche. Da könnten die 2-4 Euro dann ggf. schon enger werden. Und technisch absichern ist ja leider auch so leicht nicht. Oder eben Cloud Ressourcen aber die langen ja auch bei Zugriffen etc... zu.

Rechtlich absichern musst du dich halt wegen den Datenschutz, also brauchst du eine passende Datenschutzerklärung etc (brauchst du für die App auch!)

Ja die Datenschutzerklärung hab ich ja aber bei Daten auf meinem Server auf die im Fall X auch irgendwelche Hacker etc... zugreifen können, brauche ich mitunter mehr als eine Datenschutzerklärung. Darum finde ich den lokalen bzw. privaten Ansatz ja interessanter und für mich sicherer.

Bei nativen Android Apps gibts sowas klar, aber du bist halt nicht nativ, deswegen ist das einer der großen Nachteile die ich bei Frameworks wie Cordova sehe, dass du halt bei sowas eingeschränkt bist.

Ja, so hat alles sein Vor und Nachteile.

Die Beiden konflikte kannst du aber auflösen. Mach es wie das GIT Prinzip, wer zuerst kommt malt zuerst, ergo läd hoch und wenn dann jemand danach kommt, werden die Daten gemerged und konflikte behoben.
Dann muss der User entscheiden, wie er die Versionen zusammenführen will, das kannst du nicht verhindern.

Das lass ich mir mal durch den Kopf gehen. Das Problem mit dem Up und Download habe ich aber so auch noch nicht so wirklich gelöst. Ich kann mir nicht vorstellen das es da keinen "Manager" für sowas gibt. Also sowas wie ein Downloadmanager der für fehlerfreies und vollständiges Senden und Empfangen zuständig ist...

Naja, du hast mir schon mal sehr geholfen und ich werde mal etwas grübeln und mich dann bestimmt noch mal melden.

— geändert am 12.09.2020, 12:23:14

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.09.2020, 14:00:56 via Website

Es gibt halt nur GDrive Manager für Angular:
https://github.com/pinoyyid/ngDrive
Was anderes kannst du da leider nicht erwarten.

Du wirst aber sicher eine Lösung finden :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
RobSchmi
Kommentieren
RobSchmi
  • Forum-Beiträge: 7

13.09.2020, 10:58:23 via Website

Pascal P.

Es gibt halt nur GDrive Manager für Angular:
(Dein Link)
Was anderes kannst du da leider nicht erwarten.

Leider recht alt aber ich check das mal.

Du wirst aber sicher eine Lösung finden :)

Also was mir einigermaßen machbar erscheint wäre folgendes.

Ich mache keinen Synchronisierung in dem Sinne sondern sowas wie Cloud "Backup". Dafür müssen die User ihren Drive oder Dropbox Account hinterlegen und können dann einzelne Projekte die sie auf dem Desktop weiter verwenden wollen per Button "sichern". Dabei sichere ich immer das ganze Projekt um Problem mit den einzelnen Files (Was ist da und was nicht...) zu umgehen. Also das es mir bei Fehlern nicht das Projekt zerhaut bzw. hier oder da eine Bild fehlt etc... So habe ich immer ein Objekt das für sich funktioniert. Beim sichern packe ich das Projekt inkl. alle Files und sende dieses per REST an Drive oder Dropbox. Auf dem Desktop kann man dann sowas wie Cloud Projekte laden / abgleichen oder sowas...

Würdest du das zu umständlich empfinden als User? Auf dem Weg müsste ich mich dann nur irgendwie um einen sauberen Up und Download kümmern. Aber wenn ich immer nur ein Projekt also ein File sende oder Lade sollte das ja etwas besser laufen. Kommt es an, so ist das ganze Projekt funktionstüchtig da. Kommt es nicht an weiß der User ja das es nicht geklappt hat und er macht es nochmal.

Größtes Problem dabei, die Datenmengen. Wobei man da ja ggf. ne Info geben kann und ggf. ne Option nur per WLAN durchführen...

Was meinst du? Ist sowas OK in alles wir automatisch gesynct Zeiten?

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.09.2020, 13:16:49 via Website

Ich würde das erstmal genauso umsetzen wie du es eben beschrieben hast.
Das macht dir deutlich weniger Arbeit fürs erste.
Wenn die App dann genug Leute nutzen und du das Feedback bekommst, das man nun einen automatischen Sync wünscht, kannst du es dir immernoch überlegen.

Ich glaube auch, dass man mit genug Logik außenrum so einen Sync auch gut hinbekommt, es ist halt aufwand.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
RobSchmi
Kommentieren