Enregistrement de données au bon endroit
Cohars
Membre
Bonjour,
Aujourd'hui, j'ai acheté ma licence de développeur. Je teneais juste a vous le dire en introduction. Tout marche a merveille sur mon iPhone, sauf, l'enregistrement des scores, qui marche sur le simulateur.
J'ai ça au début de mon header :
Cette fonction de le .m (avec son prototype dans le .h) :
Et j'enregistre le score comme ça :
Ce qui marche dans le simulateur, à une chose prêt, il n'enregistre pas le fichier .plist dans le dossier "Documents" comme je voudrais mais dans le fichier de l'application (à côté du dossier documents en fait qui, lui, reste vide).
Quelque chose me dit que les deux problèmes sont liés...
Merci !
Aujourd'hui, j'ai acheté ma licence de développeur. Je teneais juste a vous le dire en introduction. Tout marche a merveille sur mon iPhone, sauf, l'enregistrement des scores, qui marche sur le simulateur.
J'ai ça au début de mon header :
#define FichierScoresDatas @"player_scores.plist"
Cette fonction de le .m (avec son prototype dans le .h) :
- (NSString *) playerScoresAccess<br />{ <br /> NSArray *chemins = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br /> NSString *dossierDocuments = [chemins objectAtIndex:0];<br /> return [dossierDocuments stringByAppendingFormat:FichierScoresDatas];<br />}<br />
Et j'enregistre le score comme ça :
NSNumber *finalScore = [[NSNumber alloc] initWithInt:score];<br /><br /> NSMutableArray *playerScores = [[NSMutableArray alloc] initWithContentsOfFile:[self playerScoresAccess]];<br /> <br /> <br /> if (playerScores == nil){<br /> playerScores = [NSArray arrayWithObject:finalScore];<br /> }<br /> <br /> else {<br /> [playerScores replaceObjectAtIndex:0 withObject:finalScore];<br /> }<br /> <br /> [playerScores writeToFile:[self playerScoresAccess] atomically:YES];
Ce qui marche dans le simulateur, à une chose prêt, il n'enregistre pas le fichier .plist dans le dossier "Documents" comme je voudrais mais dans le fichier de l'application (à côté du dossier documents en fait qui, lui, reste vide).
Quelque chose me dit que les deux problèmes sont liés...
Merci !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu lui files un chemin qui lui demande d'écrire à côté de l'application.
Or écrire dans autre chose que la sandbox (le dossier Documents) de ton application, ça tu n'as pas le droit sur iPhone.
Sur le simulateur il écrit quand même le fichier parce que bon le simulateur il est laxiste et il n'implémente pas toutes les protections de sécurité et de sandboxing que le vrai iPhone met en place, mais en vrai il devrait te refuser le droit en écriture à ce chemin là depuis ton appli iPhone.
Sur ton iPhone du coup par contre l'écriture du fichier en dehors du dossier Documents va échouer et t'être refusée, car le vrai iPhone lui respecte les règles de sandboxing.
Du coup sur l'iPhone, le fichier n'étant pas écrit puisque tu essayes de l'écrire dans le dossier de l'application et non dans le dossier Documents, c'est logique que tu n'enregistres pas tes scores.
Reste à savoir pourquoi ton chemin playerScoresAccess pointe dans le dossier de l'application et non dans le dossier Documents comme tu voudrais. En regardant vite fait ton code je regarderai du côté de stringByAppendingFormat que tu utilises à tort. Non seulement ça n'est pas la bonne méthode pour ajouter un élément de chemin d'accès à une NSString représentant un chemin, tu dois plutôt utiliser les méthodes dédiées type stringByAppendingPathComponent, mais en plus tu ne passes même pas une chaà®ne de formattage, fixe, à stringByAppendingFormat, tu ne passes mm pas un format d'ailleurs...
Enfin, dernière info, plutôt que d'enregistrer des choses comme tes scores dans un fichier dans la sandbox, ça serait bien plus simple de les enregistrer dans les NSUserDefaults, non ? Si ce ne sont que des Plist-objects NSUserDefaults est tout adapté et fait pour ce genre d'infos à mémoriser (du moment que tes scores font pas plusieurs Mo ou que tu ne souhaites pas écrire un fichier dans la sandbox dans le but de pouvoir y accéder sur ton ordi via iTunes ensuite qd tu branches l'iPhone)
Sinon la deuxième solution a l'air interessante. Bien sur je ne sais pas comment faire, mais a priori je devrai pouvoir trouver.
Merci !