CocoaPods 库中的 CoreData
CoreData inside CocoaPods library
我几个月前开发了一个iOS框架,现在我想使用CocoaPods来轻松开发和发布它。现在我分发它并发送我的 .framework 文件,我知道这不是最好的方法,因此我想使用 CocoaPods.
我的问题是,在我的框架内我使用了 CoreData,但我无法让它与 Pods 一起工作。
如果我得到我的旧 .framework 并将其导入我的应用程序项目,一切都很好,CoreData 工作得很好。
深入研究问题,似乎 Database.momd 未在捆绑包中找到。
我将在失败的框架内附上一段代码:
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle bundleWithIdentifier:@"kemmitorz.myFramework"] URLForResource:@"Database" withExtension:@"momd"];
// HERE modelURL RETURNS NIL with Pods
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
我知道这可能是框架配置错误或 Pods 配置错误引起的,但我不知道我遗漏了什么。
此外,这是我的 myFramework.podspec 文件:
Pod::Spec.new do |s|
s.name = 'myFramework'
s.version = '0.1.0'
s.summary = 'A short description of myFramework.'
....
s.ios.deployment_target = '8.0'
s.source_files = 'myFramework/**/*.{h,m}'
s.frameworks = 'Foundation', 'Security', 'CFNetwork', 'CoreData'
s.library = 'icucore'
s.dependency 'SocketRocket'
s.dependency 'AFNetworking'
s.dependency 'OCMapper'
end
我也尝试过将 {h,m,xcdatamodeld} 添加到源文件类型中,但没有成功。
我错过了什么?重复,如果我自己编译和导入框架,一切正常,所以我想这与 CocoaPods 配置有关。
这取决于您使用的 cocoapods 版本,在 1.0.x 中推荐的方法是添加 s.resource_bundles
以及应该包含在捆绑 Cocoapods resource_bundles,例如:
...
s.source_files = 'myFramework/**/*.{h,m}'
s.resource_bundles = {'myFramework' => ['myFramework/*.xcdatamodeld']}
...
然后使用您的框架的一些 class 来获取包和资源:
guard let bundleURL = NSBundle(forClass: FrameworkClass.self).URLForResource("myFramework", withExtension: "bundle") else { throw Error }
guard let frameworkBundle = NSBundle(URL: bundleURL) else { throw Error }
guard let momURL = frameworkBundle.URLForResource("Database", withExtension: "momd") else { throw Error }
这里的事情可能会有点棘手,但如果您使用正确的路径,一切都会按预期进行。
swift5 的一点更新,因为我一直在努力让它工作。
在 podspec 中,我需要将 s.resource_bundles 定义为
s.resource_bundles = {
'FrameworkNameHere' => ['FrameworkNameHere/**/*.{xcdatamodeld}']
}
并在代码中获取托管对象模型
guard let bundleUrl = Bundle(for: self).url(forResource: "FrameworkName", withExtension: "bundle"),
let frameworkBundle = Bundle(url: bundleUrl),
let modelUrl = frameworkBundle.url(forResource: "CoreDataModelName", withExtension: "momd"),
let managedObjectModel = NSManagedObjectModel(contentsOf: modelUrl) else {
fatalError("Managed object model not found")
}
虽然这似乎没有通过我最初使用框架包 ID 显式构建的单元测试。我正在考虑我的核心数据 class 的初始化程序,它允许我根据单元测试/应用程序环境做一个或另一个可能是答案。
我几个月前开发了一个iOS框架,现在我想使用CocoaPods来轻松开发和发布它。现在我分发它并发送我的 .framework 文件,我知道这不是最好的方法,因此我想使用 CocoaPods.
我的问题是,在我的框架内我使用了 CoreData,但我无法让它与 Pods 一起工作。 如果我得到我的旧 .framework 并将其导入我的应用程序项目,一切都很好,CoreData 工作得很好。
深入研究问题,似乎 Database.momd 未在捆绑包中找到。
我将在失败的框架内附上一段代码:
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle bundleWithIdentifier:@"kemmitorz.myFramework"] URLForResource:@"Database" withExtension:@"momd"];
// HERE modelURL RETURNS NIL with Pods
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
我知道这可能是框架配置错误或 Pods 配置错误引起的,但我不知道我遗漏了什么。
此外,这是我的 myFramework.podspec 文件:
Pod::Spec.new do |s|
s.name = 'myFramework'
s.version = '0.1.0'
s.summary = 'A short description of myFramework.'
....
s.ios.deployment_target = '8.0'
s.source_files = 'myFramework/**/*.{h,m}'
s.frameworks = 'Foundation', 'Security', 'CFNetwork', 'CoreData'
s.library = 'icucore'
s.dependency 'SocketRocket'
s.dependency 'AFNetworking'
s.dependency 'OCMapper'
end
我也尝试过将 {h,m,xcdatamodeld} 添加到源文件类型中,但没有成功。
我错过了什么?重复,如果我自己编译和导入框架,一切正常,所以我想这与 CocoaPods 配置有关。
这取决于您使用的 cocoapods 版本,在 1.0.x 中推荐的方法是添加 s.resource_bundles
以及应该包含在捆绑 Cocoapods resource_bundles,例如:
...
s.source_files = 'myFramework/**/*.{h,m}'
s.resource_bundles = {'myFramework' => ['myFramework/*.xcdatamodeld']}
...
然后使用您的框架的一些 class 来获取包和资源:
guard let bundleURL = NSBundle(forClass: FrameworkClass.self).URLForResource("myFramework", withExtension: "bundle") else { throw Error }
guard let frameworkBundle = NSBundle(URL: bundleURL) else { throw Error }
guard let momURL = frameworkBundle.URLForResource("Database", withExtension: "momd") else { throw Error }
这里的事情可能会有点棘手,但如果您使用正确的路径,一切都会按预期进行。
swift5 的一点更新,因为我一直在努力让它工作。
在 podspec 中,我需要将 s.resource_bundles 定义为
s.resource_bundles = {
'FrameworkNameHere' => ['FrameworkNameHere/**/*.{xcdatamodeld}']
}
并在代码中获取托管对象模型
guard let bundleUrl = Bundle(for: self).url(forResource: "FrameworkName", withExtension: "bundle"),
let frameworkBundle = Bundle(url: bundleUrl),
let modelUrl = frameworkBundle.url(forResource: "CoreDataModelName", withExtension: "momd"),
let managedObjectModel = NSManagedObjectModel(contentsOf: modelUrl) else {
fatalError("Managed object model not found")
}
虽然这似乎没有通过我最初使用框架包 ID 显式构建的单元测试。我正在考虑我的核心数据 class 的初始化程序,它允许我根据单元测试/应用程序环境做一个或另一个可能是答案。