我有一个ObjC iOS应用程序,用于存档/取消存档数据。有问题的数据来自同伴服务器。每个用户都获得一组不同的数据。如何使用[NSKeyedUnarchiver unarchiveObjectWithFile]防止损坏的文件崩溃?
虽然我从来没有遇到过用户投诉,我看到通过Crashlytics报道了这条线崩溃极少数:
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
崩溃细节:
Fatal Exception: NSInvalidArgumentException
*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)
坠机发生在约0.002%的会话中,但是在少数不知名的用户中是最常见的。
我发现这个相关的问题:Archiving/Unarchiving results in initForReadingWithData incomprehensible archive。讨论为这个原因提供了两个合理的理论;一个档案包含字符“bplist”(听起来非常合理),另一个涉及档案大小(不太可能是典型的数据集大小)。
我在寻找关于如何检测这种情况并以某种方式发生崩溃的建议。 NSKeyedArchiver似乎没有返回错误的方法 - 失败的归档是崩溃。
理想情况下,我更喜欢一些机制来检测问题发生之前的根本原因。这个问题的频率并不能证明我自己编写了归档分析器,也没有证明添加任何可能会被所有用户执行的疯狂的风险。
我避免@try
阻止练习。显然这是一种可能性。应用程序比写入更频繁地读取此存档,因此我的想法是在写入后立即尝试读取(在@try
之内),并且如果读取失败,则会执行某些操作以将状态详细信息报告给我。我还需要找到另一种缓存这些用户数据的方式,但这很容易。