2013-04-26 8 views
18

Unsere App wurde kürzlich wegen Verstoßes gegen iOS Data Storage Guidelines zum Sichern von Dateien auf iCloud abgelehnt.iOS: Attribut nicht sichern?

Ich muss Daten mit dem Attribut do not back up markieren.

Ich speichere alle wichtigen Daten in SQLite-Datenbanken und meine Benutzereinstellungen in UserDefaults.plist. Muss ich meine database.sqlite Dateien als do no back up markieren?

Ich fragte den Prüfer, ob ich in meiner AppID iCloud deaktivieren würde es meine Situation helfen würde, und die Antwort war kryptisch und gab mir nicht wirklich eine Ja oder Nein-Antwort.

Nichts in meiner App muss wirklich gesichert werden, kann ich nur iCloud Unterstützung in meiner AppID deaktivieren und muss nicht über das Markieren von Dateien als do not back up ??

Hier ist die Antwort der Kritiker:

2,23

Wir fanden auch, dass Ihre App nicht die iOS Data Storage-Richtlinien nicht folgen, die nach den App Store Richtlinien für Bewertungen erforderlich ist.

Insbesondere haben wir festgestellt, dass Ihre App beim Starten und/oder Herunterladen von Inhalten 4 MB speichert. Um zu überprüfen, wie viele Daten die App speichert:

  • Installieren und starten Sie Ihre App
  • Gehen Sie zu Einstellungen> iCloud> Speicher & Backup> Speicher verwalten
  • Falls erforderlich, tippen Sie auf "Alle anzeigen apps"
  • Überprüfen Lagerung Ihrer App

die iOS Data Storage-Richtlinien zeigen, dass nur Inhalte, die der Nutzer mit Ihrer App erstellt, zB Dokumente, neue Dateien, Bearbeitungen usw. sollten durch ICLO gesichert werden ud.

Temporäre Dateien, die von Ihrer App verwendet werden, sollten nur im Verzeichnis/tmp gespeichert werden. Bitte denken Sie daran, die an diesem Ort gespeicherten Dateien zu löschen, wenn der Benutzer die App beendet.

Daten, die neu erstellt werden können, aber für die ordnungsgemäße Funktion Ihrer App bestehen müssen - oder weil Kunden erwarten, dass sie offline verfügbar sind - sollten mit dem Attribut "Do not back up" gekennzeichnet sein. Fügen Sie für NSURL-Objekte das NSURLIsExcludedFromBackupKey-Attribut hinzu, um zu verhindern, dass die entsprechende Datei gesichert wird. Verwenden Sie für CFURLRef-Objekte das entsprechende kCFURLIsExcludedFromBackupKey-Attribut.

Weitere Informationen finden Sie unter Technisch Q & A 1719: Wie verhindere ich, dass Dateien auf iCloud und iTunes gesichert werden ?.

Es ist notwendig, Ihre App zu überarbeiten, um die Anforderungen der iOS-Datenspeicherrichtlinien zu erfüllen. Für Fragen zu einzelnen Code-Ebenen wenden Sie sich an den technischen Support von Apple Developer.Bitte achten Sie darauf,:

  • umfassen die vollständigen Details Ihrer Ablehnung gibt
  • jede symbolicated Absturzprotokolle, Screenshots vorzubereiten und Schritte, um die Probleme zu reproduzieren, wenn der DTS-Ingenieur folgt auf.
+0

Könnten Sie die Antwort der Rezensent posten? –

+0

Ich glaube nicht, dass Sie "iCloud" einfach deaktivieren können. Sie müssen Ihre Daten in Sachen teilen, die der Benutzer erstellt/ändert, Sachen, die dynamisch heruntergeladen (und wieder heruntergeladen werden können), Dinge, die nur vorübergehend sind und nur geworfen werden können, und Dinge, die mit der App-Installation geliefert werden neu installiert werden). Nur die erste Kategorie sollte "Cloud-fähig" sein, –

+0

@Hot Licks: Im Abschnitt Zertifikate, Kennungen und Profile des Bereitstellungsportals unter App-IDs kann ich iCloud aktivieren oder deaktivieren. Ich würde gerne wissen, ob dies iCloud-Backups verhindern würde, so dass ich meine Dateien nicht aufteilen muss. Ich kann das auch nicht mit einem Entwicklungsprofil machen, daher gibt es keine Möglichkeit zu testen. – PaulG

Antwort

31

Grundsätzlich hängt es von der Art der Daten ab, die Sie speichern.

Wenn die Daten neu generiert werden können (z. B. wenn ein Benutzer die App auf einem anderen Gerät installiert), sollte es nicht gesichert werden.

Andernfalls ist die iCloud-Sicherung in Ordnung, da der Benutzer erwartet, dass seine Daten auch auf einem anderen Gerät verfügbar sind.

Im ersten Szenario haben Sie grundsätzlich zwei Möglichkeiten, dies zu erreichen, ...

Entweder Sie NSURL verwenden, um die kCFURLIsExcludedFromBackupKey auf Ihren Dateien zu setzen, entweder Sie speichern sie in einem Ort, der nicht Backed sein oben, wie <Application_Home>/Library/Caches. Beachten Sie, dass die zweite Lösung die bessere ist, IMHO.

NSURL * fileURL; 

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

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

Für das zweite Szenario, manchmal Apple-Rezensenten denken können Ihre Daten neu generiert werden, wenn es nicht:

Für Informationen, kCFURLIsExcludedFromBackupKey kann auf diese Weise verwendet werden. Dann müssen Sie erklären, warum die Daten gesichert werden müssen.

+0

Vielen Dank für die Antwort. Um iCloud 'vollständig' zu deaktivieren, würde ich einfach den Pfad zum Dokumentenverzeichnis festlegen. Ist das eine sichere Annahme? Ich habe auch gehört, dass dies nur für iOS 5.1 und höher funktioniert. Momentan unterstütze ich 5.0 und höher, gibt es einen Grund, warum ich den Cutoff nicht einfach auf 5.1 setzen und den obigen Code verwenden sollte? Danke noch einmal! – PaulG

+0

Das ist eine Option, aber ich denke, Sie sollten diese Art von Daten nicht im Ordner "Dokumente" speichern. Dies ist auch der einzige Weg, wenn Sie iOS <5.1 unterstützen müssen, da die Methode 'setResourceValue:' von NSURL erst seit iOS 5.0 verfügbar ist und 'kCFURLIsExcludedFromBackupKey' erst seit iOS 5.1 verfügbar ist. – Macmade

+0

Danke! Wenn ich dies tun muss, was ist dann der Zweck, iCloud in meiner App-ID zu aktivieren oder zu deaktivieren? Hat das keinen Zweck? – PaulG

3

Sie können die folgende Funktion aufrufen, den Pfad der „map.sqlite“ als NSURL weitergeben müssen:

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