Frank Möller
Frank Möller

Reputation: 321

initForReadingWithData is deprecated - initForReadingFromData returns nil

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

Answers (3)

Frank Möller
Frank Möller

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

Vlad Grigorov
Vlad Grigorov

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

Thomas A.
Thomas A.

Reputation: 11

It because you are using decodeObjectForKey. If you don't set requiresSecureCoding to NO, you must use decodeObjectOfClass:forKey: instead.

Upvotes: 1

Related Questions