繁体   English   中英

CocoaPods 库中的 CoreData

[英]CoreData inside CocoaPods library

几个月前开发了一个iOS框架,现在想用CocoaPods轻松开发和分发。 现在我分发它发送我的 .framework 文件,我知道这不是最好的方法,因此我想使用 CocoaPods。

我的问题是,在我的框架内,我使用 CoreData,但无法使其与 Pod 一起使用。 如果我得到我的旧 .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']}
...

然后使用框架的某个类来获取包和资源:

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 }

这里的事情可能会有点棘手,但是如果您使用正确的路径,一切都会按预期进行。

swift 5 的一个小更新,因为我一直在努力让它工作。

在 podspec 中,我需要将 s.resource_bundles 定义为

  s.resource_bundles = {
      'FrameworkNameHere' => ['FrameworkNameHere/**/*.{xcdatamodeld}']
  }

并在代码中获取托管对象模型

guard let bundleUrl = Bundle(for: self).url(forResource: "FrameworkName", withExtension: "bundle"),
      let frameworkBundle = Bundle(url: bundleUrl),
      let modelUrl = frameworkBundle.url(forResource: "CoreDataModelName", withExtension: "momd"),
      let managedObjectModel = NSManagedObjectModel(contentsOf: modelUrl) else {
            fatalError("Managed object model not found")
}

尽管这似乎使我最初使用框架包 ID 显式构建的单元测试失败。 我在想我的核心数据类的初始化程序,它允许我根据单元测试/应用程序环境做一个或另一个可能是答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM