2012-04-18 8 views
5

Mi aplicación fue rechazada porque debe seguir las Pautas de almacenamiento de datos de iOS. Ya he leído algunas respuestas aquí en stackoverflow, y ya he leído algunos blogs ... Conozco mi problema, en el primer lanzamiento de la aplicación copio 1 sqlite db y descomprimo algunas imágenes en la carpeta de documentos. El problema es icloud que automaticcaly copia de seguridad de cualquier archivo en el directorio de documentos. No necesito usar icloud en mi aplicación, pero mis archivos deben permanecer en la carpeta del documento porque son los datos base de mi aplicación y deben ser persistentes (la carpeta de caché o la carpeta temporal no son soluciones correctas). Así que he leído sobre una bandera que puedo configurar archivo por archivo para prohibir la copia de seguridad:Directrices para el almacenamiento de datos de iOS Rechazo

[URL setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey error: nil];

También he leído que este método funciona solo en ios superiores a 5.0.1, en el otro simplemente se ignorará (he configurado mi destino de implementación ios a 4.3) ... Si uso este método mi aplicación se rechazarán nuevamente porque la copia de seguridad de los dispositivos ios más antiguos no se administran? En caso afirmativo, hay un método de iosversión cruzada para establecer NSURLIsExcludedFromBackupKey?

EDIT Lo siento icloud no está presente en ios 5.0 anteriormente, así que creo que el problema solo se refiere a las diferencias entre la versión 5.0 y la 5.0.1, ¿estoy equivocado?

+0

Comprobar este enlace http://stackoverflow.com/questions/8818117/application-rejected-because-of-not-following-ios-data-storage-guidelines Gracias! – Kiran

+0

gracias, pero ya he leído esta respuesta, todavía tengo algunos doblajes ... Algunos de los enlaces parecen indicar que "la única solución para que la aplicación sea aprobada es copiar el archivo en la carpeta de caché. Si solo configura" no haga una copia de seguridad del "atributo" y deje los archivos en la carpeta de documentos; la aplicación será rechazada de todos modos. No puedo copiar archivos en la carpeta de caché, esta carpeta se puede borrar en una situación de poca memoria y mis archivos son fundamentales para mi aplicación, hay un archivo db que se actualizará con el contenido de la aplicación, no puedo decirles a los usuarios que a veces tienen que volver a descargar el paquete integrado en la aplicación. – Cri1682

+0

¿Por qué desea descomprimir archivos en el directorio de documentos del paquete? ¿Puedes guardarlos en el paquete? ¿Alguna razón específica para eso? –

Respuesta

3

He pasado todos los archivos que se almacenarán en la carpeta de documentos a través de este método.

probar este

-(BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL 
{ 

const char* filePath = [[URL path] fileSystemRepresentation]; 
const char* attrName = "com.apple.MobileBackup"; 
if (&NSURLIsExcludedFromBackupKey == nil) { 
    // iOS 5.0.1 and lower 
    u_int8_t attrValue = 1; 
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); 
    return result == 0; 

} 
else { 
    // First try and remove the extended attribute if it is present 
    int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0); 
    if (result != -1) { 
     // The attribute exists, we need to remove it 
     int removeResult = removexattr(filePath, attrName, 0); 
     if (removeResult == 0) { 
      NSLog(@"Removed extended attribute on file %@", URL); 
     } 
    } 

    // Set the new key 
    NSError *error = nil; 
    [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error]; 
    return error == nil; 
} 
} 

He encontrado este método aquí en desbordamiento de pila:

+0

Por favor me pueden dar la muestra de NSURL. Pasé la subcarpeta PRUEBA del directorio del documento. pero mi aplicación es rechazada Así que por favor sugiera thx –

+1

NSArray * documentPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); \t NSString * documentsDir = [documentPaths objectAtIndex: 0]; \t NSString * imgPath = [documentsDir stringByAppendingPathComponent: @ "img.jpg"]; [self addSkipBackupAttributeToItemAtURL: [NSURL fileURLWithPath: imgPath]]; No sé si realmente entiendo la pregunta, pero este es un ejemplo de la nsurl que he pasado a través del método de la respuesta ... es una simple respuesta que apunta a un archivo en el directorio de documentos. – Cri1682

+1

Ok. Pero quiero aplicarlo en toda la carpeta que? ¿funcionará? –

1

En mi aplicación lo resolví agregando los archivos (imágenes en mi caso) al paquete, y comprobé en el método donde cargo las imágenes si existen en la carpeta del documento donde el usuario generó los datos/imágenes Colocarse.

Si no está allí, sé que es una de mis imágenes prepobladas y la cargo desde el paquete.

Para el archivo sqlite: No es una solución realmente satisfactoria, pero creo los datos en código ahora, en lugar de un archivo sqlite rellenado previamente.

+0

gracias, también tengo algunas imágenes para copiar en la carpeta de documentos y tal vez su solución es buena, pero mi primer problema fue el DB, no puedo crear los datos en el código – Cri1682

+0

¿Por qué está copiando las imágenes en lugar de usarlas directamente del paquete? – hypercrypt

1

para archivos multimedia, que los almacena en la caché/directorio. Durante el inicio de la aplicación, verificamos si están allí. De lo contrario, las imágenes se cargan desde el paquete (en su caso descomprimido) o en nuestro caso se vuelven a descargar del Servidor.

La ubicación exacta es

NSString *mediaDir = [NSString stringWithFormat:@"%@/Library/Caches/%@", NSHomeDirectory(), MEDIA_DIRECTORY]; 

que es el lugar donde se debe almacenar sus archivos temporales. Los archivos en la memoria caché generalmente son persistentes, mucho más que en Temp, pero se pueden eliminar en algún momento.

3

NOTA: no utilizan

NSString *mediaDir = [NSString stringWithFormat:@"%@/Library/Caches/%@", NSHomeDirectory(), MEDIA_DIRECTORY]; 

ya que usted está haciendo suposiciones sobre el nombre. lugar, utilice:

NSArray* lCachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString* lCacheDirectory = [lCachePaths objectAtIndex:0]; 
Cuestiones relacionadas