2012-02-23 21 views
6

Quiero eliminar una imagen de mi aplicación de iPhone. Utilizo el siguiente método, pasando el nombre de la imagen como argumento.Eliminar imagen del directorio de aplicaciones en iPhone

El problema es que la imagen no se elimina.

- (void)removeImage:(NSString*)fileName { 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent: 
         [NSString stringWithFormat:@"%@.png", fileName]]; 

    [fileManager removeItemAtPath: fullPath error:NULL]; 
    NSLog(@"image removed: %@", fullPath); 

    NSString *appFolderPath = [[NSBundle mainBundle] resourcePath];  
    NSLog(@"Directory Contents:\n%@", [fileManager directoryContentsAtPath: appFolderPath]); 
} 

Las dos últimas líneas muestran el contenido en el directorio de mi aplicación y la imagen que quiero eliminar todavía está allí. ¿Qué estoy haciendo mal?

Respuesta

5

Está intentando eliminar un archivo en el directorio de Documentos. Luego lee los contenidos del directorio de recursos del paquete. Estos no son el mismo directorio.

Si está intentando eliminar un archivo en el directorio de Documentos, debe radiar ese directorio en su NSLog() al final. Si intentas eliminar un archivo dentro de tu paquete, esto es imposible. Los paquetes de aplicaciones están firmados y no se pueden modificar.

+0

Estoy tratando de eliminar una imagen que agregué en XCode, por lo que probablemente esté en mi paquete. Es la imagen predeterminada. Estoy tratando de eliminar este y agregar uno nuevo. – bruno

+1

No puede eliminar imágenes que están en el AppBundle (estas son imágenes que ha agregado en Xcode). – rckoenes

+0

¿No puedo reemplazar la imagen predeterminada, en lugar de eliminarla? – bruno

4

su código parece estar bien, así que trate de añadir un objeto 'NSError' a su código:

- (void)removeImage:(NSString*)fileName { 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent: 
         [NSString stringWithFormat:@"%@.png", fileName]]; 

    NSError *error = nil; 
    if(![fileManager removeItemAtPath: fullPath error:&error]) { 
     NSLog(@"Delete failed:%@", error); 
    } else { 
     NSLog(@"image removed: %@", fullPath); 
    } 

    NSString *appFolderPath = [[NSBundle mainBundle] resourcePath];  
    NSLog(@"Directory Contents:\n%@", [fileManager directoryContentsAtPath: appFolderPath]); 
} 

En el código anterior pasé por una NSError el parámetro de error de removeItemAtPath. Si el sistema no puede eliminar el archivo, este método devolverá NO y rellenará el objeto error con el error planteado.

+0

"No se pudo completar la operación. No existe ningún archivo o directorio" ¿Cómo busco archivos o carpetas? Porque parece que hay otra carpeta donde se guardan las imágenes. – bruno

+0

Bueno, ¿dónde guardó la imagen en el primer lugar? – rckoenes

2

Según su comentario, descubrí que está intentando eliminar el archivo default.png y reemplazarlo por otro. Desafortunadamente, esto es imposible. La imagen default.png es una parte de su paquete de aplicaciones, que no se puede modificar una vez que se ha creado y firmado (esta es una medida de seguridad de Apple, por lo que las aplicaciones no pueden cambiar después de haber sido revisadas). Las únicas ubicaciones donde puede crear y eliminar archivos se encuentran dentro de la zona de pruebas asignada a su aplicación (la carpeta Documentos).

+0

¿Está en las pautas de Apple? Porque no pude encontrar nada relacionado con eso. – bruno

+0

Solía ​​estar en la "Guía de programación de aplicaciones de iOS" (la sección citada aquí: http://stackoverflow.com/questions/8122267/app-bundle-protection-signed-bundle-may-be-modified) pero parecen haberlo modificado Miré a mi alrededor y encontré esto: https://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/AppSigning.html que parece indicar que solo las partes ejecutables están realmente firmadas. Sin embargo, afaik, no proporcionan una manera de hacer la modificación en tiempo de ejecución. –

+0

Aquí está la sección sobre cuánto intentan que usted pueda hacer: https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/App-RelatedResources/App-RelatedResources.html# // apple_ref/doc/uid/TP40007072-CH6-SW12 –

Cuestiones relacionadas