2012-08-30 13 views
6

Ho bisogno della mia app sandbox per riaprire un file aperto dopo il riavvio dell'app. Apple fornisce segnalibri con ambito di sicurezza con le opzioni NSURLBookmarkCreationWithSecurityScope e NSURLBookmarkResolutionWithSecurityScope nei metodi di creazione e risoluzione dei segnalibri NSURL. Tuttavia, questi flag/opzioni sono validi solo per 10.7.3 o versioni successive e causano il fallimento di un'app precedente alla 10.7.3.Mac-Store sandboxing e gestione dei segnalibri con sicurezza prima del 10.7.3

Come gestisco la conservazione/riapertura del segnalibro del file da 10.6 a 10.7.3 in un'app sandbox?

-

FOLLOW-UP: Si prega di vedere la mia risposta qui sotto. Il problema non è stato causato dall'uso di NSURLBookmarkCreationWithSecurityScope ma utilizzando i metodi di avvio e arresto del segnalibro con ambito di sicurezza.

+0

La mia ipotesi è che probabilmente non è possibile. Questa era una carenza nel loro approccio sandboxing, e il meccanismo extra è stato aggiunto a causa di ciò. E Apple non è uno che fa il backport ... – Thilo

+2

Sei sicuro che sia la causa del fallimento? Ho un'app (in MAS) che usa '[NSURL URLByResolvingBookmarkData: opzioni dei segnalibri: NSURLBookmarkResolutionWithSecurityScope relativeToURL: nil bookmarkDataIsStale: NO error: nil];' Funziona bene su 10.6.8 macchine. – Patrick

+0

@Patrick - funziona correttamente su 10.7 - 10.7.2? (La sandbox non è operativa su 10.6.8 e la risoluzione dell'URL può semplicemente ignorare qualsiasi informazione di sicurezza aggiunta da 10.7.3+ - solo indovinando) – CRD

risposta

9

Si scopre che l'utilizzo di NSURLBookmarkCreationWithSecurityScope non causa un problema con 10.7 - 10.7.2. Quello che causa l'errore è chiamare -[NSURL startAccessingSecurityScopedResource]: che non è supportato prima di 10.7.3. Pertanto, è necessario racchiudere le chiamate a questo metodo (e al metodo di arresto corrispondente) con un controllo del sistema operativo o un controllo respondsToSelector. Ho verificato che il segnalibro funzioni ancora in 10.7.1 purché si assicuri di non chiamare start/stop.

Ecco alcuni frammento di codice per l'utilizzo di respondsToSelector, che aiuterà tutti gli altri che vengono eseguiti in questo problema:

Utilizzare questo per avviare l'utilizzo:

if([bookmarkFileURL respondsToSelector:@selector(startAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL startAccessingSecurityScopedResource]; // start using bookmarked resource 
} 

E ciò per fermare l'uso:

if([bookmarkFileURL respondsToSelector:@selector(stopAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL stopAccessingSecurityScopedResource]; // stop using bookmarked resource 
} 
+1

Perché non usare semplicemente respondsToSelector invece di controllare la versione del sistema operativo? –

+0

@ Ben-Uri Hai ragione, 'respondsToSelector' è un'implementazione migliore rispetto alla versione del sistema operativo. Ho aggiornato la risposta. – spurgeon