为啥我们使用 use_frameworks!在 CocoaPods 中?
Posted
技术标签:
【中文标题】为啥我们使用 use_frameworks!在 CocoaPods 中?【英文标题】:Why do we use use_frameworks! in CocoaPods?为什么我们使用 use_frameworks!在 CocoaPods 中? 【发布时间】:2017-05-03 18:37:58 【问题描述】:我在 CocoaPods 中使用了use_frameworks!
很多次Podfile
。我只是想知道我们为什么要使用它?我无法得到直截了当的答案。
例子:
platform :ios, '8.0'
use_frameworks!
target "CityWhether" do
pod 'Alamofire'
pod 'SwiftyJSON'
end
【问题讨论】:
你的意思是use_frameworks!带感叹号?从那以后我一直对此感到困惑!表示不是。 !最后往往意味着该动作有副作用。哪里有!到底是什么意思? 【参考方案1】:use_frameworks!
告诉 CocoaPods 你想使用框架而不是静态库。由于 Swift 不支持静态库,因此您必须使用框架。
在另一个答案中,我解释了静态库和框架之间的区别:
Cocoa 触控框架
它们始终是开源的,并且将像您的应用一样构建。 (所以 Xcode 有时会编译它,当你运行你的应用程序并且总是 清理项目后。)框架仅支持 iOS 8 和 较新,但您可以在框架中使用 Swift 和 Objective-C。
Cocoa Touch 静态库
顾名思义,它们是静态的。所以他们已经编译了,当 您将它们导入您的项目。您可以与他人分享 没有向他们展示你的代码。请注意,目前静态库 不支持斯威夫特。您必须在 图书馆。应用程序本身仍然可以用 Swift 编写。
来源:My other answer | AddThis.com Blog
【讨论】:
关于发行说明的长篇大论blog.cocoapods.org/CocoaPods-0.36 静态库现在支持从 Xcode 9 beta 4 开始的 swift - CocoaPods 正在更新以支持此功能,请参阅 github.com/CocoaPods/CocoaPods/issues/6899 排序和甜美的描述。它真的很有帮助 我很困惑。鉴于您无法更改已签名的二进制文件,是否允许下载动态框架?如果不是,那么use_frameworks
或一般动态框架的用途是什么。如果它们被允许,那么你如何绕过限制集而不改变签名的二进制文件?【参考方案2】:
use_frameworks!
声明您要使用动态框架,而不是静态库。
随着 Xcode 9.0 和 CocoaPods 1.5.0 的发布,如果你不使用 use_frameworks!
,你可以使用 swift 的静态库。
use_frameworks!
的一个问题是您在 Pods/Products 中的所有框架都是框架。
这里有一篇相关文章:Basic overview of static and dynamic frameworks on ios
【讨论】:
>One performance with use_frameworks is that all your framework in Pods/Products is frameworks.
一场表演什么?
您链接的文章很棒。推荐大家去看看【参考方案3】:
use_frameworks!
告诉可可豆荚使用动态库,并且在某一时刻非常流行,特别是由于 swift 不支持静态库,这意味着别无选择 - 但是你经常不要需要use_frameworks!
了。
从 Xcode 9 beta 4 和 CocoaPods 1.5.0 开始,现在支持 swift 静态库。主要优势是更快的应用启动时间,尤其是在您有很多 pod 的情况下 - 当您有很多 dylib 时,iOS 10 和 11 并不是最快的。
CocoaPods 1.5.0 was released in early April 2018,因此您可能需要升级才能获得它:sudo gem install cocoapods
。
不过,我发现几个 pod 不能与静态库一起正常工作,所以你的情况可能会有所不同。
【讨论】:
我这样做了,然后我遇到了同样的No such module
错误。是那些 cocoapods 的问题吗?
我必须将 use_modular_headers!
添加到我的 Podfile 中,以使其与可能需要它但尚未自行启用它的 Pod 一起工作。
@JosephH “主要优势是更快的应用启动时间”。这似乎与 Apple's Dynamic Library documentation 相矛盾——后者对 dll 提出了同样的主张:“一旦启动,就将其内存使用降至最低,从而使应用程序启动更快”。如果在启动时不需要正在使用的库,或者它是一个流行的库,因此已经加载到内存中,那么这里是否暗示 dll 将导致更快的启动时间?
@TolkienWASP 该页面似乎是关于 macOS 而不是 iOS。但是,是的,如果 DLL 直到启动后才加载,那么 dll 将是一个胜利。可悲的是,在 iOS 案例中,我看到所有 DLL 在应用程序完成启动之前就已加载,因此这会使事情变慢。至少有一个关于优化 iOS 应用程序启动时间主题的 WWDC 演讲,其中明确提到了确保您没有超过 3 或 4 个 dll 的内容。
我认为这是上面引用的视频:developer.apple.com/videos/play/wwdc2016/406 我鼓励您使用 DYLD_PRINT_STATISTICS 环境变量来衡量您的应用启动速度,看看什么最适合您。【参考方案4】:
Cocoapod的[About]use_frameworks!
负责二进制的类型:
use_frameworks!
在场 - dynamic framework
如果use_frameworks!
不存在 - static library
use_frameworks!
在Pods
项目的相应目标中具有Mach-O Type
[About] 的反射。
时间线:
-
CocoaPods 0.36 介绍了
use_frameworks!
,您必须将其用于 Swift pod
CocoaPods 1.5.0 和 Xcode 9 让您可以选择
[Vocabulary]
【讨论】:
【参考方案5】:添加
使用_frameworks!
在 Podfile 中意味着我们希望将列出的框架作为静态框架动态安装。
【讨论】:
谢谢,但请提供有关动态安装与静态安装的更多详细信息。以上是关于为啥我们使用 use_frameworks!在 CocoaPods 中?的主要内容,如果未能解决你的问题,请参考以下文章
使用 use_frameworks!在一个反应原生项目上
Swift 桥接头文件不适用于 use_frameworks