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:
Document/Inbox
verwaltet? Seit ich diese Frage gestellt habe, habe ich die folgende Lösung implementiert:
Documents/Inbox
übrigbleiben. 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:
Documents/Inbox
-Ordners während des App-Starts
Documents/Inbox
-Ordners während des App-Starts ist nur ein nachträglicher Einfall, kein wesentlicher Teil davon, wie meine App die Dokumenteninteraktion behandelt Und schließlich ein paar Gedanken für die weitere Entwicklung:
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.
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.
Tags und Links ios