unarchiveobjectwithdata已被弃用

4

我现在尝试更新我的应用程序,但看到'unarchiveobjectwithdata:'已经被弃用了。我该如何解决这个问题?

我有一个类:

@interface Favorite : NSObject <NSSecureCoding> //NSCoding NSSecureCoding

@property (nonatomic) NSDate *wikiDate;

@property (nonatomic) FavoriteType type;

- (id) initWithDate:(NSDate *) date type:(FavoriteType) type;

- (id) initNilFavorite;

- (BOOL) isNilFavorite;
- (id) initWithCoder:(NSCoder *)aDecoder;
- (void) encodeWithCoder:(NSCoder *)aCoder;
@end

我有第二等级

@interface Settings : NSObject 

+ (Settings *) sharedInstance;
        
@property (nonatomic) NSMutableArray *favorites;

// favorites part

- (BOOL) isFavorite:(NSDate *) date type:(FavoriteType) type;
- (void) addToFavorites:(NSDate *) date type:(FavoriteType) type;
- (void) removeFromFavorites:(NSDate *) date type:(FavoriteType) type;

- (void) groupFavorites;   
- (void) saveSettings;

@end

当我在设置中保存收藏夹时

- (void) saveFavorites{
    NSString* filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"favorites"];
    NSError* error;
    NSData* codedData = [NSKeyedArchiver archivedDataWithRootObject:self.favorites requiringSecureCoding:NO error:&error];
    if(error!=nil) {
        NSLog(@"Eror when try to archive favorites!!!!");
    }
    else {
        [codedData writeToFile:filePath atomically:YES];
    }
}

我尝试加载

- (void) loadFavorites{
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"favorites"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    if (data) {
       self.favorites = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }   
}

一切正常,但现在我必须将unarchiveObjectWithData替换为unarchivedArrayOfObjectsOfClass

self.favorites是Favorite类的可变数组!

我尝试了各种方法:

NSSet *allowedClasses = [NSSet setWithObjects:[NSMutableArray  class],[Favorite class], nil];
NSMutableArray *encodedData = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses fromData:data error:&error];

NSData *encodedData = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class]  fromData:data error:&error];

and

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
[unarchiver setRequiresSecureCoding:NO];
[unarchiver decodeObjectOfClass:[Favorite class] forKey:@""];
[unarchiver finishDecoding];

无事可做 :(

请帮助我


1
这个回答是否解决了您的问题?iOS 12.0 替代使用已弃用的 archiveRootObject:toFile: - Himanshu Patel
是的,我看到了这篇文章。但是:
  1. unarchivedObjectOfClass 也已经被弃用了 :)
  2. 我尝试使用 decodeTopLevelObjectForKey,但是没有起作用,或者我不理解如何使用它。
备注 - 我解码了一个元素类为 Favorite 的 MuttableArray。 'self.favorites[0] - Favorite[data1][type1] self.favorites[1] - Favorite[data2][type2] ..... self.favorites[n] - Favorite[dataN][typeN] ' 然后需要:
  1. 解档 MuttableArray
  2. 将数组中的每个元素解码为 Favorite 类
- BeattleJeuse
我找到了解决方案。需要使用超类`id encodedData = [NSKeyedUnarchiver unarchivedObjectOfClass:[Favorite superclass] fromData:data error:&error]; if(error!=nil) { } else { self.favorites = encodedData;` - BeattleJeuse
1个回答

1

您可以使用

[ NSKeyedUnarchiver unarchivedObjectOfClass:[ NSObject class ] fromData:data error:&error ];

它在日志中有警告信息。

[Foundation] *** -[NSKeyedUnarchiver validateAllowedClass:forKey()]: NSSecureCoding允许的类列表包含[NSObject class],这将绕过安全性,允许隐式解码任何Objective-C类。在解码期间通过仅列出您希望解码的类或比NSObject更具体的基类来减少允许类的范围,以避免此问题。这将在未来成为一个错误。允许的类列表:{( "'NSObject' (0x1d9e91e08) [/usr/lib]" )}

更好的方法是使用:

[ NSKeyedUnarchiver unarchivedObjectOfClasses:[ NSSet setWithObjects:[ NSArray class ], [ Favorite class ], nil ] fromData:data error:&error ];

您可能需要使用[NSDate类]或其他一些包含在您的“Favorite”类中的内容来完成此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接