Gute Möglichkeit zum Verwalten des Ordners Dokumente / Posteingang in einer iOS-App

8

Wenn eine Datei vom Document Interaction System an eine iOS-Anwendung übergeben wird, wird eine Kopie der Datei im Ordner Documents/Inbox des Anwendungspakets gespeichert. Nachdem die Anwendung die Datei verarbeitet hat, muss sie offensichtlich die Datei von Documents/Inbox entfernen, sonst wird der Ordner weiter wachsen und Speicherplatz auf dem Gerät verschwenden.

Ich fühle mich mit dieser einfachen Lösung (A) jedoch nicht wohl, da meine App mit dem Benutzer interagieren muss, bevor er die Verarbeitung beenden und die Datei entfernen kann. Wenn der Nutzer die App während dieses Interaktionszeitraums aussetzt und die App im Hintergrund beendet wird, wird die veraltete Datei beim nächsten Start der App nicht entfernt. Natürlich kann ich meine App verbessern, um dieses Szenario abzudecken, aber ich vermute, dass es immer einen anderen Grenzfall geben wird, der mich mit einem "unsauberen" Documents/Inbox -Ordner verlassen wird.

Eine bevorzugte Lösung (B) wäre daher, den Ordner Documents/Inbox zu einem geeigneten Zeitpunkt zu entfernen (z.B. wenn die App normal startet, d. h. nicht über eine Dokumenteninteraktion). Ich fühle mich immer noch unwohl dabei, weil ich auf einen Dateisystempfad zugreifen würde, dessen Speicherort nirgendwo offiziell dokumentiert ist. Zum Beispiel würde meine App brechen, wenn in einer zukünftigen Version von iOS das Dokumenteninteraktionssystem keine Dateien mehr in Document/Inbox speichert.

Meine Fragen sind also:

  1. Würden Sie Lösung A oder B empfehlen?
  2. Verwenden Sie einen anderen Ansatz und können Sie vielleicht einen Überblick darüber geben, wie Ihre App Document/Inbox verwaltet?
  3. Und zu guter Letzt: Kennen Sie eine offizielle Apple-Dokumentation, die das Thema behandelt und die ich übersehen habe?
herzbube 29.03.2013, 17:01
quelle

2 Antworten

11

Seit ich diese Frage gestellt habe, habe ich die folgende Lösung implementiert:

  • Ich habe meine App so umgestaltet, dass sie sofort eine über die Interaktion mit der Dokumentation übergebene Datei verarbeitet, ohne den Benutzer überhaupt zu involvieren. Solange die App nicht abstürzt oder unterbrochen und getötet wird, sollte mir während der Verarbeitung der Datei immer ein sauberes Documents/Inbox übrigbleiben.
  • Um den (seltenen) Fall eines Absturzes oder auszusetzen / zu beenden, entfernt meine App den Ordner Documents/Inbox , wenn er normal gestartet wird (d. h. ohne den Zweck der Dokumentinteraktion). Um dies zu erreichen, ist der Verzeichnispfad Documents/Inbox notwendigerweise fest codiert.

Hier sind die Gedanken, die in die Lösung gingen:

  • Neugestaltung der App
    • Zunächst schien es eine gute Idee zu sein, dem Benutzer eine Auswahl zu geben, wie sie eine Datei verarbeiten wollte - schließlich würde das Angebot einer Auswahl die App flexibler machen und dem Benutzer mehr Freiheit bieten, oder?
    • Ich habe dann festgestellt, dass ich versucht habe, die Verantwortung dafür zu verlagern, zu entscheiden, wie die Interaktion des Dokuments mit dem Benutzer gehandhabt werden soll. Also habe ich in den sauren Apfel gebissen, die harten Entscheidungen im Voraus getroffen und mich dann glücklich gemacht, ein einfaches und unkompliziertes Dokumenteninteraktionssystem in meiner App zu implementieren.
    • Wie sich herausstellt, bedeutet keine Benutzerinteraktion auch, dass die App einfacher zu verwenden ist. Hier ist eine Win-Win-Situation, sowohl für mich als Entwickler als auch für die Nutzer meiner App.
  • Entfernen des Documents/Inbox -Ordners während des App-Starts
    • Das Entfernen des Documents/Inbox -Ordners während des App-Starts ist nur ein nachträglicher Einfall, kein wesentlicher Teil davon, wie meine App die Dokumenteninteraktion behandelt
    • Daher bin ich durchaus bereit, das Risiko einzugehen, dass Apple den Dateisystempfad des Posteingangs zu einem späteren Zeitpunkt ändern könnte. Das Schlimmste, was passieren kann, ist, dass meine App einige Dateien anhäuft, die Reste von Absturz- oder Suspend / Kill-Szenarien sind.

