Search code examples
objective-cnskeyedarchiverios12

iOS 12.0 Alternative to Using Deprecated archiveRootObject:toFile:


With iOS 12, archiveRootObject:toFile: has been deprecated. Can anyone suggest a streamlined alternative to archiving objects to a file?

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

Solution

  • Thanks to @vadian for the hint, here's what I've come up with to do archiving and unarchiving under 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];