문제

나는 비교적 간단한 일을하려고 노력하고 있습니다.내 번들에 .plist가 있고 이를 암호화하여 문서 디렉토리에 저장하려고 합니다.이제 추가 암호화를 시도하기 전에는 제대로 작동했습니다.그러나 새로운 충돌이 발생했습니다.

이것이 내 .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];
}

그런 다음 이것이 내 .plist를 검색하는 방법입니다(나중에 값을 변경하고 다시 저장합니다).

        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];

그러나 다음 줄에 도달할 때마다 읽기 코드에서 다음을 수행합니다. NSMutableArray *savegameArray = [[NSKeyedUnarchiver unarchiveObjectWithData:plistData] mutableCopy]; 다음을 인쇄하는 SIGABRT 충돌이 있습니다.

'-[__NSCFArray objectForKey:]:인스턴스로 전송 된 인식되지 않은 선택기 0x16604140 '

내가 도대체 ​​뭘 잘못하고있는 겁니까?

도움이 되었습니까?

해결책

채팅을 통해 발견한 것처럼 먼저 해독된 암호를 변환해야 했습니다. NSData 정당한 것에 반대하다 NSPropertyListSerialization 직렬화.

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);

다른 팁

NSMutableArray에 메모리를 할당해야합니다 ... nsmutableArray * ArrayName= [[NSMutableArray alloc] init]; 그 충돌이 발생할 때까지는

이것은 도움이되기를 바랍니다.

고마워, Rajesh ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top