我可以在创建Cocoa Touch Framework时使用CocoaPod吗?

bne*_*neu 46 cocoa cocoa-touch ios cocoapods swift

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

File > New > Project > Framework & Library > Cocoa Touch Framework
Run Code Online (Sandbox Code Playgroud)

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

pod init
Run Code Online (Sandbox Code Playgroud)

在这个项目目录下.在新创建的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'
Run Code Online (Sandbox Code Playgroud)

再次,在终端我执行:

pod install
Run Code Online (Sandbox Code Playgroud)

并开始编码.

在单视图项目中使用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
Run Code Online (Sandbox Code Playgroud)

我认为Cocoa Touch Framework项目本身就是动态的,因此会包含所有依赖项.

任何人都可以告诉我为什么会发生这种情况以及我如何能够解决这个问题?这是CocoaPods的问题还是我错过了什么?

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

谢谢!

Dal*_*rds 28

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

我们并不真正支持将Pods整合到框架目标中......
- neonichu于2015年11月4日

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


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

正确的方法是为您的框架创建一个新的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
Run Code Online (Sandbox Code Playgroud)

  • 这样做的原因是你所建立的框架很高兴,因为它的依赖项嵌入在应用程序中(只是链接它们,它们是由应用程序嵌入的).Apple似乎非常挑剔地包含框架 - 应该添加它们的唯一地方就是应用程序.这是为了避免许多不同的框架添加可能导致破坏的不同版本的框架.我只需要提一下"java classpath"来给出另一个极端的图片.所以是的,在框架中使用框架非常困难,但可以使用所谓的伞形头来完成. (2认同)