2012-06-08 11 views

risposta

26

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:

  • non è in genere un buona idea di chiamare getpwuid troppo spesso. La soluzione migliore è chiamare questo codice una volta in anticipo e quindi memorizzare nella cache il NSURL risultante.
  • Questo ovviamente può essere utilizzato anche per ottenere le directory degli altri utenti (e quindi di Library), ma l'App Store quasi certamente non permetterà a nessun software che effettivamente lo provi.
  • Il fatto che la libreria sia ~/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.
+0

grazie per la risposta! – dot

+0

Suvati, anche se la soluzione proposta per l'utilizzo di 'getpwent() -> pw_dir' restituisce'/var/virusmails' per me. –

+2

Questo ha funzionato per me: 'getpwnam ([NSUserName() UTF8String]) -> pw_dir' –