Question

Je suis en train de faire quelque chose de relativement simple.J'ai un .plist dans mon baluchon et je suis en train de l'enregistrer dans le répertoire documents avec le cryptage.Maintenant, avant j'ai essayé ajouté le cryptage, il a bien fonctionné.Toutefois, un nouveau crash a surgi.

C'est de cette façon-je enregistrer mes .plist:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Hi.plist"];
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath: path]) {
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"GameSave" ofType:@"plist"];
    NSData *plistData = [NSData dataWithContentsOfFile:bundle];
    [NSKeyedArchiver archiveRootObject:plistData toFile:path];
    plistData = [plistData AES256EncryptWithKey:@"536335"];
    [plistData writeToFile:path atomically:YES];
}

Alors voilà comment j'ai récupérer mon .plist (et plus tard de modifier une valeur, et re-save)

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Hi.plist"];

        //Get array and then current level dict
        NSData *plistData = [[NSData alloc] initWithContentsOfFile:path];
        plistData = [plistData AES256DecryptWithKey:@"1111"];

        NSMutableArray *savegameArray = [[NSKeyedUnarchiver unarchiveObjectWithData:plistData] mutableCopy];
        int objectIndex = [Singleton sharedInstance].levelNumber - 1;
        NSMutableDictionary *levelDict = [[savegameArray objectAtIndex:objectIndex] mutableCopy];
        [levelDict setObject:videoID forKey:@"RecordingURL"];
        //Now put new dict back in array
        [savegameArray replaceObjectAtIndex:objectIndex withObject:levelDict];

        NSData *savedarrayData = [NSKeyedArchiver archivedDataWithRootObject:savegameArray];
        savedarrayData = [savedarrayData AES256EncryptWithKey:@"1111"];
        [savedarrayData writeToFile:path atomically:YES];

Cependant, à la lecture du code à chaque fois que j'en arrive à cette ligne: NSMutableArray *savegameArray = [[NSKeyedUnarchiver unarchiveObjectWithData:plistData] mutableCopy]; Il y a un SIGABRT crash qui s'imprime:

'-[__NSCFArray objectForKey:]:non reconnu sélecteur envoyé à l'instance 0x16604140'

Ce que je fais mal?

Était-ce utile?

La solution

Comme nous l'avons découvert par le biais de notre chat, nous avons dû d'abord convertir le déchiffré NSData l'objet d'un bon NSPropertyListSerialization la sérialisation.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Hi.plist"];

NSData *plistData = [[NSData alloc] initWithContentsOfFile:path];
NSData *newData = [plistData AES256DecryptWithKey:@"1111"];

NSPropertyListFormat format;

NSMutableArray *savegameArray = [[NSPropertyListSerialization propertyListFromData:newData mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:nil]mutableCopy];

NSLog(@"Array: %@",savegameArray);

Autres conseils

Vous avez juste besoin d'allouer de la mémoire à votre nsmutableArray comme ... NsmutableArray * ArrayName= [[NsmutableArraRay Alloc] init]; Jusqu'à ce que vous fassiez ce crash ..

J'espère que c'est utile.

merci, Rajesh ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top