- NSKeyedUnarchiver新版本警告
[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving safe plist type ''NSString' (0x1e02a43c0) [/System/Library/Frameworks/Foundation.framework]' for key 'accessToken', even though it was not explicitly included in the client allowed classes set: '{(
"'LHUserInfo' (0x1023ff680) [/private/var/containers/Bundle/Application/4C71BA36-B100-410E-8ADC-49D57182A3F1/LeHooWorld.app]"
)}'. This will be disallowed in the future.
當(dāng)iOS15.0以上版本使用NSKeyedUnarchiver進行解碼的時候,對于解碼非特定類型的對象,Apple引入了新的反序列化安全策略的警告。
在iOS 15及以后的版本中,NSKeyedUnarchiver需要知道將要解碼哪些對象的類型陡蝇。這是為了防止應(yīng)用在反序列化數(shù)據(jù)時,可能會誤解碼成并非期望的對象類型哮肚,這種情況可能會引起安全問題登夫。此策略的應(yīng)用方式是,當(dāng)我們嘗試反序列化一個對象時允趟,我們需要顯式地告訴 NSKeyedUnarchiver 我們希望解碼哪些類恼策。如果沒有列出的類被解碼,系統(tǒng)就會產(chǎn)生這個警告潮剪。
你看到的這個警告是因為你的代碼在嘗試解碼一個 NSString 對象涣楷,但 NSString 并沒有被明確地添加到 NSKeyedUnarchiver 的允許解碼的類列表中。但由于 NSString 是一個安全的Plist類型抗碰,所以這個操作還是被允許的狮斗,但同時也產(chǎn)生了這個警告。
要解決這個警告弧蝇,你需要明確地告訴 NSKeyedUnarchiver 在反序列化數(shù)據(jù)前碳褒,你將要解碼的類迄汛。這樣可以確保解碼的數(shù)據(jù)是你期望的類型。這是一個可能的解決方案的例子:
NSData *data = //... your archived data
NSSet *allowedClasses = [NSSet setWithObjects:[NSString class], [MyClass class], nil];
NSError *error = nil;
MyClass *myClass = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses fromData:data error:&error];
你需要為你希望解碼的每個類都創(chuàng)建一個NSSet骤视,并在 unarchivedObjectOfClasses:fromData:error: 方法中使用它鞍爱。在這個例子中,我們允許解碼 NSString 和 LHUserInfo 類型的對象专酗。
注意睹逃,你的App可能在試圖反序列化 LHUserInfo 類型的對象時,同時也可能在反序列化 NSString 對象祷肯,所以你需要在允許解碼的類集合中包含這兩種類型的類沉填。
這種策略的目的是為了提高安全性,尤其是在處理可能來自不安全來源的數(shù)據(jù)時佑笋。為了確保App的安全性翼闹,應(yīng)該盡可能地限制可以解碼的類型。