web-dev-qa-db-fra.com

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 iOS cible comme 4.
Mais puisque l'application n'est toujours pas soumise à Apple store, mon client prévoit de la mettre à niveau pour iOS 5.0.

Pour cela, j'ai lu le directive d'Apple et j'ai constaté que "seules les données générées par l'utilisateur ou qui ne peuvent pas être recréées par votre application, doivent être stockées dans le répertoire/Documents et le reste doit être stocké dans/Library/Répertoire des caches "

Dans mon application, j'utilise un modèle de serveur d'achat intégré pour un produit non consommable. Pour cela, je stocke toutes mes données téléchargées (qui sont essentiellement des livres ou des magazines) dans le répertoire Documents. La base de données est également présente 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 dans le répertoire Library/Caches au lieu du répertoire Documents?
2. Où mon fichier de base de données doit-il être placé (dans Documents ou Caches)?

Si je le mets dans les caches, je dois également changer la logique de récupération, 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 modifier l'existence du fichier et il l'ouvre directement lorsque l'utilisateur clique sur le magazine.

Veuillez me guider sur cette question.
Merci d'avance.

MISE À JOUR:
Je mets à jour ceci pour ceux qui ne sont toujours pas sûrs de ce problème.
En utilisant la ligne directrice de la réponse acceptée, j'ai mis cela en œuvre dans 2 de mes demandes et les ai soumises à Apple Store. Les deux ont été approuvées en révision.
Cela peut favoriser que la solution suggérée dans la réponse acceptée est correcte.

50
Naved

Voici les compromis:

  • Si vous placez vos fichiers dans le répertoire Documents, ils sont sauvegardés sur iTunes ou iCloud, mais s'ils sont trop gros et qu'il est possible de télécharger à nouveau les fichiers, alors Apple peut rejeter votre application
  • Si vous placez vos fichiers dans le répertoire Cache, ils ne seront pas sauvegardés et Apple ne rejettera pas Cependant, lorsque iOS 5 manque d'espace, il peut supprimer tous les fichiers qu'il contient.

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

  • Mettez les fichiers dans Documents mais marquez-les afin qu'ils ne soient pas sauvegardés. Il y a une note technique ( QA1719 ) sur la façon de procéder.

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

58
Stephen Darlington

1. Dois-je changer mon code pour stocker les données téléchargées dans le répertoire Library/Caches au lieu du 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.

7
Himanshu A Jadav

Une application que je connais a déjà été rejetée à cause de cela. Le stockage de données téléchargeables dans le répertoire Documents n'est pas recommandé. La logique derrière cela est que vos données ne devraient pas gonfler inutilement le répertoire de l'application. Ce répertoire d'application est sauvegardé dans iCloud, donc le répertoire d'application gonflé entraînera la sauvegarde de plus de données dans iCloud.

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

Pour répondre à tes questions:

  1. Oui, modifiez votre code pour charger la base de données à partir de documents et de données à partir de caches.
  2. Conserver la base de données dans les documents

Vous devrez ajouter du code pour vérifier si un document dans la base de données existe dans les caches, si ce n'est pas le cas, votre application devrait le télécharger à nouveau.

6
Mridul Kashatria

En plus de la suggestion que vous devez conserver les données dans le répertoire de cache, vous devez garder à l'esprit lorsque vous conservez les données dans le dossier de cache:

Chaque fois que iOS ressent le resserrement de la mémoire, il supprime tout le cache et le dossier temporaire. Le problème est décrit ici en détail Pour protéger ces répertoires de ne pas supprimer et garder tout pour la vie, vous devez utiliser l'attribut qui gardera le répertoire mentionné en toute sécurité. La solution est ici:

4
UPT

Je cherchais la même requête et j'ai la solution. Selon le Apple documentation de stockage de données, le développeur peut stocker les données dans le cache même si l'utilisateur souhaite conserver ces données dans une situation de faible mémoire. Le développeur doit simplement définir 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, passez par ce lien

Utilisez ci-dessous morceau de code pour définir le 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.

3
Kamar Shad

J'ai fait une demande pour mon client en gardant iOS cible à 4. Mais comme l'application n'est toujours pas soumise à Apple store, mon client prévoit de la mettre à niveau pour iOS 5.0

Une autre option (si vous ne supportez que iOS 5) consiste à utiliser NewsstandKit. De cette façon, seuls les numéros sélectionnés du magazine seront supprimés par iOS lorsque l'espace sur le "disque" est faible. Ma compréhension est que iOS supprimera les problèmes sélectionnés en fonction de la dernière lecture et peut-être de la taille.

Si vous n'utilisez pas le kiosque à journaux et que votre application est ciblée, tous les problèmes seront supprimés.

2
Martin Lockett