在APP内调用framework里的CoreData的相关方法,报错CoreData: error: Failed to load model named
framework中CoreData相关代码如下
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"EDriveData" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel;
}
[[NSBundle mainBundle] URLForResource:@"EDriveData" withExtension:@"momd"]; 返回nil
有以下两种可能
1.xcdatamodel的资源copy到bundle里
解决办法

- [NSBundle mainBundle] 返回bundle 是App Bundle,而xcdatamodel文件是在framework bundle 下,framework bundle里的文件并没有暴露出来,所以在App Bundle里找不到文件
解决办法
在framework里 使用 [NSBundle bundleForClass:[self class]] 来获取当前framework的 Bundle
扩展
bundleForClass 返回的bundle 是哪个?
分别在app,framework(dynamic library),static lib中定义了三个类,并调用bundleForClass方法输出,结果如下:
app - app bundle
framework - framework bundle
static lib - app bundle
再将framework build setting中的Mach-O Type改为static library,结果如下
app - app bundle
framework - app bundle
static lib -app bundle
所以只要是静态库,都属于官方说明中的最后一种情况:
the main bundle object if a Class was not dynamically loaded or is not defined in a framework.
参考资料
bundleForClass的返回 https://www.jianshu.com/p/bc9826a71a81
iOS 把库(sdk)中的图片资源打包 成.bundle https://www.jianshu.com/p/9318c91c852d
网友评论