unarchivedObjectOfClass:fromData:error
似乎没有记录,但我已经弄清楚了。
在您的情况下,当您取消存档时NSArray
并假设数组的内容是标准类,例如NSString
那么这应该适合你:
NSArray *stored = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:data error:&error];
但是我正在取消存档自定义对象PurchasedSubscription
如果您的NSArray
包含任何自定义类...
首先是objectOfClass
从方法到取消归档需要是您期望结果的类。
PurchasedSubscription *purchasedSubscription = [NSKeyedUnarchiver unarchivedObjectOfClass:PurchasedSubscription.class fromData:data error:&error];
接下来,您的自定义类需要符合NSSecureCoding
所以将其添加到类的接口中。我假设你已经有了NSCoding
实施的。
@interface PurchasedSubscription : NSObject <NSCoding, NSSecureCoding>
@end
接下来你的类必须重写supportsSecureCoding
确认是否支持
+ (BOOL)supportsSecureCoding
{
return YES;
}
接下来,在你的initWithCoder:
方法,你需要使用decodeObjectOfClass:key:
代替decodeObjectForKey
解码每个属性时,再次设置Class
参数作为正在解码的类类型。
- (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder
{
self = [self init];
if (self)
{
ReceiptInfo *receiptInfo = [aDecoder decodeObjectOfClass:[ReceiptInfo class] forKey:@"receiptInfo"];
return [self initWithReceiptInfo:receiptInfo];
}
return self;
}
正如你在这里看到的,这个类还解码另一个自定义类ReceiptInfo
,所以我必须在该类中重复此过程才能使其全部正常工作。
现在当我使用
PurchasedSubscription *purchasedSubscription = [NSKeyedUnarchiver unarchivedObjectOfClass:PurchasedSubscription.class fromData:data error:&error];
它安全地解码PurchasedSubscription
通过安全解码类ReceiptInfo
类,因为它在解码之前每一步都知道类类型应该是什么。
反面的注释NSEncoding
。你需要使用该方法
archivedDataWithRootObject:requiringSecureCoding:error:
代替
archivedDataWithRootObject:
对于这个,您不传入对象类,而是传入实际对象。
就我而言,我像这样创建对象
PurchasedSubscription *validSub = [[PurchasedSubscription alloc] initWithReceiptInfo:latestReceipt];
然后像这样编码
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:validSub requiringSecureCoding:YES error:&error];