2012-04-18 11 views
5

La mia app è stata rifiutata perché deve seguire le linee guida per lo storage dei dati iOS. Ho già letto alcune risposte su StackOverflow, e ho già letto alcuni blog ... Conosco il mio problema, al primo avvio dell'applicazione copio 1 sqlite db e decomprimo alcune immagini nella cartella documenti. Il problema è che è possibile eseguire automaticamente il backup di tutti i file nella directory dei documenti. Non ho bisogno di usare icloud nella mia app, ma i miei file devono rimanere nella cartella documenti perché sono i dati di base della mia applicazione e devono essere persi (la cartella cache o la cartella temp non sono soluzioni corrette). Quindi ho letto su un flag che posso impostare file per file per vietare il backup:Linee guida per la memorizzazione dei dati iOS Rifiuto

[URL setResourceValue: [NSNumero numeroWithBool: YES] forKey: NSURLIsExcludedFromBackupKey errore: nil];

Ho anche letto che questo metodo funziona solo in ios superiore a 5.0.1, nell'altro sarà semplicemente ignorato (ho impostato il mio obiettivo di distribuzione ios su 4.3) ... Se utilizzo questo metodo la mia app sarà respinto di nuovo perché i vecchi dispositivi di backup di iOS non sono gestiti? Se sì, esiste un metodo cross-iosversion per impostare NSURLIsExcludedFromBackupKey?

EDIT Mi dispiace icloud non è presente in iOS 5.0 precedenti, quindi penso che il problema riguardi solo le differenze tra la versione 5.0 e 5.0.1, mi sbaglio?

+0

controllare questo link http://stackoverflow.com/questions/8818117/application-rejected-because-of-not-following-ios-data-storage-guidelines Grazie !! – Kiran

+0

grazie ma ho già letto questa risposta, ho ancora dei dubbi ... Alcuni link sembrano dire "l'unica soluzione per avere l'app approvata è copiare il file nella cartella cache. Se si imposta solo" non eseguire il backup di "attributo" e lasciare i file nella cartella dei documenti, l'app verrà comunque respinta. Non riesco a copiare i file nella cartella cache, questa cartella può essere eliminata in situazioni di scarsa memoria e i miei file sono fondamentali per la mia applicazione, c'è un db che verrà aggiornato con i contenuti in-app, non posso dire agli utenti che a volte devono ri-scaricare il pacchetto in-app. – Cri1682

+0

Perché si desidera decomprimere i file nella directory dei documenti dal pacchetto? puoi tenere quelli in bundle da solo? qualche motivo specifico per quello? –

risposta

3

Ho passato tutti i file che verranno memorizzati nella cartella documenti attraverso questo metodo.

Prova questa

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

ho trovato questo metodo qui a Stack Overflow:

+0

Per favore, puoi fornirmi il campione di NSURL. Ho passato la sottocartella TEST della directory Document. ma la mia domanda è respinta. Quindi, per favore suggerisci grazie –

+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]]; Non so se capisco davvero la domanda ma questo è un esempio del nsurl che ho passato attraverso il metodo della risposta ... è un semplice nsurl che punta a un file nella directory dei documenti. – Cri1682

+1

Ok. Ma voglio applicarlo su tutta la cartella di? Funzionerà? –

1

Nella mia app l'ho risolto aggiungendo i file (immagini nel mio caso) al pacchetto, e controllo nel metodo in cui carico le immagini se esistono nella cartella documenti in cui l'utente ha generato i dati/le immagini essere collocato

Se non c'è, so che è una delle mie immagini pre-popolate e la carica dal pacchetto.

Per il file sqlite: Non è una soluzione veramente soddisfacente, ma ora creo i dati nel codice, invece di un file sqlite prepopolato.

+0

grazie, ho anche alcune immagini da copiare nella cartella documenti e forse la tua soluzione è buona ma il mio primo problema era il db, non posso creare i dati nel codice – Cri1682

+0

Perché copi le immagini invece di usarle direttamente dal bundle? – hypercrypt

1

per i file multimediali, abbiamo memorizzarli nella directory/cache. Durante l'avvio dell'applicazione, controlliamo se ci sono. Altrimenti le immagini vengono caricate dal bundle (nel tuo caso decompresso) o nel nostro caso scaricate nuovamente dal Server.

La posizione esatta è

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

che è il luogo dove si dovrebbe archiviare i file temporanei. I file nella cache sono generalmente persistenti, molto più che in Temp, ma possono essere cancellati ad un certo punto.

3

NOTA: non utilizzare

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

dal momento che si stanno facendo ipotesi circa il nome. piuttosto, utilizzare:

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