如何从 iOS 静态库访问 Bundle

How to access Bundle from iOS static library

我正在使用 Core Data 框架开发静态库。遗憾的是,我无法访问生成的 Bundle / .momd 文件。

我做了什么:

我的无效代码:

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

Returns :

[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 开发方面没有很多经验,我正在尽力了解发生了什么,但现在对我来说这是一个死胡同:(

此致

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

编辑:修复 sdkResources.bundle 路径后

编辑:

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

如果为红色,则文件不存在。如果您确定它存在,请删除红色文件并重新添加:这可能是配置错误的文件link

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

从屏幕截图中我们看到,虽然要复制捆绑包,但它并不存在。
=> 很好,稍后可能会建造

但是

我们还可以看到 sdk 目标不依赖于 sdkResoures。
该捆绑包未及时构建

将其设置为在方案中构建并不能做到这一点(方案会太晚了!)
目标需要依赖包目标

好的,我知道了!

经过(太多)小时搜索将我的模型放入一个 Bundle 中后,我决定将它保留在我的 sdk 中并检查我的 podspec 配置(因为它在我的 sdk 测试中工作但在我的最终项目中没有工作)

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

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

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

我认为如果您不使用 Pods 并且只使用框架,解决方案可能会简单得多。 您将必须更改 Bundle 您正在寻找 momd

请查看这篇文章here

提出的解决方案是

    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)!
}()

此处 com.andrewcbancroft.CarKit 您的框架的包标识符,即包含您要从代码

访问的 momd 文件的包