diff --git a/FirebaseMessaging/CHANGELOG.md b/FirebaseMessaging/CHANGELOG.md index f16de4bb8fe..03fc3bd31c2 100644 --- a/FirebaseMessaging/CHANGELOG.md +++ b/FirebaseMessaging/CHANGELOG.md @@ -1,3 +1,6 @@ +# Unreleased +- [fixed] Migrate FCM codebase to new NSKeyedUnarchiver APIs. (#14424). + # 11.8.0 - [fixed] Don't cache FCM registration token operations. (#14352). diff --git a/FirebaseMessaging/Sources/Token/FIRMessagingTokenInfo.m b/FirebaseMessaging/Sources/Token/FIRMessagingTokenInfo.m index f1321b26028..683473c723e 100644 --- a/FirebaseMessaging/Sources/Token/FIRMessagingTokenInfo.m +++ b/FirebaseMessaging/Sources/Token/FIRMessagingTokenInfo.m @@ -176,13 +176,13 @@ - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { // users have upgraded to at least 10.19.0. Perhaps, after privacy manifests have been required // for awhile? @try { - [NSKeyedUnarchiver setClass:[FIRMessagingAPNSInfo class] - forClassName:@"FIRInstanceIDAPNSInfo"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - rawAPNSInfo = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)rawAPNSInfo]; + NSKeyedUnarchiver *unarchiver = + [[NSKeyedUnarchiver alloc] initForReadingFromData:(NSData *)rawAPNSInfo error:nil]; + unarchiver.requiresSecureCoding = NO; + [unarchiver setClass:[FIRMessagingAPNSInfo class] forClassName:@"FIRInstanceIDAPNSInfo"]; + rawAPNSInfo = [unarchiver decodeObjectForKey:NSKeyedArchiveRootObjectKey]; + [unarchiver finishDecoding]; needsMigration = YES; -#pragma clang diagnostic pop } @catch (NSException *exception) { FIRMessagingLoggerInfo(kFIRMessagingMessageCodeTokenInfoBadAPNSInfo, @"Could not parse raw APNS Info while parsing archived token info."); diff --git a/FirebaseMessaging/Sources/Token/FIRMessagingTokenStore.m b/FirebaseMessaging/Sources/Token/FIRMessagingTokenStore.m index 06666b361cd..2e18e149c0e 100644 --- a/FirebaseMessaging/Sources/Token/FIRMessagingTokenStore.m +++ b/FirebaseMessaging/Sources/Token/FIRMessagingTokenStore.m @@ -99,19 +99,14 @@ - (nullable FIRMessagingTokenInfo *)tokenInfoWithAuthorizedEntity:(NSString *)au + (nullable FIRMessagingTokenInfo *)tokenInfoFromKeychainItem:(NSData *)item { // Check if it is saved as an archived FIRMessagingTokenInfo, otherwise return nil. FIRMessagingTokenInfo *tokenInfo = nil; - // NOTE: Passing in nil to unarchiveObjectWithData will result in an iOS error logged - // in the console on iOS 10 and below. Avoid by checking item.data's existence. if (item) { - // TODO(chliangGoogle: Use the new API and secureCoding protocol. @try { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [NSKeyedUnarchiver setClass:[FIRMessagingTokenInfo class] - forClassName:@"FIRInstanceIDTokenInfo"]; - tokenInfo = [NSKeyedUnarchiver unarchiveObjectWithData:item]; - -#pragma clang diagnostic pop - + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:item + error:nil]; + unarchiver.requiresSecureCoding = NO; + [unarchiver setClass:[FIRMessagingTokenInfo class] forClassName:@"FIRInstanceIDTokenInfo"]; + tokenInfo = [unarchiver decodeObjectForKey:NSKeyedArchiveRootObjectKey]; + [unarchiver finishDecoding]; } @catch (NSException *exception) { FIRMessagingLoggerDebug(kFIRMessagingMessageCodeTokenStoreExceptionUnarchivingTokenInfo, @"Unable to parse token info from Keychain item; item was in an "