Gibt es eine Möglichkeit, meiner Sandbox-Mac-App schreibgeschützten Zugriff auf Dateien in ~ / Library zu geben?

7

Ich bin etwas verwirrt mit der Sandbox. Ist das möglich?

Danke!

    
dot 08.06.2012, 15:58
quelle

1 Antwort

26

Ja, aber es erfordert eine temporäre Ausnahmeberechtigung. "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.

Schreiben Sie einen Fehlerbericht, der genau erklärt, was Sie eigentlich tun sollten, aber heute ohne Zugriff auf ~/Library nicht, und idealerweise auch einen Forum-Thread zum Thema starten. Sie können einen Workaround vorschlagen, den Sie verwenden können, 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/" . So:

%Vor%

Das zusätzliche / am Ende gibt an, wie die Sandbox weiß, dass Sie auf ein Verzeichnis statt auf eine Datei zugreifen möchten. Wenn Sie das nicht tun, erhalten Sie Zugriff auf alle Dateien in ~/Library , was Sie gefragt haben, aber nicht auf Dateien in (rekursiven) Unterverzeichnissen von ~/Library , wie zB ~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist , was ist das? du willst wahrscheinlich. Siehe Temporäre Dateizugriffs-Erweiterungen in der Berechtigungsschlüssel-Referenzdokumentation.

Beachten Sie auch, dass Sie unter " ~/Library " bereits "kostenlos" auf bestimmte Dinge 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 tun, was Sie tun - z. B. um Dateien zu lesen, die von einer früheren Version Ihrer Anwendung ohne Sandbox hinterlassen wurden. Möglicherweise können Sie sie in den Container migrieren und dort lesen.

Noch eine Sache: Nur Zugriff auf ~ / Bibliothek ändert nicht, was NSHomeDirectory() , URLsForDirectory:inDomains: , usw. zurückgibt - du bekommst stattdessen ~/Containers/com.mycompany.myproduct/Data/Library . Apples halboffizielle Empfehlung, sich damit zu befassen, besteht darin, BSD-APIs zu verwenden, um das echte Home-Verzeichnis des Benutzers zu erhalten, und der einfachste Weg ist dies:

%Vor%

Einige Anmerkungen:

  • Es ist generell keine gute Idee, getpwuid zu häufig aufzurufen. Die beste Lösung besteht darin, diesen Code einmal früher aufzurufen und dann die resultierende NSURL zu cachen.
  • Dies kann natürlich auch verwendet werden, um andere Benutzer nach Hause (und daher Library ) Verzeichnisse zu bekommen, aber der App Store wird fast sicher keine Software erlauben, die das tatsächlich versucht.
  • Die Tatsache, dass die Bibliothek sich in ~/Library befindet, wird als "Implementierungsdetail" betrachtet, das einen Tag ändern kann. Dies ist ein weiterer Grund (zusätzlich zu der Berechtigung), dass dies als vorübergehende Problemumgehung betrachtet werden muss echte Lösung für Ihr Problem auf höherer Ebene, und es könnte erwähnenswert in Ihren Review Notes sein.
abarnert 08.06.2012, 21:01
quelle

Tags und Links