2012-09-05 14 views
14

Apple acaba de rechazar una aplicación PhoneGap que envié. Utilizo HTML5 localStorage en la aplicación para guardar los datos descargados con fines de almacenamiento en caché: 2.23 Las aplicaciones deben seguir las Pautas de almacenamiento de datos de iOS o serán rechazadas.iOS PhoneGap aplicación rechazada por el uso de localStorage

Estoy muy confundido porque, en todo caso, pensé que localStorage en 5.1 en realidad guarda los datos en caché y NO en un lugar que tiene una copia de seguridad con iCloud [source]. Este es el comportamiento que quiero: no necesito ni quiero que se hagan copias de seguridad de los datos.

¿Me equivoco o es Apple? ¿Qué puedo hacer en una aplicación PhoneGap para guardar estos datos en caché sin violarlos?

Editar: PhoneGap 1.8.1 si eso ayuda.

+2

Yo sugeriría que utilice Xcode para descargar una instantánea de caja de arena de su aplicación para tomar un vistazo a qué archivos y directorios se están creando. Tal vez PhoneGap está haciendo algo funky. También puede simplemente buscar en el directorio del simulador de la aplicación. –

+0

Y asegúrese de mostrar los archivos ocultos porque muchos de los directorios de detalles de caché/implementación están ocultos (por ejemplo, almacenamiento de recursos externos de Core Data). –

+0

Si miro en el directorio del simulador, muestra un archivo__0.localstorage en el directorio "Caches" (Aplicaciones/aplicación/Biblioteca/Cachés). Entonces eso reafirma mi pensamiento de que se guarda en el lugar "correcto". –

Respuesta

11

Resulta que yo tenía razón y Apple estaba equivocado. Confirmé que estaba almacenando todo en el directorio/Caches correctamente. No comentaron sobre mi pregunta, solo aprobó mi aplicación.

+0

mismo rechazo. Iphone también rechaza mi aplicación. que puedo hacer ??? – chhameed

+1

Si solo está utilizando localStorage, debe señalarlo al revisor (¡y/o enviarlo a este hilo!) –

2

Hay dos cosas que yo sepa:

1) Los archivos que se generan por la aplicación (y no el resultado de que el usuario usando su aplicación) tales como archivos de texto temporal para almacenar el valor de una variable, entonces estos archivos deben colocarse en la Biblioteca/Caché en lugar del directorio del Documento.

2) También debe marcar un archivo con un atributo "skip-backup" para indicar a iCloud que no haga una copia de seguridad del archivo.

creo que es posible que se echa en falta el paso 2.

escribí una clase MediaDirectory simple que me da rápidamente la ruta de acceso a los archivos de la carpeta Library/caché y también añadir el atributo de copia de seguridad de salto.

Después guardó el archivo en la carpeta Libary/caché, sólo tiene que ser algo como esto:

[MediaDirectory addSkipBackupAttributeForFile:@"myTextFile.txt"]; 

Aquí está la clase en su totalidad:

// Header File 

// ---------------------------------------------------------------------- 
// This class takes a file name (including extension) and returns 
// the path to that file in the Library/Cache folder 
// ---------------------------------------------------------------------- 

#import <Foundation/Foundation.h> 

@interface MediaDirectory : NSObject 

+(NSString *) mediaPathForFileName:(NSString *) fileName; 
+(NSString *) mediaPathForFileName:(NSString *) fileName inSubDirectory:(NSString *) subDirectory; 
+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName; 
+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName inSubDirectory:(NSString *) subDirectory; 

@end 


// Implementation File 

#import "MediaDirectory.h" 
#include <sys/xattr.h> 

@implementation MediaDirectory 

+(NSString *) mediaPathForFileName:(NSString *) fileName 
{ 
    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cachesDirectory = [directoryPaths objectAtIndex:0]; 
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", cachesDirectory, fileName]; 

    return filePath; 
} 

// if an image needs to be stored in a sub folder called "images" 
+(NSString *) mediaPathForFileName:(NSString *) fileName inSubDirectory:(NSString *) subDirectory 
{ 
    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cachesDirectory = [directoryPaths objectAtIndex:0]; 
    NSString *filePath = [NSString stringWithFormat:@"%@/%@/%@", cachesDirectory, subDirectory, fileName]; 

    return filePath; 
} 

//+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL 
+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName 
{ 
    const char* filePath = [[self mediaPathForFileName:fileName] 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; 
} 

+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName inSubDirectory:(NSString *) subDirectory 
{ 
    const char* filePath = [[self mediaPathForFileName:fileName inSubDirectory:subDirectory] 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; 
} 

@end 
1

Una aplicación de facsímil que acabo de enviar ha sido rechazada por Apple por las mismas razones, y solo estoy usando localstorage.

he vuelto a presentar con el siguiente conjunto de preferencias en mi config.xml

<preference name="BackupWebStorage" value="none" /> 

entiendo que esto resolverá el problema

Cuestiones relacionadas