Avec iOS 12, archiveRootObject: toFile: est obsolète. Quelqu'un peut-il suggérer une alternative rationalisée à l'archivage d'objets dans un fichier?
//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];
}
Merci à @vadian pour l'astuce, voici ce que j'ai trouvé pour faire l'archivage et le désarchivage sous 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];
Comme suggéré par Apple , nous devons utiliser FileManager pour lire/écrire le fichier archivé.
guard let documentURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first else { return }
let filePath = "MyArchive.data"
let fileURL = documentURL.appendingPathComponent(filePath)
// Archive
if let archivedData = try? NSKeyedArchiver.archivedData(withRootObject: myObject, requiringSecureCoding: true) {
try? archivedData.write(to: fileURL)
}
// Unarchive
if let archivedData = try? Data(contentsOf: fileURL),
let myObject = (try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archivedData)) as? Object {
///
///
///
}
Le remplacement est archivedDataWithRootObject: requireSecureCoding: error:
+ (NSData *)archivedDataWithRootObject:(id)object
requiringSecureCoding:(BOOL)requiresSecureCoding
error:(NSError * _Nullable *)error;
plus une étape supplémentaire pour écrire les données sur le disque.
S'il vous plaît voir Foundation iOS 11.4 à 12.0 différences d'API
unArchivedObjectOfClass m'a lancé une erreur en essayant de décoder un objet qui n'utilisait pas d'encodage sécurisé. Après beaucoup d'essais et d'erreurs, c'est ce qui a finalement fonctionné sans déclencher un avertissement de dépréciation 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];