如何从iOS静态库访问Bundle

时间:2015-02-14 21:50:47

标签: ios core-data bundle

我正在使用Core Data框架处理静态库。可悲的是,我无法访问生成的Bundle / .momd文件。

我做了什么:

  • 创建我的数据模型(Model.xcdatamodeld文件)
  • 创建一个新的Bundle目标(名为sdkResources),我在编译源中添加了我的xcdatamodeld文件并链接了CoreData.framework
  • 在我的sdk目标中,我已将sdkResources.bundle放入“复制捆绑资源”部分
  • 编辑我的sdk方案并在构建部分中添加了sdkResources目标

我的工作代码不正确:

NSString *staticLibraryBundlePath = [[NSBundle mainBundle] pathForResource:@"sdkResources" ofType:@"bundle"];
NSURL *staticLibraryMOMURL = [[NSBundle bundleWithPath:staticLibraryBundlePath] URLForResource:@"Model" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:staticLibraryMOMURL];

返回:

[FAILED], NSInvalidArgumentException "Cannot create an NSPersistentStoreCoordinator with a nil model" raised

问题似乎是“mainBundle”访问,因为下面的代码在我运行sdk测试时起作用(至少没有错误)

NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *staticLibraryMOMURL = [bundle URLForResource:@"Model" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:staticLibraryMOMURL];

但是当我想在其他应用程序中使用我的sdk(使用podFile文件)时,我无法访问我的包并得到同样的错误:/

我已经阅读并尝试了很多,但似乎没有任何效果。我在iOS开发方面没有很多经验,我正在尽力了解正在发生的事情,但现在对我来说已经走到了尽头:(

此致

  • 我的项目配置的编辑/屏幕

Bundle build phase

sdk scheme configuration

Sdk build phase

我不知道为什么sdkResources.bundle是红色的.. 希望这是你要求的,谢谢。

编辑:修复sdkResources.bundle的路径后 enter image description here

编辑:

好的,我真的很接近解决方案,我的包被成功复制到我的最终应用程序中但我无法访问我的模型,它只在我的sdk测试中工作时我使用[NSBundle bundleForClass:[self] class]]而不是[NSBundle mainBundle]。它可能只是一个愚蠢的配置,但是..是的..我会继续挖掘!

3 个答案:

答案 0 :(得分:3)

好的,我明白了!

经过很多时间寻找将我的模型放入Bundle之后我决定将它保存在我的sdk中并检查我的podspec配置(因为它在我的sdk测试中工作但不在我的最终项目中)

这是我的解决方案,在我刚添加的podspec文件中:

s.resources      = 'sdk/**/*.{xcdatamodeld,xcdatamodel}'
s.preserve_paths = 'sdk/**/*'
s.framework = 'CoreData'

基本上,我只是将我的模型添加为资源和CoreData框架。至少我学到了很多关于Bundle和podspec配置的知识......

答案 1 :(得分:0)

如果为红色,则表示该文件不存在。如果您确定它存在,请删除红色文件并再次添加:这可能是配置错误的文件链接

编辑添加:通常,您必须先构建库才能生成文件。这个图书馆有目标吗?如果是,请选择它,构建然后切换回项目

答案 2 :(得分:0)

从截图中我们看到,虽然捆绑包是要复制的,但它不存在 =>没关系,它可能会在以后制作

BUT

因为我们也可以看到sdk目标与sdkResoures没有依赖关系 捆绑包不是及时构建的

将其设置为在计划中构建不会这样做(该计划为时已晚!)
目标需要依赖于捆绑目标