cartella di creazione NSFileManager (cacao errore 513.)
-
27-09-2019 - |
Domanda
Sto cercando di creare una cartella all'interno della cartella dei suoni / della mia app.
-(void)productPurchased:(UAProduct*) product {
NSLog(@"[StoreFrontDelegate] Purchased: %@ -- %@", product.productIdentifier, product.title);
NSFileManager *manager = [NSFileManager defaultManager];
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSError *error;
NSString *dataPath = [NSString stringWithFormat:@"%@/sounds/%@", bundleRoot, product.title];
if (![manager fileExistsAtPath:dataPath isDirectory:YES]) {
[manager createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"Creating folder");
}
NSLog(@"%@", error);
}
Ma ottengo questo errore:
Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x175120 {NSFilePath=/var/mobile/Applications/D83FDFF9-2600-4056-9047-05F82633A2E4/App.app/sounds/Test Tones, NSUnderlyingError=0x117520 "The operation couldn’t be completed. Operation not permitted"}
Che cosa sto facendo di sbagliato? Grazie.
Soluzione
Se si esegue una ricerca Google sul dominio di errore NSCocoaErrorDomain
si scopre che il codice 513
traduce l'errore NSFileWriteNoPermissionError
.
Questo vi dà l'indizio fondamentale per risolvere questo problema:
In particolare, non è possibile modificare il contenuto della cartella fascio di un'applicazione compilata. Questo perché il fascio è l'applicazione compilata.
Quando finalmente distribuire l'applicazione tramite iTunes App Store, l'applicazione dispone di una firma digitale che convalida il contenuto del app. Questa firma viene generata in fase di compilazione.
Se si tenta di modificare il pacchetto dopo la compilazione, i cambiamenti app e la firma digitale non è più valido. Questa invalida l'applicazione - che sa quale codice è in là, giusto? - e gli utenti finali non saranno in grado di farlo funzionare. Così Apple ha istituito iOS per lanciare un errore se si tenta di modificare il pacchetto.
Invece di scrivere al fascio, la vostra applicazione può scrivere a una delle tre cartelle app-specifico accettato : Documents
, Temp
e Cache
. Molto probabilmente, si vuole in scrittura alla cartella Documents
.
Queste cartelle sono accessibili solo per la vostra applicazione. Nessun altra applicazione può accedere ai contenuti di queste cartelle. (Allo stesso modo, la vostra applicazione non può accedere alle cartelle di un altro app.)
È possibile impostare la vostra applicazione per consentire all'utente finale di gestire l'accesso ai dati dei file tramite iTunes, tramite file sul desktop il supporto condivisione .
Altri suggerimenti
Questo è perché non si dovrebbe mai modificare il fascio della vostra applicazione in fase di esecuzione. Invece, si dovrebbe avere una cartella altrove in cui è possibile aggiungere risorse.
EDIT:
L'errore che state vedendo è più probabile perché non è possibile scrivere al pacchetto.
ho incontrato lo stesso problema, quando si utilizza un Accedi biblioteca. Infine, il suo percorso problema di formato. Controllare il formato dataPath
. Se è Case 1
, è valido. Nel mio caso, è Case 2
, così sono riuscito a creare la directory.
// Case 1
/var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs
// Case 2, invalid format
file://var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs
Se il dataPath
ha un prefisso, ad esempio:. file://
, è non valida
Per quanto riguarda un'istanza di NSURL
, path
restituirà la stringa del tipo case 1
, e absolutePath
restituirà la stringa come case 2
.