diff --git a/Lockbox.h b/Lockbox.h index 3c8c5b8..f510a31 100644 --- a/Lockbox.h +++ b/Lockbox.h @@ -28,7 +28,9 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key; -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; --(id)unarchiveObjectForKey:(NSString *)key; +-(id)unarchiveObjectForKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to -unarchiveObjectOfClass:forKey:");; +-(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key; +-(id)unarchiveObjectOfClasses:(NSSet*)clsSet forKey:(NSString *)key; -(BOOL)setString:(NSString *)value forKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to -archiveObject:forKey:"); -(BOOL)setString:(NSString *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility DEPRECATED_MSG_ATTRIBUTE("Migrate to -archiveObject:forKey:accesibility"); @@ -57,7 +59,9 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key; +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; -+(id)unarchiveObjectForKey:(NSString *)key; ++(id)unarchiveObjectForKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to +unarchiveObjectofClass:forKey:"); ++(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key; ++(id)unarchiveObjectOfClasses:(NSSet*)clsSet forKey:(NSString *)key; +(BOOL)setString:(NSString *)value forKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to +archiveObject:forKey:"); +(BOOL)setString:(NSString *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility DEPRECATED_MSG_ATTRIBUTE("Migrate to +archiveObject:forKey:accesibility"); diff --git a/Lockbox.m b/Lockbox.m index e15a54c..206ee21 100644 --- a/Lockbox.m +++ b/Lockbox.m @@ -195,33 +195,54 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility { - NSMutableData *data = [NSMutableData new]; - NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; - [archiver encodeObject:object forKey:key]; - [archiver finishEncoding]; - + NSError *error = nil; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object + requiringSecureCoding:YES + error:&error]; + if (!data) { + DLog(@"[archiveObject] Failed to archive object for key %@: %@", key, error); + return NO; + } return [self setData:data forKey:key accessibility:accessibility]; } -(id)unarchiveObjectForKey:(NSString *)key +{ + return [self unarchiveObjectOfClass:[NSObject class] forKey:key]; +} + +-(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key +{ + NSSet *allowedClass = [NSSet setWithObject:cls]; + return [self unarchiveObjectOfClasses:allowedClass + forKey:key]; +} + +-(id)unarchiveObjectOfClasses:(NSSet*)clsSet forKey:(NSString *)key { NSData *data = [self dataForKey:key]; + NSError *error = nil; if (!data) return nil; id object = nil; @try { - NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; - object = [unarchiver decodeObjectForKey:key]; + object = [NSKeyedUnarchiver unarchivedObjectOfClasses:clsSet + fromData:data + error:&error]; + if (!object && error) { + DLog(@"Failed to unarchive object for key %@: %@", key, error); + } } @catch (NSException *exception) { DLog(@"failed for key %@: %@", key, exception.description); } - + return object; } + -(BOOL)setString:(NSString *)value forKey:(NSString *)key { return [self setString:value forKey:key accessibility:DEFAULT_ACCESSIBILITY]; @@ -349,7 +370,17 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibi +(id)unarchiveObjectForKey:(NSString *)key { - return [_lockBox unarchiveObjectForKey:key]; + return [_lockBox unarchiveObjectOfClass:[NSObject class] forKey:key]; +} + ++(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key +{ + return [_lockBox unarchiveObjectOfClass:(Class)cls forKey:key]; +} + ++(id)unarchiveObjectOfClasses:(NSSet*)clsSet forKey:(NSString *)key +{ + return [_lockBox unarchiveObjectOfClasses:clsSet forKey:key]; } +(BOOL)setString:(NSString *)value forKey:(NSString *)key