Ich bin ein wenig verwirrt mit der Sandbox. Ist das möglich?Gibt es eine Möglichkeit, meiner Sandbox-Mac-App schreibgeschützten Zugriff auf Dateien in ~/Library zu geben?
Danke!
Ich bin ein wenig verwirrt mit der Sandbox. Ist das möglich?Gibt es eine Möglichkeit, meiner Sandbox-Mac-App schreibgeschützten Zugriff auf Dateien in ~/Library zu geben?
Danke!
Ja, aber es erfordert eine "temporäre Ausnahme" Berechtigung. "Temporär" bedeutet, dass es in einigen zukünftigen Versionen des Betriebssystems weggehen kann, aber das ist kein großes Risiko. Das größere Problem ist das Wort "Ausnahme": Es bedeutet, dass Sie Ihre Verwendung der Berechtigung rechtfertigen müssen, oder die App Store-Prüfer werden Sie wahrscheinlich ablehnen.
Einen Fehlerbericht einreichen, der genau erklärt, was du denkst, dass du tun kannst, aber heute ohne Zugriff auf ~/Library
nicht tun kannst, und idealerweise auch einen Forumthread über das Thema starten. Sie schlagen möglicherweise eine Problemumgehung vor, anstatt auf ~/Library
zuzugreifen (vielleicht sogar mit privaten APIs). In diesem Fall tun Sie, was sie sagen. Oder sie sagen vielleicht, dass sie die temporäre Ausnahme für den Moment verwenden, in diesem Fall tun sie das. Oder sie reagieren möglicherweise nicht. In diesem Fall verwenden Sie die temporäre Ausnahme und drücken die Daumen. Vergewissern Sie sich in jedem Fall, dass Ihre Überprüfungsnotizen für die App Store einen Link zu dem Fehlerbericht und/oder dem Forum-Thread enthalten.
Sie müssen die Berechtigungen Ihres Projekts manuell bearbeiten, um dies zu tun, aber es ist nicht sehr schwer. Erstellen Sie ein com.apple.security.temporary-exception.files.home-relative-path.read-only
Array mit einer Zeichenfolge "/Library/"
. Wie folgt aus:
<key>com.apple.security.temporary-exception.files.home-relative-path.read-only</key>
<array>
<string>/Library/</string>
</array>
Die zusätzliche /
am Ende ist, wie die Sandbox weiß, dass Sie ein Verzeichnis zugreifen möchten, anstatt eine Datei. Wenn Sie es auslassen, erhalten Sie Zugriff auf alle Dateien in ~/Library
, die Sie gefragt haben, aber nicht auf Dateien in (rekursive) Unterverzeichnisse von ~/Library
, wie zum Beispiel ~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist
, was Sie wahrscheinlich wollen. Siehe File Access Temporary Extensions in der Berechtigungsschlüssel-Referenzdokumentation.
Beachten Sie außerdem, dass Sie unter "~/Library
" bereits auf bestimmte Dinge "kostenlos" zugreifen können, entweder weil sie in Ihren Container kopiert werden, oder indirekt, wenn Sie die entsprechenden APIs anstelle von Pfaden verwenden. Es könnte also einen besseren Weg geben, um das zu erreichen, was Sie tun - z. B. um Dateien zu lesen, die von einer früheren Version Ihrer App ohne Sandkasten übrig geblieben sind. Möglicherweise können Sie sie in den Container migrieren und dort lesen.
Eine weitere Sache: Nur Zugang zu ~/Library nicht ändert, was NSHomeDirectory()
, URLsForDirectory:inDomains:
usw. zurück - ich wird noch ~/Containers/com.mycompany.myproduct/Data/Library
stattdessen bekommen. Apples semi-offizielle Empfehlung für den Umgang mit dieser ist BSD-APIs verwendet den Benutzer echtes Home-Verzeichnis zu bekommen, und die einfachste Art und Weise, ist dies:
const char *home = getpwuid(getuid())->pw_dir;
NSString *path = [[NSFileManager defaultManager]
stringWithFileSystemRepresentation:home
length:strlen(home)];
NSURL *url = [NSURL fileURLWithPath:path isDirectory:YES];
Ein paar Anmerkungen:
getpwuid
zu häufig zu rufen. Die beste Lösung besteht darin, diesen Code einmal zu früh aufzurufen und dann die resultierende NSURL
zwischenzuspeichern.Library
) Verzeichnisse zu bekommen, aber der App Store wird fast sicher keine Software erlauben, die das tatsächlich versucht.~/Library
ist, wird als ein "Implementierungsdetail" betrachtet, das einen Tag ändern könnte. Dies ist ein weiterer Grund (zusätzlich zu der Berechtigung), dass dies als vorübergehende Problemumgehung betrachtet werden muss, bis Apple eine echte Lösung bietet zu Ihrem Problem auf höherer Ebene, und es könnte erwähnenswert in Ihren Review Notes sein.danke für die Antwort! – dot
Upvoted, obwohl Ihre vorgeschlagene Lösung mit 'getpwent() -> pw_dir ''/var/virusmails 'für mich zurückgibt. –
Das hat für mich funktioniert: 'getpwnam ([NSUserName() UTF8String]) -> pw_dir' –
Ist es möglich, eine Schreibberechtigung für meine Anwendung mit „com.apple.security.temporary-exception.files.absolute-path.read-schreiben Ermöglicht Lese-/Schreibzugriff auf die angegebenen Dateien oder Verzeichnisse zu bekommen, angegebene absolute Pfade. " – iGo