2012-06-26 16 views
5

Mi aplicación fue rechazada porque parece que 7 mb se almacenan en la carpeta de documentos y se envían automáticamente a icloud. Así que tengo en bucle todos los archivos que se escribirán en la carpeta de documentos throught este método:NSURLIsExcludedFromBackupKey - Las aplicaciones deben seguir las Pautas de almacenamiento de datos de iOS o serán rechazadas

- (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; 
    } 

La versión 1.1 de mi aplicación fue aprobada después de esta implementación del código. La semana pasada intenté enviar la versión 1.2 de la misma aplicación (nada ha cambiado en la administración de archivos, todos los archivos que están almacenados en la carpeta de documentos se enlazan mediante el método addSkipBackupAttributeToItemAtURL). Mi aplicación fue rechazada nuevamente por la misma razón. No puedo mover mi archivo a la carpeta temporal o caché porque mi aplicación no puede restaurar completamente el archivo (uno de este es un archivo db, restaurar db significa perder cualquier dato insertado por el usuario), por lo que esta no puede ser la solución . De todos modos, he encontrado un problema en el código, así es como llamo al método:

[self addSkipBackupAttributeToItemAtURL: [NSURL fileURLWithPath: fullPath]];

utilizando el dispositivo [NSURL fileURLWithPath: fullPath] con ios 5.1 devuelve un error y parece imposible crear el atributo. Si cambio la inicialización de nsurl con [NSURL URLWithString: defaultStorePath], el dispositivo con 5.1 parece agregar correctamente el atributo.

Con ios 5.0.1 todo está invertido, [NSURL URLWithString: defaultStorePath] devuelve un error mientras [NSURL fileURLWithPath: fullPath] funciona.

Tal vez pueda verificar la versión de ios y establecer una inicialización nsurl adecuada, pero sigue siendo un problema. En la explicación de rechazo leí:

En particular, encontramos que en el lanzamiento y/o descarga de contenido, su aplicación almacena 7mb. Para comprobar la cantidad de datos que su aplicación está almacenando:

  • instalar y poner en marcha su aplicación
  • Ir a Ajustes> iCloud> Almacenamiento & de copia de seguridad> Administrar almacenamiento
  • Si es necesario, pulse "Mostrar todas las aplicaciones"
  • Registro de almacenamiento de su aplicación

si trato de comprobar este valor veo 7 mb también con la inicialización NSURL correcto (cuando todos los atributos están configurados correctamente). ¿Cuál es el comportamiento correcto? ¿Alguien con este problema? ¿Tengo que hacer algo específico antes de la comprobación de almacenamiento de la aplicación sugerida por Apple para que sea significativo?

Respuesta

0

Tuve el mismo problema que tú hasta que eliminé mi aplicación de mi dispositivo y volví a instalarla. También tuve que eliminar los datos en caché existentes de la copia de seguridad de iCloud yendo a Configuración-> Almacenamiento & Copia de seguridad -> Administrar almacenamiento

Eso pareció hacer el truco. Además, mi código para añadir el atributo de salto es un poco diferente: Code lifted from this post

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL 
{ 
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); 

    if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1 
     const char* filePath = [[URL path] fileSystemRepresentation]; 

     const char* attrName = "com.apple.MobileBackup"; 
     u_int8_t attrValue = 1; 

     int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); 
     return result == 0; 
    } 
    else { // iOS >= 5.1 
     NSError *error = nil; 
     [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error]; 
     return error == nil; 
    } 


} 
2

Creo que el truco consiste en añadir el NSURLIsExcludedFromBackupKey Y asegúrese de que el directorio está fuera del directorio de documentos. Lo hice moviendo mis documentos a la carpeta Library/Application Support (ya que no tenía sentido en las carpetas/tmp o/Caches):

// store in /Library/Application Support/BUNDLE_IDENTIFIER/Reference 
// make sure Application Support folder exists 
NSURL *applicationSupportDirectory = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory 
                      inDomain:NSUserDomainMask 
                    appropriateForURL:nil 
                       create:YES 
                       error:&error]; 
if (error) { 
    NSLog(@"KCDM: Could not create application support directory. %@", error); 
    return nil; 
} 

NSURL *referenceFolder = [applicationSupportDirectory URLByAppendingPathComponent:@"Reference" isDirectory:YES]; 
if (![[NSFileManager defaultManager] createDirectoryAtPath:[referenceFolder path] 
           withIntermediateDirectories:YES 
               attributes:nil 
                error:&error]) { 
    NSLog(@"KCDM: Error creating Reference folder to store model %@: %@", modelName, error); 
    return nil; 
} 

BOOL success = [referenceFolder setResourceValue:@YES forKey: NSURLIsExcludedFromBackupKey error: &error]; 
if(!success){ 
    NSLog(@"KCDM: Error excluding %@ from backup %@", referenceFolder, error); 
} 
Cuestiones relacionadas