2010-08-09 12 views
19

Estoy intentando crear una carpeta dentro de la carpeta/sounds de mi aplicación.Carpeta de creación de NSFileManager (error de cacao 513.)

-(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); 
} 

Pero me sale este error:

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"} 

¿Qué estoy haciendo mal? Gracias.

Respuesta

46

Si busca en Google el dominio de error NSCocoaErrorDomain, encontrará que el código 513 se traduce en el error NSFileWriteNoPermissionError.

Esto le proporciona la clave fundamental para resolver este problema:

This is the bundle directory containing the application itself. Because an application must be signed, you must not make changes to the contents of this directory at runtime. Doing so may prevent your application from launching later.

En concreto, no se puede modificar el contenido de la carpeta paquete de una aplicación compilada. Esto se debe a que el paquete es la aplicación compilada.

Cuando finalmente distribuye la aplicación a través de iTunes App Store, la aplicación tiene una firma digital que valida el contenido de la aplicación. Esta firma se genera en tiempo de compilación.

Si intenta cambiar el paquete después de la compilación, la aplicación cambia y la firma digital ya no es válida. Esto invalida la aplicación. ¿Quién sabe qué código hay allí, correcto? - y los usuarios finales no podrán ejecutarlo. Entonces, Apple ha configurado iOS para lanzar un error si intenta modificar el paquete.

En lugar de escribir para el paquete, su aplicación puede escribir en one of three accepted app-specific folders: Documents, Temp y Cache. Lo más probable es que desee escribir en la carpeta Documents.

Estas carpetas solo son accesibles para su aplicación. Ninguna otra aplicación puede acceder al contenido de estas carpetas. (Del mismo modo, su aplicación no puede acceder a las carpetas de otra aplicación.)

Puede configurar su aplicación para permitir que el usuario final administre el acceso a los datos del archivo a través de iTunes, a través del desktop file sharing support.

+1

Gracias por su respuesta Alex, si puede, actualice el último enlace porque la página ya no existe. – IgniteCoders

+1

Curiosamente (al menos con Xcode 6 e iOS 8) PUEDE crear directorios en el paquete en el simulador, pero el mismo código fallará en el dispositivo. –

+0

^re: Jared Egan, esto sigue siendo cierto con el simulador para Xcode 8 y iOS 10 – markedwardmurray

6

Esto se debe a que nunca debe modificar el paquete de su aplicación en tiempo de ejecución. En su lugar, debe tener una carpeta en otro lugar donde pueda agregar recursos.

EDIT:
El error que está viendo es muy probable porque no puede escribir en el paquete.

+2

+1 Como parte del modelo de seguridad de iOS, no puede modificar el paquete de la aplicación una vez que se ha compilado la aplicación. Esto evita la posibilidad de que las aplicaciones de modificación de malware después de la instalación. Los archivos generados en tiempo de ejecución deben guardarse en la carpeta Documentos de la carpeta Biblioteca en el directorio de la aplicación. Este último es preferido para los archivos que el usuario nunca tendrá acceso por ningún otro medio que no sea la aplicación en sí. – TechZen

2

Me encuentro con el mismo problema cuando se utiliza una biblioteca Log. Finalmente, es un problema de formato de ruta. Compruebe el formato dataPath. Si es Case 1, es válido. En mi caso, es Case 2, por lo que no pude crear el directorio.

// 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 

Si el dataPath tiene un prefijo, por ejemplo: file://, es inválida .


En cuanto a una instancia de NSURL, path devolverá la cadena como case 1 y absolutePath devolverá la cadena como case 2.

Cuestiones relacionadas