está guardando en NSDocumentDirectory ¿está bien?

Mi aplicación está utilizando NSDocumentDirectory para save imágenes, solo quiero preguntar si es la forma más segura de save imágenes (100 como máximo). He leído varios subprocesss y preguntas con respuestas al respecto, aunque no sé qué seguir. Algunos dicen que está bien savelo allí. Algunos dicen que no debería usar NSDocumentDirectory para save, porque será una copy de security de iCloud . Entonces, ¿dónde puedo savelo cuando el usuario sale de la aplicación y luego vuelve a ejecutar la aplicación, entonces las imágenes deberían estar allí ?. No sé mucho sobre el directory tmp o el directory de cache . Pero si es uno de los 2 que debería usar, ¿cómo puedo usarlos en mi código aquí?

  NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask ,YES ); NSString *documentsDir = [paths objectAtIndex:0]; NSString *savedImagePath = [documentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Images%d.png", i]]; ALAssetRepresentation *rep = [[info objectAtIndex: i] defaultRepresentation]; UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage]]; //----resize the images image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)]; NSData *imageData = UIImagePNGRepresentation(image); [imageData writeToFile:savedImagePath atomically:YES]; 

Muchas gracias por la ayuda.

Los directorys de tmp y cache son limpiados periódicamente por iOS. Si las imágenes son de uso general, use el rollo de la camera como sugieren las otras dos respuestas. Sin embargo, si estas imágenes están destinadas solo al scope de su aplicación, puede almacenarlas de manera segura en el directory de Documentos, solo debe include una llamada de function "Excluir desde la copy de security de iCloud" a cada file después de save, para evitar Apple rechazando tu aplicación por usar demasiado espacio iCloud. Por supuesto, hay una compensación, desactivar esto significa que el usuario perderá sus fotos de todos modos si borran la aplicación u obtienen otro dispositivo (etc.), pero esta advertencia es preferible a no tener la aplicación en la tienda.

Para deshabilitar la copy de security de iCloud en un file, hay dos methods para las versiones de iOS> 5.0:

¡ACTUALIZAR! FUSIÓN DE AMBOS MÉTODOS EN UNA ÚNICA FUNCIÓN QUE MANEJA AUTOMÁTICAMENTE LA VERSIÓN DE iOS:

 #include <sys/xattr.h> // Needed import for setting file attributes +(BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)fileURL { // First ensure the file actually exists if (![[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]]) { NSLog(@"File %@ doesn't exist!",[fileURL path]); return NO; } // Determine the iOS version to choose correct skipBackup method NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; if ([currSysVer isEqualToString:@"5.0.1"]) { const char* filePath = [[fileURL path] fileSystemRepresentation]; const char* attrName = "com.apple.MobileBackup"; u_int8_t attrValue = 1; int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); NSLog(@"Excluded '%@' from backup",fileURL); return result == 0; } else if (&NSURLIsExcludedFromBackupKey) { NSError *error = nil; BOOL result = [fileURL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error]; if (result == NO) { NSLog(@"Error excluding '%@' from backup. Error: %@",fileURL, error); return NO; } else { // Succeeded NSLog(@"Excluded '%@' from backup",fileURL); return YES; } } else { // iOS version is below 5.0, no need to do anything return YES; } } 

Si su aplicación debe admitir 5.0, desafortunadamente su única opción es save esas fotos en el directory de Caches, lo que significa que no se realizarán copys de security (esto no provocará un rechazo de App Store por ese motivo), pero siempre que el perro guardián de almacenamiento decida Es hora de limpiar la carpeta Caches, perderás esas fotos. No es una implementación ideal en absoluto, pero tal es la naturaleza de la bestia en 5.0, donde Apple agregó la exclusión de respaldo como una idea de último momento.

EDITAR: se olvidó de responder a la pregunta "cómo save en el directory tmp / caching" de la pregunta. Si decides ir por ese path:

  • Ahorro a tmp :

     NSString *tempDir = NSTemporaryDirectory(); NSString *savedImagePath = [tempDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Images%d.png", i]]; 

(tenga en count que esto no parece tener ningún efecto en el simulador, pero funciona como se esperaba en el dispositivo)

  • Guardar en Cache :

     NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject]; NSString *savedImagePath = [cacheDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Images%d.png", i]]; 

Si desea que el usuario pueda usar las imágenes en otras aplicaciones o verlas junto con sus fotos, use el álbum de fotos como sugiere Mike D. Si los files son algo que generas localmente para usarlo solo con tu aplicación, probablemente deberías usar el directory de documentos. Puede exponer el directory de documentos a iTunes con la opción info.plist "Aplicación compatible con el uso compartido de files iTunes", que permitirá al usuario agregar o eliminar files a través de iTunes, pero los files no estarán expuestos a otras aplicaciones

Está guardando imágenes a escala para que realmente sean solo útiles para su juego. No van a ser muy grandes y no ocuparán mucho espacio. Podría savelos en el directory de la biblioteca de la aplicación y evitar todo el asunto de iCloud, ya que no parece que exista ninguna razón para respaldarlos. Además, save la biblioteca evita la posibilidad de que el usuario los elimine, si por algún otro motivo comparte iTunes.

Actualización: código para save en el directory de la biblioteca de la aplicación

 - (void)saveSequences:(NSMutableDictionary*)sequences { NSArray *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *libDirectory = [path objectAtIndex:0]; NSString *settingsPath = [libDirectory stringByAppendingPathComponent:@"userSequences.plist"]; NSLog(@"settingsPath %@", settingsPath); [sequences writeToFile:settingsPath atomically:YES]; } 

// El siguiente código obtiene la ruta a un directory con nombre en la carpeta 'Documentos' y, si no existe, lo crea. Ajústelo para usar la ruta de la Biblioteca, si decide ir por esa ruta.

 - (NSString *)getDirectoryBySequenceName:(NSString *)sequenceName { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentDirectory = [paths objectAtIndex:0]; NSString * sequenceDirectory = [documentDirectory stringByAppendingPathComponent:sequenceName]; NSError *error; BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath:sequenceDirectory withIntermediateDirectories:YES attributes:nil error:&error]; if (!success) { NSLog(@"Error creating data path: %@", [error localizedDescription]); } return sequenceDirectory; } 

Dependiendo del propósito de su aplicación, puede savelo en la aplicación de fotos ( UIImageWriteToSavedPhotosAlbum(image, self, nil, nil) , creo, reference de Apple ). Guardar aquí, o en el directory de documentos (o cualquier subcarpeta), permitirá al usuario hacer copys de security de esas imágenes en iCloud o iTunes, si el usuario también elige y / o si han configurado iCloud.

Como indica que las imágenes deben persistir entre los inicios, el directory temporal o de caching se vacía cuando la aplicación se elimina de la memory, tal vez antes (la O / S decide).

Más sobre el sistema de files iOS .