From 5d3ba3ba0b07e419f6a67b8e02df4141cf6c7c9d Mon Sep 17 00:00:00 2001 From: Benjamin Kier Date: Fri, 19 Sep 2025 12:52:59 -0400 Subject: [PATCH 1/6] Lockbox.m : Updated to use the newer iOS 15 NSKeyedArchiver calls --- Lockbox.m | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Lockbox.m b/Lockbox.m index e15a54c..1e6c185 100644 --- a/Lockbox.m +++ b/Lockbox.m @@ -195,24 +195,32 @@ -(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 { 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 unarchivedObjectOfClass:[NSObject class] // adjust class as needed + 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); From a085b2eb19c46cfd8111ee54d71a7b38f777a663 Mon Sep 17 00:00:00 2001 From: Benjamin Kier Date: Mon, 22 Sep 2025 15:09:13 -0400 Subject: [PATCH 2/6] Should really pass the class, otherwise we get a runtime warning... --- Lockbox.h | 4 ++-- Lockbox.m | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lockbox.h b/Lockbox.h index 3c8c5b8..c81c2d2 100644 --- a/Lockbox.h +++ b/Lockbox.h @@ -28,7 +28,7 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key; -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; --(id)unarchiveObjectForKey:(NSString *)key; +-(id)unarchiveObjectOfClass:(Class)cls 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 +57,7 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key; +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; -+(id)unarchiveObjectForKey:(NSString *)key; ++(id)unarchiveObjectOfClass:(Class)cls 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 1e6c185..d11ba5c 100644 --- a/Lockbox.m +++ b/Lockbox.m @@ -206,7 +206,7 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibi return [self setData:data forKey:key accessibility:accessibility]; } --(id)unarchiveObjectForKey:(NSString *)key +-(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key { NSData *data = [self dataForKey:key]; NSError *error = nil; @@ -215,7 +215,7 @@ -(id)unarchiveObjectForKey:(NSString *)key id object = nil; @try { - object = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] // adjust class as needed + object = [NSKeyedUnarchiver unarchivedObjectOfClass:cls // adjust class as needed fromData:data error:&error]; if (!object && error) { @@ -355,9 +355,9 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibi return [_lockBox archiveObject:object forKey:key accessibility:accessibility]; } -+(id)unarchiveObjectForKey:(NSString *)key ++(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key { - return [_lockBox unarchiveObjectForKey:key]; + return [_lockBox unarchiveObjectOfClass:(Class)cls ForKey:key]; } +(BOOL)setString:(NSString *)value forKey:(NSString *)key From 5b241447e005335295b7d589378ad32614ad5c64 Mon Sep 17 00:00:00 2001 From: Benjamin Kier Date: Tue, 23 Sep 2025 11:29:19 -0400 Subject: [PATCH 3/6] Added original message signatures back in with deprecation warnings. --- Lockbox.h | 2 ++ Lockbox.m | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Lockbox.h b/Lockbox.h index c81c2d2..c758354 100644 --- a/Lockbox.h +++ b/Lockbox.h @@ -28,6 +28,7 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key; -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; +-(id)unarchiveObjectForKey:(NSString *)key; -(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key; -(BOOL)setString:(NSString *)value forKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to -archiveObject:forKey:"); @@ -57,6 +58,7 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key; +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; ++(id)unarchiveObjectForKey:(NSString *)key; +(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key; +(BOOL)setString:(NSString *)value forKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to +archiveObject:forKey:"); diff --git a/Lockbox.m b/Lockbox.m index d11ba5c..9c311c2 100644 --- a/Lockbox.m +++ b/Lockbox.m @@ -206,6 +206,13 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibi return [self setData:data forKey:key accessibility:accessibility]; } +-(id)unarchiveObjectForKey:(NSString *)key +{ + DLog(@"-(id)unarchiveObjectForKey:(NSString *)key is depracated and will soon be blocked by Apple.\ + Please migrate to -(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key"); + return [self unarchiveObjectOfClass:[NSObject class] ForKey:key]; +} + -(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key { NSData *data = [self dataForKey:key]; @@ -355,6 +362,13 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibi return [_lockBox archiveObject:object forKey:key accessibility:accessibility]; } ++(id)unarchiveObjectForKey:(NSString *)key +{ + DLog(@"+(id)unarchiveObjectForKey:(NSString *)key is depracated and will soon be blocked by Apple.\ + Please migrate to +(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key"); + return [_lockBox unarchiveObjectOfClass:[NSObject class] ForKey:key]; +} + +(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key { return [_lockBox unarchiveObjectOfClass:(Class)cls ForKey:key]; From fab66acc50ac8fda7545dceb3385821ab7907b59 Mon Sep 17 00:00:00 2001 From: Benjamin Kier Date: Wed, 24 Sep 2025 08:38:48 -0400 Subject: [PATCH 4/6] switched to a true deprecation warning. --- Lockbox.h | 8 ++++---- Lockbox.m | 14 +++++--------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Lockbox.h b/Lockbox.h index c758354..be7e8d7 100644 --- a/Lockbox.h +++ b/Lockbox.h @@ -28,8 +28,8 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key; -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; --(id)unarchiveObjectForKey:(NSString *)key; --(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key; +-(id)unarchiveObjectForKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to -unarchiveObjectOfClass:forKey:");; +-(id)unarchiveObjectOfClass:(Class)cls 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"); @@ -58,8 +58,8 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key; +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; -+(id)unarchiveObjectForKey:(NSString *)key; -+(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key; ++(id)unarchiveObjectForKey:(NSString *)key DEPRECATED_MSG_ATTRIBUTE("Migrate to +unarchiveObjectofClass:forKey:"); ++(id)unarchiveObjectOfClass:(Class)cls 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 9c311c2..f1af0a2 100644 --- a/Lockbox.m +++ b/Lockbox.m @@ -208,12 +208,10 @@ -(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibi -(id)unarchiveObjectForKey:(NSString *)key { - DLog(@"-(id)unarchiveObjectForKey:(NSString *)key is depracated and will soon be blocked by Apple.\ - Please migrate to -(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key"); - return [self unarchiveObjectOfClass:[NSObject class] ForKey:key]; + return [self unarchiveObjectOfClass:[NSObject class] forKey:key]; } --(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key +-(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key { NSData *data = [self dataForKey:key]; NSError *error = nil; @@ -364,14 +362,12 @@ +(BOOL)archiveObject:(id)object forKey:(NSString *)key accessibi +(id)unarchiveObjectForKey:(NSString *)key { - DLog(@"+(id)unarchiveObjectForKey:(NSString *)key is depracated and will soon be blocked by Apple.\ - Please migrate to +(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key"); - return [_lockBox unarchiveObjectOfClass:[NSObject class] ForKey:key]; + return [_lockBox unarchiveObjectOfClass:[NSObject class] forKey:key]; } -+(id)unarchiveObjectOfClass:(Class)cls ForKey:(NSString *)key ++(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key { - return [_lockBox unarchiveObjectOfClass:(Class)cls ForKey:key]; + return [_lockBox unarchiveObjectOfClass:(Class)cls forKey:key]; } +(BOOL)setString:(NSString *)value forKey:(NSString *)key From d27bcfd5f074ba48ca1de710d347424e2e2a6110 Mon Sep 17 00:00:00 2001 From: Benjamin Kier Date: Mon, 6 Oct 2025 10:40:18 -0400 Subject: [PATCH 5/6] Added -/+(id)unarchiveObjectOfClasses to allow for more than one class to be unarchived. This is needed if you're unarchiving any custom classes with any member classes. --- Lockbox.h | 2 ++ Lockbox.m | 31 ++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Lockbox.h b/Lockbox.h index be7e8d7..f510a31 100644 --- a/Lockbox.h +++ b/Lockbox.h @@ -30,6 +30,7 @@ -(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"); @@ -60,6 +61,7 @@ +(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 f1af0a2..efbac95 100644 --- a/Lockbox.m +++ b/Lockbox.m @@ -220,7 +220,7 @@ -(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key id object = nil; @try { - object = [NSKeyedUnarchiver unarchivedObjectOfClass:cls // adjust class as needed + object = [NSKeyedUnarchiver unarchivedObjectOfClass:cls fromData:data error:&error]; if (!object && error) { @@ -234,6 +234,30 @@ -(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key return object; } +-(id)unarchiveObjectOfClasses:(NSSet*)clsSet forKey:(NSString *)key +{ + NSData *data = [self dataForKey:key]; + NSError *error = nil; + if (!data) + return nil; + + id object = nil; + @try { + 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 { @@ -370,6 +394,11 @@ +(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 { return [_lockBox setString:value forKey:key]; From 42bda4824499a2a2e843cf10ec13d1946b3760d5 Mon Sep 17 00:00:00 2001 From: Benjamin Kier Date: Mon, 6 Oct 2025 11:15:23 -0400 Subject: [PATCH 6/6] improved maintainability --- Lockbox.m | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/Lockbox.m b/Lockbox.m index efbac95..206ee21 100644 --- a/Lockbox.m +++ b/Lockbox.m @@ -213,25 +213,9 @@ -(id)unarchiveObjectForKey:(NSString *)key -(id)unarchiveObjectOfClass:(Class)cls forKey:(NSString *)key { - NSData *data = [self dataForKey:key]; - NSError *error = nil; - if (!data) - return nil; - - id object = nil; - @try { - object = [NSKeyedUnarchiver unarchivedObjectOfClass:cls - 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; + NSSet *allowedClass = [NSSet setWithObject:cls]; + return [self unarchiveObjectOfClasses:allowedClass + forKey:key]; } -(id)unarchiveObjectOfClasses:(NSSet*)clsSet forKey:(NSString *)key