一開始項目中使用coredata保存數(shù)據(jù),自己寫了一個單例管理。其中獲取CoreData.momd文件:
- (NSManagedObjectModel *)manageObjectModel {
if (_manageObjectModel != nil) {
return _manageObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:kDDCoreDataManagerModelName withExtension:@"momd"];
/*
if(@available(iOS 11.0, *)){
} else {
modelURL = [modelURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.mom", kDDCoreDataManagerModelName]];
}*/
_manageObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _manageObjectModel;
}
隨后coredata轉(zhuǎn)移到SDK中,打包framework之后直接閃退,定位到_manageObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];意思是modelURL為nil,無法加載空的。
通過和之前的對比,發(fā)現(xiàn)是無法找到CoreData.momd文件,查看.framework內(nèi)容CoreData.momd存在里面。

image.png
剩下的就是從.framework查找CoreData.momd路徑,之前代碼是用mainBundle,此次通過-bundleForClass:方法獲取bundle。代碼更新如下
- (NSManagedObjectModel *)manageObjectModel {
if (_manageObjectModel != nil) {
return _manageObjectModel;
}
//NSURL *modelURL = [[NSBundle mainBundle] URLForResource:kDDCoreDataManagerModelName withExtension:@"momd"];
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *modelURL = [bundle URLForResource:kDDCoreDataManagerModelName withExtension:@"momd"];
/*
if(@available(iOS 11.0, *)){
} else {
modelURL = [modelURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.mom", kDDCoreDataManagerModelName]];
}*/
if (modelURL) {
_manageObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
}
return _manageObjectModel;
}
同理獲得其他的資源,只要獲取到bundle就可以讀取了。