如何在本地保存 SKProduct 对象?

Posted

技术标签:

【中文标题】如何在本地保存 SKProduct 对象?【英文标题】:How to save SKProduct object locally? 【发布时间】:2013-01-06 02:48:23 【问题描述】:

我尝试使用 NSKeyedArchiver 类存档 SKProduct 对象来保存它,但它会生成错误 -[SKProduct encodeWithCoder:]: unrecognized selector sent to instance

+ (void)saveProduct:(SKProduct *)product

     NSData *data = [NSKeyedArchiver archivedDataWithRootObject:product];
    [[NSUserDefaults standardUserDefaults] setValue:data forKey:PRODUCT];
    [[NSUserDefaults standardUserDefaults] synchronize];

有没有办法保存 SKProduct 的实例?

【问题讨论】:

不确定您要在这里做什么。你为什么想做这个?我宁愿在需要时从 App Store 重新加载产品,以确保该产品仍然可用并检查其价格。此外,您不知道 store kit 和 SKProduct 如何与 App Store 通信,以及 SKProduct 如何与 store kit 的其余部分连接。 每次请求数据来检索所有产品是一个耗时的,并且对于自省来说,一次足以确保价格。 好吧,即使你知道价格,你也很可能无法带着它去SKPaymentQueue,因为它不会与商店的其他工具包正确“连接” .另请参阅@endy 对此的评论。如果您真的很想节省时间,可以在后台某处加载它,但每次启动至少一次。 【参考方案1】:

您的 SKProduct 类需要符合 NSCoding 协议。

换句话说,您需要在您的 SKProduct 类中填写这两个方法。

(void)encodeWithCoder:(NSCoder *)aCoder; (id)initWithCoder:(NSCoder *)aDecoder;

这将获取您的 SKProduct 类并将其分解,以便可以对其进行序列化和反序列化。

【讨论】:

所以我需要创建一个类别来添加这两种方法。除了这个,还有其他方法可以保存它吗? 我没有意识到 SKProduct 是一个 Apple 类。事实上,SKProduct 类可能有很多私有属性,并且序列化它们可能属于使用私有 API 的范畴。不包括私有属性不会产生您想要的结果。我建议重新考虑为什么需要序列化这些对象并寻找替代方案。

以上是关于如何在本地保存 SKProduct 对象?的主要内容,如果未能解决你的问题,请参考以下文章

SKProduct 中的本地化标题为零

如何在本地存储中保存对象数组

R:如何在函数本地环境中保存所有对象?

模拟SKProduct,SKProductDiscount

如何在本地存储中保存和恢复 File 对象

Swift 中 SKProduct 的 NSCoding 错误