2016-02-03 110 views
1

我有一个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之内),并且如果读取失败,则会执行某些操作以将状态详细信息报告给我。我还需要找到另一种缓存这些用户数据的方式,但这很容易。

回答

0

虽然try/catch的使用应该有点罕见,但对于它的使用来说,这是一个非常有效的用例。由于意外文件导致应用程序崩溃。这是你的应用程序应该处理的事情,并且可以很容易从中恢复捕捉例外情况,试图解压缩一个不良文件,并向用户报告适当的错误或以其他适当的方式处理它。

我在代码中的一个应用程序中执行相同的操作,在该代码中,我解压缩用户可导入应用程序的zip文件。用户可能已经导入了除zip文件以外的内容。所以我用try/catch包装了解压缩代码。 catch基本上显示错误,让用户知道该zip文件无效。