Und schließlich ein paar Gedanken für die weitere Entwicklung:

  • Wenn sich herausstellt, dass wirklich mehr als eine Möglichkeit sein sollte, wie die App die Interaktion mit Dokumenten handhaben kann, würde ich eine Benutzereinstellung hinzufügen, so dass der Benutzer eine Entscheidung treffen muss und die App muss die Verarbeitung nicht anhalten, um den Benutzer nach einer Auswahl zu fragen.
  • Wenn sich herausstellt, dass die Benutzerinteraktion mitten in der Verarbeitung der Dokumentinteraktion absolut unvermeidbar ist, würde ich diesen Ansatz betrachten: 1) Bevor der Benutzer interagieren darf, verschiebe die Datei von Documents/Inbox auf einige Art von "Staging" -Ordner; 2) Lassen Sie die Benutzerinteraktion stattfinden; 3) Verarbeiten Sie die Datei im "Staging" -Ordner auf die vom Benutzer gewählte Weise. Wichtig dabei ist, dass der Ordner "staging" an einem bekannten Ort ist und vollständig von der App verwaltet wird . Sollte der Benutzer die App während des Benutzerinteraktionsschritts anhalten und dann beenden, kann einfach eine entsprechende Aktion ausgeführt werden, wenn die App das nächste Mal gestartet wird.

BEARBEITEN

In iOS 7 ist es nicht mehr möglich, Documents/Inbox nach der Erstellung zu entfernen. Die NSFileManager Methode removeItemAtPath:error: gibt den Kakao Fehler 513 zurück, der in NSFileWriteNoPermissionError aufgelöst wird (vgl. diese Liste der Foundation-Konstanten ). Der Fehler scheint nicht auf POSIX-Berechtigungen bezogen zu sein, sieht jedoch eher so aus, als ob das System selbst den Löschversuch stört (möglicherweise Schutz der App-Bundle-Struktur?).

Bemerkenswert ist auch, dass Apple in der Dokumentation von Documents/Inbox method UIApplicationDelegate explizit application:openURL:sourceApplication:annotation: benannt hat. Sie sagen auch, dass

  

[...] Ihre App hat die Berechtigung zum Lesen und Löschen von Dateien in diesem Verzeichnis, hat jedoch keine Berechtigung zum Schreiben. Wenn Sie eine Datei ändern möchten, müssen Sie sie zuerst in ein anderes Verzeichnis verschieben.

In Dokumenten finden Sie weitere Informationen zur möglichen Verschlüsselung der Dateien. aber du solltest das selbst nachlesen.

    
herzbube 29.06.2013, 17:37
quelle
0

Ich stehe gerade vor demselben Problem. Wie Sie, ich habe keine gute Lösung, aber als Antwort auf Ihre Fragen bin ich auf Option A über Option B, weil ich nicht die Idee mag, ein Problem mit zukünftigen Versionen des Betriebssystems zu haben. Da es in meinem Fall keine Benutzerinteraktion gibt, nachdem ich die Vorschau des Dokuments angezeigt habe, kann ich fortfahren und sie löschen, wenn ich den –documentInteractionControllerDidEndPreview: Delegat-Rückruf erhalte. Dies ist insofern theoretisch, als ich dies noch nicht programmiert habe und es für eine Weile nicht erreichen werde, da es sich um einen Gegenstand mit niedriger Priorität handelt. Wenn es nicht funktioniert oder es andere Probleme gibt, werde ich hier berichten. Die Google-Suche, die ich eingegeben habe, um die Dokumentation von Apple zu finden, zeigte auf diesen StackOverflow-Beitrag. Ich habe keine anderen nützlichen Informationen von Apple oder irgendjemand anderem zu diesem Thema gesehen.

    
SMJ 18.04.2013 13:39
quelle

Tags und Links