2009-05-26 19 views
6

Tengo una aplicación de iPhone en la que varios objetos de dominio se rellenan con datos ingresados ​​por el usuario. Para restaurar el estado después de la interrupción, estos objetos implementan el protocolo NSCoding y se escriben en el disco (el directorio de Documentos) en el mensaje applicationWillTerminate. Luego, cuando la aplicación se inicia de nuevo, los bytes de datos se cargan y los objetos de dominio se vuelven a llenar. Código para obtener el directorio de documentos es el siguiente:¿Cómo arreglo el error de Cocoa 513?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

Esto funcionó muy bien en el simulador, pero una vez desplegué la aplicación para el iPhone que dejó de funcionar. El motivo es el código de error 513 de iPhone, que aparentemente significa "permiso denegado". Hay una nota en la documentación dev iPhone que explican un poco más -

En el dispositivo, la ruta devuelta (documentsDirectory) es similar a la siguiente: /var/mobile/Applications/30B51836- Documentos D2DD-43AA-BCB4-9D4DADFED6A2/

Sin embargo, en el simulador, la ruta devuelta toma la forma siguiente:

/Volumes/materia/Usuarios/JohnDoe/Librería/Application Soporte/iPhone Simulador/user/Aplicaciones/118086A0-FAAF-4CD4-9A0F-CD5E8D287270/Documentos

Este es el comportamiento exacto que estoy viendo. No estoy muy seguro de cómo se relaciona esto con obtener un error de permiso denegado y qué puedo hacer para solucionarlo. Sí dice abajo -

a leer y escribir las preferencias del usuario, utilizar la clase NSUserDefaults o la API CFPreferences. Estas interfaces eliminan la necesidad de que construyan una ruta al directorio Biblioteca/Preferencias/y archivos de preferencias de lectura y escritura directamente. Para obtener más información sobre el uso de estas interfaces, consulte “Adición de el paquete de configuración”.

Si la aplicación contiene sonido, imagen , u otros recursos en el paquete aplicación, debe utilizar la clase NSBundle o CFBundle opaca escriba para cargar esos recursos. Los paquetes tienen un conocimiento inherente de dónde viven los recursos dentro de la aplicación. Además, los paquetes son conscientes de las preferencias de idioma del usuario y son capaces de elegir recursos localizados sobre los recursos predeterminados automáticamente. Para obtener más información sobre los paquetes, ver “El paquete de aplicaciones.”

No veo cómo puedo usar el paquete de aplicaciones para cargar bytes de datos sin embargo. Cualquier ayuda o ejemplos?

Respuesta

13

No estoy seguro de cómo funciona esto, pero aparentemente el uso de stringByAppendingPathComponent en lugar de stringByAppendingString para la creación de la ruta solucionó el problema.

+1

Creo que la diferencia es la barra al final de "Documentos". –

1

El párrafo relacionado con el paquete de aplicaciones se refiere a:

NSString *path = [[NSBundle mainBundle] pathForResource:@"somefile" ofType:@"png"]; 

Este y otros métodos de NSBundle le permiten hacer referencia recursos de dentro del paquete de aplicaciones sin tener que saber dónde se encuentra el paquete de aplicaciones.

Descargo de responsabilidad: No he trabajado con el iPhone.

Teniendo en cuenta el descargo de responsabilidad, en el OS X simple se considera una mala forma escribir cosas dentro del paquete de la aplicación. Guarda cosas en el directorio de soporte de la aplicación del usuario -> ver NSApplicationSupportDirectory.

0

Recibí este error (513) porque la ruta era incorrecta. Comprobación doble mi ruta solucionó el problema :)

Cuestiones relacionadas