2015-10-12 8 views
11

Ich muss Dateien auf meinem mobilen Gerät herunterladen und sie für andere Apps (mit Android und iOS) zugänglich machen.Datei mit Cordova FileTransfer in ein öffentliches Verzeichnis speichern

ich es geschafft, eine Datei auf der SD-Karte (cordova.file.externalDataDirectory) zum Download, aber das ist nur auf Android und selbst dann kann ich nicht auf jedem Gerät verlassen eine SD-Karte mit.

Wenn ich auf den Gerätespeicher (cordova.file.dataDirectory) herunterlade, ist die Datei privat für meine App und daher für andere Apps nicht zugänglich. Die Datei kann im InAppBrowser geöffnet werden, aber ich würde lieber die entsprechende Standard-App verwenden.

Gibt es eine Möglichkeit, einen Pfad zu einem Verzeichnis auf allen Geräten öffentlich verfügbar zu machen?

Die Wege durch die Lösung in https://stackoverflow.com/a/21375812/3432305 vorgeschlagen zurückgekehrt sind sowohl private als auf Android ...

EDIT:

Ich glaube, ich meinen Anwendungsfall beschreiben sollte, damit es klarer ist, was ich versuche, zu erreichen: Ich möchte Dateien von meinem in App-Chat mit der jeweiligen Standard-App (PDF-Viewer, Bildbetrachter etc.) öffnen. Da die Cordova File Opener plugin nur Dateien aus dem lokalen Dateisystem akzeptiert, muss ich sie zuerst speichern. Aber sie müssen nicht unbedingt von außerhalb meiner App nachher zugänglich sein ...

Antwort

14

Auf Android existieren immer externe Speicherverzeichnisse; Wenn das Gerät keine physische SD-Karte besitzt, wird es von Android emuliert. siehe getExternalStorageDirectory:

Hinweis: nicht durch das Wort "extern" hier verwechselt werden. Dieses Verzeichnis kann besser als Media/Shared Storage betrachtet werden. Es ist ein Dateisystem, das eine relativ große Menge an Daten enthalten kann und die über alle Anwendungen geteilt wird (erzwingt keine Berechtigungen). Traditionell ist dies eine SD-Karte, aber es kann auch als integrierter Speicher in einem Gerät implementiert werden, das sich von dem geschützten internen Speicher unterscheidet und als Dateisystem auf einem Computer bereitgestellt werden kann.

Daher wird cordova.file.externalDataDirectory immer auflösen. Zum Freigeben von Daten zwischen Apps möchten Sie wahrscheinlich cordova.file.externalRootDirectory - Externer Speicher (SD-Karte) root verwenden. Siehe cordova-plugin-file.

Auf diese Weise können Sie Dateien an einem Ort speichern, auf den Sie von einer anderen App z. /sdcard/my_shared_data/

auf iOS, es schwieriger ist, Dateien zu teilen, weil Apps absichtlich voneinander aufgrund der Sicherheitspolitik nicht isoliert, wie Apples Inter-App Communication Guide sagt:

Apps kommunizieren nur indirekt mit anderen Anwendungen auf einem Gerät

Am besten setzen Sie auf iOS, um die Daten zu teilen, indem Sie sie über iCloud synchronisieren.Siehe Abschnitt Configuring a Common Ubiquity Container for Multiple Apps in iCloud Design Guide, der sagt:

... vielleicht bieten Ihnen zwei Anwendungen, die interoperabel und benötigen Zugriff auf die Dateien der anderen Seite. In diesen beiden Beispielen erhalten Sie den benötigten Zugriff, indem Sie einen allgemeinen Ubiquity-Container angeben und dann anfordern, um von jeder App aus darauf zuzugreifen.

+0

Hallo, Danke für Ihre Antwort! Das löst meine Probleme zumindest für Android :) Ich habe meine Frage bearbeitet um mein Problem weiter zu beschreiben. Könntest du bitte überprüfen, ob sich das für iOS ändert? In Bezug auf die iCloud, sagt der Link, dass Sie nicht "Cache, temporäre oder große heruntergeladene Datendateien" dort speichern, also würde ich es lieber nicht verwenden ... Außerdem entwickle ich eine Hybrid-App, also bin ich ein bisschen beschränkt auf die Optionen, die die Cordova Plugins bieten. Aber ich denke, das ist ein sehr verbreiteter Anwendungsfall, also sollte es auch für iOS eine einfache Lösung geben. – kolli

+2

Das Öffnen einer Datei in der Standardanwendung unterscheidet sich grundlegend von der Freigabe von Dateien zwischen bestimmten Apps und viel einfacher. [cordova-plugin-file-opener2] (https://github.com/pwlin/cordova-plugin-fileopener2) erledigt genau das, was Sie für iOS und Android benötigen. Befolgen Sie einfach die Beispiele, wo Sie die Dateien für jede Plattform speichern können. Wenn Sie ein Problem haben, können Sie ein Problem auf der Github-Seite des Plugins veröffentlichen. – DaveAlden

+0

Ich fand auch, dass dies eine leichte Aufgabe sein sollte. Trotzdem konnte ich kein gutes Beispiel für iOS finden. Ich habe es jetzt noch einmal versucht mit 'cordova.file.applicationStorageDirectory' und es scheint zu funktionieren (obwohl die Dokumentation sagt, es ist schreibgeschützt ...). Werde es später nochmal versuchen mit 'cordova.file.cacheDirectory', aber ich denke, es sollte in Ordnung sein. Danke! – kolli

Verwandte Themen