场景再现:上线后出现大量crash,crash发生在iOS8及以下设备中。
问题解决:真机直接调试没问题,没有crash。后来只能在release下进行调试。首先去处release的debug限制,再通过window下的diveces可以显示显示release下的崩溃内容。
显示主要错误内容如下:
<Warning>: Unresolved error Error Domain=NSCocoaErrorDomain Code=134130 "未能完成操作。(“Cocoa”错误 134130。)" UserInfo=0x17447f100 {URL=file:///var/mobile/Containers/Data/Application/E59D1C45-4F51-41FC-B0D8-DEB452DBDB1F/Documents/XXXX.sqlite, metadata={
NSPersistenceFrameworkVersion = 519;
NSStoreModelVersionHashes = {
XXXBusiness = <7024b9dd acac8a71 eca7af3d 4cfa26ad 7fcf2eb5 d98c5695 2d28c245 be849b55>;
XXXCity = <a294f673 6bc51e46 bd56ea22 2b4c8048 42d0328b 16ef9ce1 c5d00d9b 28f8c055>;
XXXProfile = <db438715 ab920a2e 9b61d762 f9d6a4cf fe087e97 a8be23af 89e29b48 f52bd5aa>;
};
NSStoreModelVersionHashesVersion = 3;
NSStoreModelVersionIdentifiers = (
""
);
NSStoreType = SQLite;
NSStoreUUID = "D17A5417-1823-43E2-A6CE-6E146962F01D";
"_NSAutoVacuumLevel" = 2;
}, reason=Can't find model for source store}
结合代码改动,我们推断定是coredata使用过程中出现了问题,初步判断是升级中出现了某些问题,因为这个版本在表中增加了字段。
检查相关代码,查看coredata设置,都没发现什么明显的错误。最后重新模拟升级数据库的过程,终于发现了问题。在开发的时候,
偷懒直接将需要升级的字段写到了coredata中,后来升级coredata的XXXProfile表结构,由于粗心外加代码没有很熟悉,没有将老表中的字段清理干净,
剩了两个字段在老版本的coredata中。这样如崩溃信息所显示的,APP升级后,coredata发现:新代码中,老表结构的hash值,与本地现存老表结构的hash值不一样。
这就出现了“Can't find model for source store”的提示,即“没有发现模型的源存储”。iOS8以下系统没有相关的容错处理,直接抛出了错误,造成了crash。
总结教训:我们以后coredata的表结构升级,开发时就先建好新的模型,然后在新的模型中进行相关的操作。