Grandes files descargados en Documentos y respaldados en iCloud

Tengo una aplicación de iOS en la tienda de aplicaciones que puede download files relativamente grandes que necesitan permanecer en el dispositivo para su uso sin connection. Esos files están actualmente almacenados en la carpeta Documents la aplicación, pero ahora estoy leyendo que la carpeta Documents está respaldada y que solo debería usarse para el contenido generado por el usuario. Este Q & A técnico de Apple establece que NSURLIsExcludedFromBackupKey debe configurarse para evitar la copy de security. Esto indica que las aplicaciones /Library/Caches son el lugar adecuado para colocar estos types de files, aunque una lectura más detallada sugiere que la carpeta se puede borrar cuando el dispositivo tiene poco almacenamiento, lo que es inaceptable para esta aplicación. Creo que /Library/Application Support/ es la mejor location para ellos, ¿suena bien?

Lamentablemente, este error pasó por el process de revisión de la aplicación. ¿Cuáles son algunas de las mejores prácticas para solucionar esto ahora que las personas están usando la aplicación y ya tienen algunos files que persisten en la carpeta Documents y sus copys de security? Parece que necesito mover todos los files existentes y establecer su NSURLIsExcludedFromBackupKey en la actualización de la aplicación. ¿Cómo garantizo que esto se hace exactamente una vez y que no se interrumpe? ¿Es importante mover los files de la carpeta Documents o podría dejarlos allí? ¿Cambiar el estado de la copy de security de los files los eliminará de las copys de security existentes?

Estoy usando Swift 2.1.1 y apuntando a iOS 8.0+.

Como se indica en las preguntas y respuestas técnicas, lo mejor que puede hacer es crear un subdirectory en los Documentos y excluir ese subdirectory una vez.

No creo que puedas escribir una rutina de "hazlo una vez y asegúrate de que está hecho", ya que no puedes garantizar que tu aplicación no se cuelga mientras se está ejecutando. Ciertamente, podría establecer un indicador de finalización cuando esté seguro de que se hace para que, una vez hecho esto, no tenga que volver a ejecutarlo.

Excluye tu directory de la copy de security, no los files individuales. Desde Xcode:

Puede usar esta propiedad para excluir el caching y otros files de soporte de aplicaciones que no son necesarios en una copy de security. Algunas operaciones comúnmente realizadas a documentos de usuario hacen que esta propiedad se restablezca en falso; en consecuencia, no use esta propiedad en los documentos del usuario.

Aquí está la estrategia que he usado con buenos resultados (lo siento, está en el objective -c: no soy un hombre rápido. Espero que te dé la idea):

  - (BOOL)moveAllFiles{ // Searches through the documents directory for all files ending in .data BOOL success = true; NSString *myNewLocation = @"/store/my/files/here/now"; // Get the documents directory NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = [documentDirectories objectAtIndex:0]; // Get all files ending in .data (whatever your file type is) NSArray *dataFilesArray = [NSArray arrayWithArray:[NSBundle pathsForResourcesOfType:@"data" inDirectory:documentDirectory]]; // If you have multiple resource types, use this line once each for each resource type, then append the arrays. // Iterate the found files NSString *fileName = [NSString string]; for (int i=0; i<[dataFilesArray count]; i++) { fileName = [[dataFilesArray objectAtIndex:i] lastPathComponent]; // Move file, set success to false if unsuccessful move if (![[NSFileManager defaultManager] moveItemAtPath:[dataFilesArray objectAtIndex:i] toPath:[myNewLocation stringByAppendingPathComponent:fileName] error:nil]) { success = false; // Something went wrong } } return success; } 

Ahora use el valor de éxito para establecer una key en el file pnetworkingeterminado de usuario. Verifique esa key en el inicio. Si es falso (o ausente), ejecute esta rutina (de nuevo).

Este ejemplo es con routes de file. Puede hacer lo mismo con las URL del file si lo desea.