Reputation: 321
I have the following warning (Xcode 10.1 - iOS 12.1)
'initForReadingWithData:' is deprecated: first deprecated in iOS 12.0 - Use -initForReadingFromData:error: instead*
When I'm change the method to initForReadingFromData, the NSKeyedUnarchiver returns nil.
// Current code which produces the warning (but works fine) :
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSMutableArray *loadedCredentialIdentities = (NSMutableArray *)[unarchiver decodeObjectForKey:kStoredCredentialIdentities];
[unarchiver finishDecoding];
...
// using initForReadingFromData produces no warning (but doesn't work - loadedCredentialIdentities is nil) :
NSError *error = nil;
NSKeyedUnarchiver *unarchiver = unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
NSMutableArray *loadedCredentialIdentities = (NSMutableArray *)[unarchiver decodeObjectForKey:kStoredCredentialIdentities];
[unarchiver finishDecoding];
Upvotes: 4
Views: 1773
Reputation: 321
Turning off secureCoding solved the problem.
[[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
unarchiver.requiresSecureCoding = NO;
[unarchiver decodeObjectForKey:...]
In cases you don't have to be backward compatible it's better not to turn off secureCoding
Upvotes: 8
Reputation: 11376
Watch this video from WWDC 2018 and then fix your unarchivers to use secure coding: https://developer.apple.com/videos/play/wwdc2018/222/
Upvotes: 0
Reputation: 11
It because you are using decodeObjectForKey
. If you don't set requiresSecureCoding
to NO
, you must use decodeObjectOfClass:forKey: instead.
Upvotes: 1