Um serverseitige Bandbreitenkosten zu sparen, die mit meiner iOS-Anwendung verbunden sind, habe ich eine Reihe von Assets verpackt, die ansonsten zur Laufzeit in mein iOS-Anwendungspaket heruntergeladen werden könnten. Im Kontext der geschriebenen Anwendung wäre es für mich ideal, wenn ich auf die Dateien aus einem der vom Benutzer beschreibbaren Verzeichnisse (zB [App Dir]/Library/Application Support/My Custom Subfolder/
) zugreifen könnte, ohne die Dateien dort zur Laufzeit direkt kopieren zu müssen (zB beim Start, zuerst lauf, was auch immer).
Während ich in .../My Custom Subfolder/
erfolgreich symbolische Links zu den Dateien im Bundle mit der NSFileManager
API createSymbolicLinkAtURL:withDestinationURL:error:
erstellen konnte, haben einige der Framework-APIs, mit denen ich dann später auf den Inhalt zugreift, verpatzt und gebe mir Attribute und Daten zurück, die zu den symbolischen Links gehören, anstatt der zugrunde liegenden Datei. Ich könnte diese Probleme wahrscheinlich durch die Verwendung einiger anderer Framework-APIs abschwächen, aber es könnte am Ende eine Menge Arbeit sein, abhängig vom Umfang der fehlerhaften Verwendungen.
Am Simulator konnte ich dieses Problem erfolgreich umgehen, indem ich mit dem NSFileManager
API linkItemAtURL:toURL:error:
harte Links zum Paket-Inhalt erstellte. Die harten Links funktionierten gut für alle APIs für den Dateizugriff, die in der ganzen App verwendet wurden, und alles war köstlich. Auf DEVICE (getestet auf iPhone 5c mit iOS 7.0.2 und iPad mit iOS 7.1) würde ich jedoch NSCocoaErrorDomain 513 error (Operation could not be completed. Operation not permitted.)
erhalten. Ich könnte eine Testdatei in .../My Custom Subfolder/
erstellen und eine feste Verbindung zu der im selben Ordner erstellen, aber wenn ich versuche, auf irgendetwas im schreibgeschützten Anwendungsbündel zu verlinken, bekomme ich den Fehler 513.
Weiß jemand, ob es eine Möglichkeit gibt, den Berechtigungsfehler zu umgehen, um das zu erreichen, was ich versuche?
Sie können diesen Fehler einfach nicht umgehen, da bin ich mir sicher. Ich habe keine offizielle Dokumentation gefunden - aber mehrere Tutorials, in denen erklärt wird, wie man symbolische Links auf jailbroken Geräten verwenden kann. Es gibt keinen Grund für mich, warum die Sicherheit auf iOS für harte Links anders ist. Im Simulator funktioniert das, weil es auf einem Pfad auf Ihrem lokalen Rechner läuft (in ~ / Bibliothek / Anwendungsunterstützung / iphone Simulator / iOSVersion / Anwendungen / ...) und mit lokaler Sicherheit. Als Gegenbeispiel fiel mir mehr als einmal auf, dass etwas im Simulator funktionierte, das auf dem Gerät nicht funktionierte und umgekehrt (für ein Beispiel beim Versuch, eine sqlite3 db im Hauptpaket mit dem SQLITE_WRITE Flag zu öffnen) .
Ich löse dieses Ressourcenmanagement / Versionierungsproblem in meinen Apps, indem ich zwei verschiedene Dateispeicherorte verwende. Die Originalversionen befinden sich wie üblich im Hauptpaket. Der andere Speicherort ist entweder das Cache-Verzeichnis oder das Dokumentverzeichnis. Dann verwende ich einen benutzerdefinierten Ressourcenhandler, der einen vollständigen Pfad für einen bereitgestellten relativen Pfad zurückgibt. Es funktioniert einfach so:
Einige Codes (mit dem Cache-Verzeichnis als aktualisierbarem Verzeichnis, das möchten Sie vielleicht ändern):
%Vor%In Ihrem Code würden Sie dann UpdateableCacheResourcePath ("some.file") verwenden, anstatt im Hauptpaket zu suchen. Es funktioniert auch mit referenced Ordnern (Ziehen Sie den Ordner in den xcode und wählen Sie, ob Sie eine Referenz anstelle einer Gruppe erstellen möchten). Dann können Sie relative Pfade mit übergeordneten Ordnern (wie advertisements / adbanner.png) referenzieren.
Der einzige Nachteil ist, dass wenn Sie Web-Content haben, müssen Sie alle Dateien aktualisieren, die von Ihrer HTML-Site aus offensichtlichen Gründen referenziert werden (der Webbrowser kann nur relative Pfade zu dem Ordner folgen, in dem sich das HTML-Dokument befindet).
Tags und Links iphone ios symlink nsfilemanager hardlink