How to access Bundle from iOS static library
我正在使用Core Data框架开发静态库。可悲的是,我无法访问生成的Bundle / .momd文件。
我所做的事情:
- 创建我的数据模型(Model.xcdatamodeld文件)
- 创建一个新的Bundle目标(名为sdkResources),在其中将我的xcdatamodeld文件添加到Compile Sources中并链接到CoreData.framework
- 在我的sdk目标中,我已将sdkResources.bundle放在"复制捆绑资源"部分中
- 编辑我的sdk方案,并在构建部分中添加sdkResources目标
我无法使用的代码:
1 2 3 | NSString *staticLibraryBundlePath = [[NSBundle mainBundle] pathForResource:@"sdkResources" ofType:@"bundle"]; NSURL *staticLibraryMOMURL = [[NSBundle bundleWithPath:staticLibraryBundlePath] URLForResource:@"Model" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:staticLibraryMOMURL]; |
返回:
1 | [FAILED], NSInvalidArgumentException"Cannot create an NSPersistentStoreCoordinator with a nil model" raised |
问题似乎是" mainBundle "访问,因为当我运行sdk测试时,下面的代码可以正常工作(至少没有错误)。
1 2 3 | NSBundle *bundle = [NSBundle bundleForClass:[self class]]; NSURL *staticLibraryMOMURL = [bundle URLForResource:@"Model" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:staticLibraryMOMURL]; |
但是当我想在另一个应用程序中使用我的sdk(使用podFile文件)时,我无法访问我的捆绑包并得到相同的错误:/
我已经阅读并尝试了很多,但似乎无济于事。我在iOS开发人员中没有很多经验,我正在尽力了解正在发生的事情,但是现在这对我来说是死胡同:(
致谢
- 编辑/我的项目配置屏幕
我不知道为什么sdkResources.bundle是红色的。
希望这就是您要的,谢谢。
编辑:修复sdkResources.bundle的路径后
编辑:
好吧,我真的很接近解决方案,我的捆绑包已成功复制到我的最终App中,但是我无法访问我的模型,并且仅在使用sdk测试时可以使用[NSBundle bundleForClass:[self class]]而不是[NSBundle mainBundle]。它可能只是一个愚蠢的配置,但是..是的..我会继续挖掘!
好吧,我明白了!
(经过)多个小时的搜索之后,我决定将模型放入捆绑包中,我决定将其保存在sdk中,并检查我的podspec配置(因为它在sdk测试中有效,但在最终项目中无效)
这是我的解决方案,在我刚刚添加的podspec文件中:
1 2 3 | s.resources = 'sdk/**/*.{xcdatamodeld,xcdatamodel}' s.preserve_paths = 'sdk/**/*' s.framework = 'CoreData' |
基本上,我只是将模型添加为资源和CoreData框架。至少我学到了很多关于Bundle和podspec配置的知识...
我认为,如果您不使用Pods并仅使用框架,则解决方案可能会更简单。
您必须更改要在其中查找
请在此处查看本文
建议的解决方案是
1 2 3 4 5 6 7 | lazy var managedObjectModel: NSManagedObjectModel = { // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model. let carKitBundle = NSBundle(identifier:"com.andrewcbancroft.CarKit") let modelURL = carKitBundle!.URLForResource("CarModel", withExtension:"momd")! return NSManagedObjectModel(contentsOfURL: modelURL)! }() |
此处
访问的
从屏幕截图中我们看到,虽然捆绑包是要复制的,但它不存在。
=>很好,稍后可能会构建
但是
我们也可以看到sdk目标与sdkResoures没有依赖关系。
捆绑包不是内置时间
将其设置为在方案中构建不会这样做(方案为时已晚!)
目标需要依赖于捆绑包target
如果为红色,则文件不存在。如果确定存在,请删除红色文件,然后再次添加:这可能是错误配置的文件链接
编辑添加:通常,您必须先构建库才能生成文件。该库有目标吗?如果是这样,请选择它,进行构建,然后切换回您的项目