2013-04-26 13 views
18

La nostra app è stata recentemente respinta per violazione del iOS Data Storage Guidelines sul backup dei file su iCloud.iOS: non eseguire il backup dell'attributo?

Devo contrassegnare i dati con l'attributo do not back up.

Sto memorizzando tutti i miei dati importanti nei database SQLite e le mie preferenze utente in UserDefaults.plist. Devo contrassegnare i file database.sqlite come do no back up?

Ho chiesto al revisore se dovessi disabilitare iCloud nel mio AppID per aiutare la mia situazione, e la risposta è stata criptica e in realtà non mi ha dato una risposta affermativa o negativa.

Non è necessario eseguire il backup di NESSUNA app della mia app, è possibile disattivare il supporto iCloud nel mio AppID e non doversi preoccupare di contrassegnare i file come do not back up ??

Ecco la risposta del recensore:

2,23

Abbiamo anche trovato che la vostra applicazione non segue le Istruzioni per la conservazione dei dati iOS, che è richiesto per la revisione Linee guida App Store.

In particolare, abbiamo rilevato che all'avvio e/o al download di contenuto, l'app memorizza 4 MB. Per controllare la quantità di dati la vostra applicazione è la memorizzazione:

  • Installare e avviare la vostra applicazione
  • Vai in Impostazioni> iCloud> bagagli & archiviazione dati> Gestisci archiviazione
  • Se necessario, toccare "Mostra tutte le applicazioni"
  • Controllare la memoria della app

le Istruzioni per la conservazione dei dati iOS indicare che solo il contenuto che l'utente crea utilizzando la vostra applicazione, ad esempio, i documenti, i nuovi file, modifica, ecc, dovrebbe essere sostenuta da ICLO ud.

I file temporanei utilizzati dall'app devono essere memorizzati solo nella directory/tmp; ricorda di cancellare i file memorizzati in questa posizione quando l'utente esce dall'app.

I dati che possono essere ricreati ma che devono essere mantenuti per il corretto funzionamento della tua app - o perché i clienti si aspettano che sia disponibile per l'uso offline - devono essere contrassegnati con l'attributo "non eseguire il backup". Per gli oggetti NSURL, aggiungi l'attributo NSURLIsExcludedFromBackupKey per impedire il backup del file corrispondente. Per gli oggetti CFURLRef, utilizzare l'attributo kCFURLIsExcludedFromBackupKey corrispondente.

Per ulteriori informazioni, consultare il Technical Q & A 1719: Come impedire il backup dei file su iCloud e iTunes ?.

È necessario rivedere l'app per soddisfare i requisiti delle linee guida per lo storage dei dati iOS. Per domande a livello di codice discrete, è possibile consultare l'Assistenza tecnica per gli sviluppatori Apple.Si prega di essere sicuri di:

  • includere i dettagli completi del vostro rifiuto emette
  • preparare i registri qualsiasi symbolicated di crash, schermate, e passi per riprodurre i problemi per quando l'ingegnere DTS fa seguito.
+0

Potrebbe inviare la risposta del viaggiatore? –

+0

Non penso che puoi semplicemente "disabilitare iCloud" più. Devi dividere i tuoi dati in cose che l'utente crea/modifica, cose che vengono scaricate dinamicamente (e che possono essere scaricate di nuovo), cose che sono temporanee e che possono essere semplicemente sballottate e cose che vengono fornite con l'installazione di app (e possono essere reinstallato). Solo la prima categoria deve essere "abilitata per il cloud", –

+0

@Hot Licks: nella sezione Certificati, Identificatori e profili del portale di provisioning sotto ID app, posso impostare iCloud su abilitato o disabilitato. Vorrei sapere se questo impedirebbe i backup di iCloud quindi non devo dividere i miei file. Inoltre, non posso farlo con un profilo di sviluppo, quindi non c'è modo di testare. – PaulG

risposta

31

Fondamentalmente, dipende dal tipo di dati che si stanno memorizzando.

Se i dati possono essere rigenerati (quando un utente installa l'applicazione su un altro dispositivo, ad esempio), non dovrebbe essere sottoposto a backup.

In caso contrario, il backup di iCloud è OK, in quanto l'utente si aspetta che i suoi dati siano disponibili, anche su un altro dispositivo.

Nel primo scenario, si dispone fondamentalmente due modi per raggiungere questo ...

O si usano NSURL per impostare il kCFURLIsExcludedFromBackupKey sui file, sia di metterle in una posizione che non sarà backed- come <Application_Home>/Library/Caches. Si noti che la seconda soluzione è la migliore, IMHO.

Per info, kCFURLIsExcludedFromBackupKey può essere utilizzato in questo modo:

NSURL * fileURL; 

fileURL = [ NSURL fileURLWithPath: @"some/file/path" ]; 

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

Per il secondo scenario, a volte revisori di Apple pensi che i tuoi dati potranno essere ri-generato, quando non lo è. Quindi dovrai spiegare perché è necessario eseguire il backup dei dati.

+0

Grazie mille per la risposta. Quindi per disabilitare iCloud 'completamente', vorrei semplicemente impostare il mio percorso nella directory dei documenti? È un'assunzione sicura? Inoltre ho sentito che questo funziona solo per iOS 5.1 e versioni successive. In questo momento supporto 5.0 e sopra, c'è qualche ragione per cui non dovrei semplicemente impostare il cutoff su 5.1 e usare il codice sopra? Grazie ancora! – PaulG

+0

Questa è un'opzione, ma penso che non dovresti memorizzare quel tipo di dati nella cartella "Documenti". Questo è anche l'unico modo se è necessario supportare iOS <5.1, poiché il metodo 'setResourceValue:' di NSURL è disponibile solo da iOS 5.0 e 'kCFURLIsExcludedFromBackupKey' è disponibile solo da iOS 5.1. – Macmade

+0

Grazie! Se devo fare questo, allora qual è il punto di essere in grado di abilitare o disabilitare iCloud nel mio ID App? Non ha uno scopo? – PaulG

3

è possibile chiamare la seguente funzione per passare il percorso del "map.sqlite" come NSURL:

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath]; 
[self addSkipBackupAttributeToItemAtURL:url]; 
The function is provided in Apple as: 

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

    NSError *error = nil; 
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] 
           forKey: NSURLIsExcludedFromBackupKey error: &error]; 
    if(!success){ 
     NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); 
    } 
    return success; 
} 
Problemi correlati