Ios 如何使用[NSKeyedUnarchiver unarchiveObjectWithFile]防止损坏的文件崩溃?

Ios 如何使用[NSKeyedUnarchiver unarchiveObjectWithFile]防止损坏的文件崩溃?,ios,objective-c,nskeyedunarchiver,Ios,Objective C,Nskeyedunarchiver,我有一个ObjC iOS应用程序,我在其中归档/取消归档数据。所讨论的数据来自一个配套服务器。每个用户获得一组不同的数据 虽然我从未收到过用户投诉,但我在这条线上看到了通过Crashlytics报告的极少数崩溃: NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 事故详情: Fatal Exception: NSInvalidArgumentException *** -[NSKeyedUnarchiver i

我有一个ObjC iOS应用程序,我在其中归档/取消归档数据。所讨论的数据来自一个配套服务器。每个用户获得一组不同的数据

虽然我从未收到过用户投诉,但我在这条线上看到了通过Crashlytics报告的极少数崩溃:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
事故详情:

Fatal Exception: NSInvalidArgumentException
*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)
崩溃发生在大约0.002%的会话中,但在少数未知用户中最为常见

我发现了这个相关的问题:。这一讨论为这一原因提供了两个合理的理论依据;一个是归档文件包含字符“bplist”(听起来非常合理),另一个涉及归档文件的大小(鉴于典型的数据集大小,不太可能)

我正在寻找关于如何检测这种情况并在某种程度上避免崩溃的建议。NSKeyedArchiver似乎没有返回错误的方法-失败的存档是崩溃

理想情况下,我更喜欢某种机制,在问题发生之前检测问题的根本原因。这个问题的出现频率并不能证明我有理由编写自己的归档解析器,也不能证明我有理由添加任何可能被所有用户执行的疯狂内容


我避免练习时出现
@try
障碍。显然这是一种可能性。应用程序读取此归档文件的频率远远高于写入,因此我的想法是在写入之后尝试读取(在
@try
中),如果读取失败,请做一些事情将状态详细信息报告给我。我还需要为这些用户找到另一种缓存数据的方法,但这是最简单的部分。

虽然使用
try/catch
应该比较少见,但这是一个非常有效的使用案例。由于意外文件导致应用程序崩溃对您不利。这是你的应用程序应该处理的事情,可以很容易地从中恢复。捕获尝试取消归档坏文件的异常,并向用户报告适当的错误,或以其他适当的方式处理它


我在我的一个应用程序代码中也做了同样的事情,我解压了一个用户可以导入到应用程序中的zip文件。用户可能导入了zip文件以外的内容。因此,我用
try/catch
包装解压代码。
catch
基本上会向用户显示一个错误,让他们知道zip文件无效。

虽然使用
try/catch
应该比较少见,但这是一个非常有效的使用案例。由于意外文件导致应用程序崩溃对您不利。这是你的应用程序应该处理的事情,可以很容易地从中恢复。捕获尝试取消归档坏文件的异常,并向用户报告适当的错误,或以其他适当的方式处理它

我在我的一个应用程序代码中也做了同样的事情,我解压了一个用户可以导入到应用程序中的zip文件。用户可能导入了zip文件以外的内容。因此,我用
try/catch
包装解压代码。
catch
基本上会向用户显示一个错误,让他们知道zip文件无效