为啥我们使用 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!在一个反应​​原生项目上

iOS 中的 use_framework 错误

Swift 桥接头文件不适用于 use_frameworks

没有 use_frameworks 就无法安装 Swift cocoapod!找不到模块 swift.h 文件

Podfile 中的 use_frameworks 问题

RestKit 编译失败,cocoapods use_frameworks for swift