Sono un po 'confuso con la sandbox. È possibile?C'è un modo per dare alla mia app Mac in modalità sandbox leggere solo l'accesso ai file in ~/Library?
Grazie!
Sono un po 'confuso con la sandbox. È possibile?C'è un modo per dare alla mia app Mac in modalità sandbox leggere solo l'accesso ai file in ~/Library?
Grazie!
Sì, ma richiede un'autorizzazione "eccezione temporanea". "Temporaneo" significa che potrebbe andare via in alcune versioni future del sistema operativo, ma non è molto rischioso. Il problema più grande è la parola "eccezione": significa che dovrai giustificare il tuo utilizzo della titolarità, altrimenti i revisori di App Store probabilmente ti rifiuteranno.
Archivia un bug report che spiega esattamente cosa pensi che dovresti essere in grado di fare, ma non puoi farlo oggi senza accesso a ~/Library
, e idealmente anche avviare un thread sul forum sull'argomento. Possono suggerire una soluzione alternativa da utilizzare invece di accedere a ~/Library
(magari utilizzando anche API private), nel qual caso, fare ciò che dicono. Oppure possono dire di usare l'eccezione temporanea per ora, nel qual caso, farlo. Oppure potrebbero non rispondere, nel qual caso si utilizza l'eccezione temporanea e si incrociano le dita. In ogni caso, assicurati che le tue note di revisione dell'invio dell'App Store abbiano un link alla segnalazione del bug e/o al thread del forum.
È necessario modificare manualmente le titolarità dei progetti per eseguire questa operazione, ma non è molto difficile. Creare un array com.apple.security.temporary-exception.files.home-relative-path.read-only
, con una stringa, "/Library/"
. Come questo:
<key>com.apple.security.temporary-exception.files.home-relative-path.read-only</key>
<array>
<string>/Library/</string>
</array>
L'extra /
alla fine è come il sandbox sa che si desidera accedere a una directory, piuttosto che un file. Se lo lasci, avrai accesso a tutti i file in ~/Library
, che è quello che hai chiesto, ma non ai file nelle sottodirectory (ricorsive) di ~/Library
, come, ad esempio, ~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist
, che è ciò che probabilmente vuoi. Vedere File Access Temporary Extensions nella documentazione di riferimento della chiave di autorizzazione.
Inoltre, si noti che è già possibile accedere "gratuitamente" a determinate attività con ~/Library
, sia perché vengono copiati nel contenitore, sia indirettamente quando si utilizzano le API appropriate anziché utilizzare i percorsi. Pertanto, potrebbe esserci un modo migliore per realizzare ciò che stai facendo, ad esempio, per leggere i file lasciati da una versione precedente non salvata in sandbox della tua app, potresti essere in grado di migrarli nel contenitore e leggerli lì.
più una cosa: Basta avere accesso a ~/Library non cambia quello che tornerà NSHomeDirectory()
, URLsForDirectory:inDomains:
, ecc - hai ancora ottenere ~/Containers/com.mycompany.myproduct/Data/Library
invece. raccomandazione semi-ufficiale di Apple per affrontare questo è quello di utilizzare le API BSD per ottenere la directory home reale dell'utente, e il modo più semplice è questa:
const char *home = getpwuid(getuid())->pw_dir;
NSString *path = [[NSFileManager defaultManager]
stringWithFileSystemRepresentation:home
length:strlen(home)];
NSURL *url = [NSURL fileURLWithPath:path isDirectory:YES];
Alcune note:
getpwuid
troppo spesso. La soluzione migliore è chiamare questo codice una volta in anticipo e quindi memorizzare nella cache il NSURL
risultante.Library
), ma l'App Store quasi certamente non permetterà a nessun software che effettivamente lo provi.~/Library
è considerato un "dettaglio di implementazione" che potrebbe cambiare un giorno, che è un'altra ragione (in cima alla titolarità) che questa deve essere considerata una soluzione temporanea finché Apple non fornisce una soluzione reale al tuo problema di livello superiore, e potrebbe valere la pena di menzionare nelle tue note di revisione.grazie per la risposta! – dot
Suvati, anche se la soluzione proposta per l'utilizzo di 'getpwent() -> pw_dir' restituisce'/var/virusmails' per me. –
Questo ha funzionato per me: 'getpwnam ([NSUserName() UTF8String]) -> pw_dir' –
E 'possibile ottenere un permesso di scrittura alla mia app con "com.apple.security.temporary-exception.files.absolute-path.read-scrivere Abilita lettura/scrittura ai file o directory specificata al percorsi assoluti specificati. " – iGo