如何从 iOS 静态库访问 Bundle
How to access Bundle from iOS static library
我正在使用 Core Data 框架开发静态库。遗憾的是,我无法访问生成的 Bundle / .momd 文件。
我做了什么:
- 创建我的数据模型(Model.xcdatamodeld 文件)
- 创建一个新的 Bundle 目标(名为 sdkResources),我在编译源中添加了我的 xcdatamodeld 文件并链接了 CoreData.framework
- 在我的 sdk 目标中,我将 sdkResources.bundle 放在 "Copy Bundle Resources" 部分
- 编辑我的 sdk 方案并在构建部分添加 sdkResources 目标
我的无效代码:
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
文件的包
我正在使用 Core Data 框架开发静态库。遗憾的是,我无法访问生成的 Bundle / .momd 文件。
我做了什么:
- 创建我的数据模型(Model.xcdatamodeld 文件)
- 创建一个新的 Bundle 目标(名为 sdkResources),我在编译源中添加了我的 xcdatamodeld 文件并链接了 CoreData.framework
- 在我的 sdk 目标中,我将 sdkResources.bundle 放在 "Copy Bundle Resources" 部分
- 编辑我的 sdk 方案并在构建部分添加 sdkResources 目标
我的无效代码:
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
文件的包