iOS 12.0 Alternative to Using Deprecated archiveRootObject:toFile:

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:@""]];

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

As suggested by Apple, we should use FileManager for read/write the archived file.

guard let documentURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first else { return }

let filePath = ""
let fileURL = documentURL.appendingPathComponent(filePath)

// Archive
if let dataToBeArchived = try? NSKeyedArchiver.archivedData(withRootObject: myObject, requiringSecureCoding: true) {
    try? dataToBeArchived.write(to: fileURL)

// Unarchive
if let archivedData = try? Data(contentsOf: fileURL),
        let myObject = (try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archivedData)) as? Object {
    /// Do anything with the unarchived object

The replacement is archivedDataWithRootObject:requiringSecureCoding:error:

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

plus an extra step to write the data to disk.

Please see Foundation iOS 11.4 to 12.0 API Differences