50 votes

iOS 5 ne permet pas de stocker les données téléchargées dans le répertoire Documents?

J'ai fait une demande pour mon client en gardant la cible iOS 4.
Mais puisque la demande n'est toujours pas soumis à l'Apple store, mon client est la planification à la mise à niveau de la version 5.0 d'iOS.

Pour cela, j'ai lu la ligne directrice de la Pomme et a constaté que "Seuls les données générées par l'utilisateur ou qui ne peuvent pas être recréés par votre application, doivent être stockés dans le répertoire Documents et de repos doivent être stockés dans /Bibliothèque/Caches répertoire"

Dans mon application, je suis de serveur à l'aide du modèle de l'achat in-app pour les non-produit consommable. Pour cela, je suis de stocker toutes mes données téléchargées (qui sont essentiellement des livres ou des magazines) répertoire Documents. La Base de données est également présent dans le même répertoire qui contient les détails sur les produits téléchargés.

Ma question est,
1. Dois-je changer mon code pour stocker les données téléchargées à la Bibliothèque/Caches répertoire au lieu de dans le répertoire Documents?
2. D'où mon fichier de base de données placé (à des Documents ou des Caches)?

Si je l'avais mis des produits dans les Caches puis-je changer la logique de récupération aussi, car il est considéré que si l'enregistrement est présent dans la base de données, il n'est pas nécessaire de changer l'existence du fichier et directement s'ouvre lorsque l'utilisateur clique sur le magazine.

De bien vouloir me guider sur cette question.
Merci à l'avance.

Mise à JOUR:
Je mets à jour ce pour ceux qui sont toujours pas sûr de ce problème.
À l'aide de la directive accepté de répondre, j'ai mis en œuvre cette dans 2 de mes applications et les a soumises à l'Apple Store. Les deux ont été approuvés en examen.
Cela peut favoriser que la solution proposée dans l'acceptation réponse est correcte.

58voto

Stephen Darlington Points 33587

Voici le compromis:

  • Si vous placez vos fichiers dans le répertoire Documents alors qu'ils sont sauvegardées sur iTunes ou iCloud, mais si elles sont trop grandes et il est possible de télécharger à nouveau les fichiers Apple peut rejeter votre application
  • Si vous placez vos fichiers dans le répertoire de Cache, puis ils ne seront pas sauvegardées et Apple de ne pas rejeter votre application. Cependant, lors de l'iOS 5 est faible sur l'espace, il peut supprimer tous les fichiers là.

Cependant, avec iOS 5.0.1 il existe une troisième option:

  • Mettre des fichiers dans les Documents, mais le drapeau de sorte qu'ils ne sont pas sauvegardés. Il y a une note technique (QA1719) sur la façon de le faire.

Je pense que c'est probablement la meilleure réponse pour vous.

7voto

Himanshu A Jadav Points 1741

1. Devrais-je modifier mon code pour stocker les données téléchargées dans le répertoire Library / Caches plutôt que dans le répertoire Documents? = Oui, vous devez stocker les données téléchargées dans le répertoire Library / Caches.

2. Où placer mon fichier de base de données (dans Documents ou Caches)? = Vous pouvez conserver la base de données dans le répertoire Documents.

6voto

mridkash Points 2468

Une application que je connais était une fois rejetée à cause de cela. Le stockage de données téléchargeables dans les Documents dir n'est pas recommandé. La logique derrière cela est que vos données ne doit pas gonfler inutilement le répertoire app. Ce répertoire app sont sauvegardées dans iCloud, afin gonflé répertoire app de causer plus de données à enregistrer dans iCloud.

Si les données peuvent être téléchargées à nouveau, comme des magazines, des livres, pdf, etc. Puis le garder dans les Caches répertoire. Bien sûr, vous pouvez stocker des pointeurs vers les données (comme les Url, etc) dans le répertoire Documents afin que l'utilisateur puisse les retrouver plus tard.

Pour répondre à vos questions:

  1. Oui, modifiez votre code pour charger DB à partir de Documents et de Données à partir de Caches.
  2. Maintenir la base de données dans les Documents

Vous devez ajouter du code pour vérifier si un document en DB existe dans les Caches, si ce n'est pas votre application doit le télécharger à nouveau.

4voto

UPT Points 1309

Sur le dessus de la suggestion que vous devez garder les données dans le répertoire de cache, il y a une préoccupation que vous devez garder à l'esprit lors de conserver les données dans le cache de dossier:

Chaque fois que iOS sent la mémoire crunch il permet de supprimer tout le cache et le dossier temp. Problème qui est décrit ici en détail Pour protéger ce répertoire ne pas supprimer et de tout garder pour la vie, vous devez utiliser l'attribut qui va garder le répertoire mentionné coffre-fort. La Solution est ici:

3voto

Kamarshad Points 4454

J'ai été à la recherche pour la même requête et j'ai la solution . En fonction de la pomme de stockage de données de la documentation dev peut stockées les données en cache, même l'utilisateur veut persister des données en situation d'insuffisance de mémoire.develper juste besoin de mettre en Do not back up drapeau.

Use the "do not back up" attribute for specifying files that should remain on device, 
even in low storage situations. Use this attribute with data that can be recreated but
needs to persist even in low storage situations for proper functioning of your app or 
because customers expect it to be available during offline use. 

This attribute works on marked files regardless of what directory they are in, including      the Documents directory. 
These files will not be purged and will not be included in the user's iCloud 
or iTunes backup. Because these files do use on-device storage space, your app is 
responsible for monitoring and purging these files periodically.

Pour plus d'Informations, allez sur ce lien

Utilisation ci-Dessous Morceau de code pour le réglage de la do not back up Drapeau.

import <sys/xattr.h>

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
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;
}

}

URL is the path of Data.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X