From c521b98e904d64d6e1b58b4b8afad2f03bf492da Mon Sep 17 00:00:00 2001 From: Jing Liu Date: Fri, 14 Feb 2025 10:13:36 -0800 Subject: [PATCH 1/2] Migrate to new NSKeyedUnarchiver APIs unarchiveObjectWithData is deprecated. Move the codebase to use the new new more secure NSKeyedUnarchiver APIs. This is expected to fix #14424 --- .../Sources/Token/FIRMessagingTokenInfo.m | 12 ++++++------ .../Sources/Token/FIRMessagingTokenStore.m | 17 ++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) 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 " From 96b5b5246cc59966b9a2da739e6799913e495ff7 Mon Sep 17 00:00:00 2001 From: Jing Liu Date: Fri, 14 Feb 2025 10:46:33 -0800 Subject: [PATCH 2/2] Update changelog. --- FirebaseMessaging/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) 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).