Enregistrement de données au bon endroit

CoharsCohars Membre
01:43 modifié dans Apple Developer Programs #1
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 :
#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 !

Réponses

  • AliGatorAliGator Membre, Modérateur
    01:43 modifié #2
    Oui les deux problèmes sont liés.
    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)
  • CoharsCohars Membre
    01:43 modifié #3
    Je vais essayé (dès que j'aurai fini de me débattre avec xCOde 4 qui veut m'installer plein de Library apparement).
    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 !
  • Eric P.Eric P. Membre
    01:43 modifié #4
    Oui les NSUserDefaults sont très pratiques pour cela et très simples à  utiliser.
Connectez-vous ou Inscrivez-vous pour répondre.