几个月前我开发了一个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']} ...
然后使用你的框架的某些类来获取bundle和资源:
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 }
事情在这里可能会有点棘手,但如果你使用正确的路径,一切都按预期工作.