سؤال

أحاول أن أفعل شيئًا بسيطًا نسبيًا.لدي ملف .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] init];وإلى أن تفعل ذلك سوف ينشأ الانهيار..

نأمل أن يكون هذا مفيدا.

شكرا راجيش ..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top