【问题标题】:CoreData inside CocoaPods libraryCocoaPods 库中的 CoreData
【发布时间】:2016-10-15 04:52:54
【问题描述】:

几个月前我开发了一个 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;
}

我知道这可能是由错误的框架配置或错误的 Pod 配置引起的,但我不知道我缺少什么。

另外,这是我的 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 配置有关。

【问题讨论】:

    标签: ios objective-c core-data cocoapods


    【解决方案1】:

    这取决于您使用的 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 }
    

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

    【讨论】:

    • 谢谢!我试图使用“s.resources”,但你的解决方案一开始就可以工作
    【解决方案2】:

    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 显式构建的单元测试失败。我正在考虑为我的核心数据类创建一个初始化程序,它允许我根据单元测试/应用程序环境执行其中一项操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 2013-12-27
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多