【问题标题】:Can I use CocoaPods when creating a Cocoa Touch Framework?创建 Cocoa Touch 框架时可以使用 CocoaPods 吗?
【发布时间】:2016-06-25 22:11:04
【问题描述】:

我正在创建一个新的 Cocoa Touch 框架 (MyFramework.framework),它将依赖于 Alamofire。这个框架将用 Swift 编写。作为测试,我开始了一个新的 Cocoa Touch Framework 项目:

File > New > Project > Framework & Library > Cocoa Touch Framework

然后,在我执行的终端中:

pod init

在这个项目目录下。在新创建的 Podfile 中,我添加了以下内容:

source 'https://github.com/CocoaPods/Specs.git'
# Uncomment this line to define a global platform for your project
platform :ios, '8.0'
# Uncomment this line if you're using Swift
use_frameworks!

pod 'Alamofire', '~> 3.0'

再一次,在我执行的终端中:

pod install

然后开始编码。

在我在单一视图项目中使用 MyFramework.framework 产品之前,一切似乎都很好。当我尝试运行该项目时,出现以下问题:

dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire
Referenced from: /Users/me/Library/Developer/CoreSimulator/Devices/87DA70B6-49BF-441E-BD81-F4A80B0792CF/data/Containers/Bundle/Application/2E414EA8-7E54-4D71-9295-566D4FAAADE2/test.app/Frameworks/MyFramework.framework/MyFramework
Reason: image not found

我认为 Cocoa Touch Framework 项目本质上是动态的,因此会包含所有依赖项。

谁能告诉我为什么会发生这种情况以及我该如何解决它? 这是 CocoaPods 的问题还是我遗漏了什么?

我是 Stack Overflow 的菜鸟,所以如果您需要我提供更多信息,请告诉我。

谢谢!

【问题讨论】:

    标签: ios swift cocoa cocoapods cocoa-touch


    【解决方案1】:

    不幸的是,CocoaPods 不支持与 Cocoa Touch Framework 目标一起使用。在 GitHub 上挖掘他们的问题时,我发现了一些对此的参考:

    我们并不真正支持将 Pod 集成到框架目标中...
    -neonichu 2015 年 11 月 4 日

    ...为了“正常工作”,CP 需要对您的 Xcode 项目中的依赖项进行递归分析,并以某种方式确保您永远不会在另一个上下文中使用构建产品。
    -neonichu 2015 年 7 月 7 日


    到目前为止,我已经找到了两种方法来处理这个问题:

    正确的方法是为您的框架创建一个新的 pod 规范,并通过 CocoaPods 将其引入您的主项目。这解决了 CococaPods 在依赖图方面的所有问题,并且是 CocoaPods 开发人员推荐的解决方案。

    简单的方法是将框架中的 pod 包含在主项目中。这似乎有效,但坦率地说,我不知道为什么。这是我的测试项目中的 Podfile:

    platform :ios, '9.0'
    use_frameworks!
    
    def myfirstframework_pods
        pod 'Alamofire', '~> 3.0'
    end
    
    target 'MyApp' do
        pod 'SwiftKeychainWrapper', '~>1.0'
        myfirstframework_pods
    end
    
    target 'MyFirstFramework' do
        myfirstframework_pods
    end
    

    【讨论】:

    • 之所以可行,是因为您正在构建的框架很高兴,只要它的依赖项嵌入在应用程序中(只需链接它们,它们就被应用程序嵌入)。 Apple 似乎对包含框架非常挑剔 - 唯一应该添加它们的地方是在应用程序中。这是为了避免许多不同的框架添加可能造成破坏的不同版本的框架。我只需要提到“java 类路径”就可以描述另一个极端。所以是的,在框架中使用框架是非常困难的,但是可以使用所谓的伞头来完成。
    • “简单方法”将为您提供“[!] 对于某些库(例如 Firebase),“Pods-MyApp”目标具有名称冲突的框架:googletoolboxformac”。
    • 非常有帮助的帖子!
    • @Dalla Edwards 你能详细描述一下正确的方法吗?
    • 所以,我正在尝试做类似的事情。基本上我现在创建了一个空的 Cocoa Touch Framework 来导入一些 CocoaPods。这似乎运作良好。但是当我在项目中使用框架时,我无法从框架中导入的 CocoaPods 访问公共函数。知道怎么做吗?
    【解决方案2】:

    尝试在框架的 podspec 中添加对 Alamofire 的依赖,如下所示

    Pod::Spec.new do |s|
    
    # Other setup 
    
    # Dependencies
    s.dependency "Alamofire"
    # Other dependencies if any
    

    【讨论】:

    • 我已经尝试过了,但是当您在示例项目中为您的自定义框架安装 pod 时,它似乎给出了错误。对我来说,它在我的自定义框架文件中显示“没有这样的模块 Firebase”。
    • 我必须对构建设置进行任何更改吗?
    • 我没有以上述方式使用过 Firebase。它确实适用于其他 pod,例如 FBSDKCoreKit、FBSDKShareKit、Alamofire。
    • 我希望你已经在 frameworks Podfile 中指定了 Firebase pod。否则它不会建立。
    • 是的。我在自定义框架的 pod 文件中添加了 FirebaseCore。但是当我尝试导入 firebase 时会引发错误。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2014-11-17
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2015-08-26
    相关资源
    最近更新 更多