iOS 12.0 Альтернатива использованию устаревшего архива RootObject: toFile: - PullRequest
0 голосов
/ 02 декабря 2018

В iOS 12 archiveRootObject: toFile: устарел.Кто-нибудь может предложить упрощенную альтернативу архивации объектов в файл?

//Generic example of archiver prior to iOS 12.0    
-(BOOL) archive:(id)archiveObject withFileName:(NSString*)filename
{
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    return [NSKeyedArchiver archiveRootObject:archiveObject toFile:path];
}

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Спасибо @vadian за подсказку, вот что я придумал, чтобы сделать архивирование и разархивирование под iOS 12:

NSError *error = nil;

NSString *docsDir;
NSArray *dirPaths;

//Get the device's data directory:
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSString *databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"appData.data"]];

//Archive using iOS 12 compliant coding:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@"foo" requiringSecureCoding:NO error:&error];
[data writeToFile:databasePath options:NSDataWritingAtomic error:&error];
NSLog(@"Write returned error: %@", [error localizedDescription]);

//Unarchive the data:
NSData *newData = [NSData dataWithContentsOfFile:databasePath];
NSString *fooString = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSString class] fromData:newData error:&error];
0 голосов
/ 16 июля 2019

unArchivedObjectOfClass выдал ошибку для меня при попытке декодировать объект, который не использовал безопасное кодирование.После долгих проб и ошибок это то, что в итоге сработало без предупреждения об устаревании iOS 12/13:

// Archive the object
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:theObject requiringSecureCoding:NO error:nil];

// Unarchive the object
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:nil];
unarchiver.requiresSecureCoding = NO;
id theCopy = [unarchiver decodeTopLevelObjectForKey:NSKeyedArchiveRootObjectKey error:nil];
0 голосов
/ 02 декабря 2018

Замена archivedDataWithRootObject: требуетсяSecureCoding: ошибка:

+ (NSData *)archivedDataWithRootObject:(id)object 
             requiringSecureCoding:(BOOL)requiresSecureCoding 
                             error:(NSError * _Nullable *)error;

плюс дополнительный шаг для записи данных на диск.

Пожалуйста, см. FoundationОтличия API от iOS 11.4 до 12.0

...