为什么在 CocoaPods 中要使用 use_frameworks!?

163

我在 CocoaPods 的 Podfile 中多次使用了 use_frameworks!。我只是想知道为什么我们要使用它?我找不到简单明了的答案。

示例:

platform :ios, '8.0'
use_frameworks!

target "CityWhether" do
    pod 'Alamofire'
    pod 'SwiftyJSON'
end

1
你的意思是在 use_frameworks! 后面加上感叹号吗?我一直对此感到困惑,因为感叹号表示“不”。 - Gabriel Jensen
结尾处的感叹号通常表示该操作具有副作用。那么结尾处的感叹号是否意味着相反的含义? - tar
5个回答

185
use_frameworks! 告诉 CocoaPods 你想使用框架(Frameworks)而不是静态库(Static Libraries),因为 Swift 不支持静态库,所以必须使用框架。
在另一个回答中,我解释了静态库和框架之间的区别:

Cocoa Touch 框架

它们始终是开源的,并且将像您的应用程序一样被构建。(所以当您运行应用程序时,Xcode有时会编译它,在您清理项目后始终编译。) 框架仅支持 iOS 8 及更高版本,但可以在框架中使用 Swift 和 Objective-C。

Cocoa Touch 静态库

如名称所示,它们是静态的。所以当您将它们导入到项目中时,它们已经被编译过了。您可以与他人共享它们而不显示您的代码。请注意,当前静态库不支持 Swift。您将不得不在库中使用 Objective-C。应用程序本身仍然可以使用 Swift 编写。

来源:我的另一个回答 | AddThis.com 博客

3
发布说明有详细的故事,请查看 https://blog.cocoapods.org/CocoaPods-0.36/ - Jaime Agudo
10
自 Xcode 9 beta 4 起,静态库已支持 Swift。 CocoaPods 正在更新以支持此功能,请参见 https://github.com/CocoaPods/CocoaPods/issues/6899。 - JosephH
简短而清晰的描述:排序。这真的很有帮助。 - Piyush
我很困惑。考虑到无法更改有符号二进制文件,是否允许下载动态框架?如果不允许,那么 use_frameworks 或一般的动态框架有什么用途?如果它们是允许的,那么如何绕过限制以不更改已签名的二进制文件? - mfaani
官方的CocoaPods文档确认了这个选项确保使用框架而不是静态库。同时,请不要认为这意味着那些框架总是动态的(动态链接)。自CocoaPods 1.9.0以来,您可以指定链接样式(例如use_frameworks! :linkage => :static):https://guides.cocoapods.org/syntax/podfile.html#use_frameworks_bang - Legonaftik

91

use_frameworks!命令告诉CocoaPods使用动态库,由于Swift不支持静态库,因此这一命令曾经非常流行,并且在某些情况下没有选择权-但是你通常 不需要 再使用use_frameworks! 了。

自Xcode 9 beta 4和CocoaPods 1.5.0发布以来,现在支持Swift静态库。其主要优点是更快的应用程序启动时间,特别是当您有很多Pods时-如果您有许多dylibs,则iOS 10和11并不是最快的。

CocoaPods 1.5.0于2018年4月初发布,因此您可能需要升级才能使用它:sudo gem install cocoapods

我发现有几个Pods与静态库尚不兼容,所以您的效果可能会有所不同。


2
我做了那个,然后遇到了相同的“没有这个模块”的错误。那是那些CocoaPods的问题吗? - Alper
3
我不得不在我的Podfile中添加use_modular_headers!,以便使它与可能需要但自己没有启用的pod一起正常工作。 - Adrian
4
“主要优点是更快的应用程序启动时间。”这似乎与苹果的动态库文档相矛盾——该文档也声称dll的好处在于:“在启动之后,尽可能减少其使用的内存可以使应用程序启动更快。” 这里的含义是,如果在启动时不需要使用库,或者该库是常用库并已加载到内存中,则dll会导致更快的启动时间吗? - TolkienWASP
3
@TolkienWASP,这个页面似乎是关于macOS而不是iOS的。但是,如果DLL直到启动后才被加载,那么dll将会是一个胜利者。可惜在我看到的情况下,在iOS中所有的DLL都在应用程序完成启动之前加载,所以这使得事情变慢了。有至少一次WWDC演讲涉及优化iOS应用程序启动时间的主题,它明确提到要确保您没有超过3或4个DLL。 - JosephH
1
我认为这就是上面提到的视频: https://developer.apple.com/videos/play/wwdc2016/406/ 我建议您使用DYLD_PRINT_STATISTICS环境变量来测量您的应用程序启动速度,并查看哪种方式最适合您。 - iMacHumphries

5

use_frameworks!表示您想使用动态框架,而不是静态库

Xcode 9.0和CocoaPods 1.5.0已发布,如果您不使用use_frameworks!,则可以使用Swift和静态库。

use_frameworks!的一个问题是,Pods / Products中的所有框架都是框架。

这是一篇相关文章:iOS上静态和动态框架的基本概述


6
抱歉,这句话的语法有误,无法理解其含义。请提供更多上下文或者修正语法错误。 - Alex Zavatone
4
你提供的链接文章很棒。我建议每个人都去看看。 - mfaani

3

Cocoapods use_frameworks

Cocoapods[关于] use_frameworks! 负责二进制类型:

  • 如果 use_frameworks! 存在 - 动态框架
  • 如果 use_frameworks! 不存在 - 静态库

use_frameworks!Pods 项目的对应目标中,Mach-O 类型[关于] 有所反映。

时间线:

  1. CocoaPods 0.36引入了use_frameworks!,你必须用它来使用Swift pod
  2. CocoaPods 1.5.0和Xcode 9允许你有选择

[词汇]


0

添加

use_frameworks!

在Podfile中使用意味着我们希望列出的框架被动态安装,而不是作为静态框架。


谢谢您的回复,但请提供更多有关动态安装和静态安装的详细信息。 - BuffK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接