Warum verwenden wir use_frameworks in CocoaPods?

104

Ich habe use_frameworksin CocoaPods Podfileviele Male verwendet. Ich frage mich nur, warum wir es verwenden? Ich konnte die direkte Antwort nicht bekommen.

Beispiel:

platform :ios, '8.0'
use_frameworks!

target "CityWhether" do
    pod 'Alamofire'
    pod 'SwiftyJSON'
end
Harikrista
quelle
1
Meinen Sie use_frameworks! MIT dem Ausrufezeichen? Ich war seitdem immer verwirrt darüber! bedeutet NICHT.
Gabriel Jensen

Antworten:

119

use_frameworksteilt CocoaPods mit, dass Sie Frameworks anstelle von statischen Bibliotheken verwenden möchten. Da Swift keine statischen Bibliotheken unterstützt, müssen Sie Frameworks verwenden.


In einer anderen Antwort erklärte ich die Unterschiede zwischen statischen Bibliotheken und Frameworks:

Cocoa Touch Frameworks

Sie sind immer Open Source und werden genau wie Ihre App erstellt. (Xcode kompiliert es daher manchmal, wenn Sie Ihre App ausführen und immer, nachdem Sie das Projekt bereinigt haben.) Frameworks unterstützen nur iOS 8 und höher, Sie können jedoch Swift und Objective-C im Framework verwenden.

Statische Cocoa Touch-Bibliotheken

Wie der Name schon sagt, sind sie statisch. Sie sind also bereits kompiliert, wenn Sie sie in Ihr Projekt importieren. Sie können sie mit anderen teilen, ohne ihnen Ihren Code zu zeigen. Beachten Sie, dass statische Bibliotheken Swift derzeit nicht unterstützen. Sie müssen Objective-C in der Bibliothek verwenden. Die App selbst kann weiterhin in Swift geschrieben werden.

Quellen: Meine andere Antwort | AddThis.com Blog

FelixSFD
quelle
3
Lange Geschichte auf den Versionshinweisen blog.cocoapods.org/CocoaPods-0.36
Jaime Agudo
7
Statische Bibliotheken unterstützen jetzt schnell ab Xcode 9 Beta 4 - CocoaPods wird aktualisiert, um dies zu unterstützen, siehe github.com/CocoaPods/CocoaPods/issues/6899
JosephH
Sortieren und süße Beschreibung. Es ist wirklich hilfreich
Piyush
76

use_frameworks!weist Kakaofrüchte an, dynamische Bibliotheken zu verwenden, und war zu einem bestimmten Zeitpunkt sehr verbreitet, insbesondere weil schnelle statische Bibliotheken nicht unterstützt wurden, was bedeutet, dass es keine andere Wahl gab - Sie benötigen diese jedoch häufig nichtuse_frameworks! mehr.

Ab Xcode 9 Beta 4 und CocoaPods 1.5.0 werden jetzt schnelle statische Bibliotheken unterstützt. Der Hauptvorteil sind schnellere App-Startzeiten, insbesondere wenn Sie viele Pods haben - iOS 10 und 11 sind nicht die schnellsten, wenn Sie viele Dylibs haben.

CocoaPods 1.5.0 wurde Anfang April 2018 veröffentlicht , daher müssen Sie möglicherweise ein Upgrade durchführen, um es zu erhalten : sudo gem install cocoapods.

Ich habe mehrere Pods gefunden, die mit statischen Bibliotheken noch nicht richtig funktionieren, sodass Ihr Kilometerstand variieren kann.

JosephH
quelle
2
Ich habe das gemacht und bin dann auf die gleichen No such moduleFehler gestoßen. Ist das ein Problem bei diesen Cocoapods?
Alper
3
Ich musste use_modular_headers!mein Podfile hinzufügen , damit es mit Pods funktioniert, die es vermutlich benötigen, es aber noch nicht selbst aktivieren.
Adrian
4
@JosephH "Der Hauptvorteil sind schnellere App-Startzeiten". Dies scheint im Widerspruch zu Apples Dynamic Library-Dokumentation zu stehen , die den gleichen Anspruch an DLLs erhebt: "Durch die Minimierung des Speicherbedarfs nach dem Start wird die App schneller gestartet." Bedeutet dies, dass DLLs zu schnelleren Startzeiten führen, wenn die verwendete Bibliothek zum Startzeitpunkt nicht benötigt wird, oder handelt es sich um eine beliebte Bibliothek, die bereits in den Speicher geladen ist?
TolkienWASP
3
@ TolkienWASP Auf dieser Seite geht es anscheinend eher um MacOS als um iOS. Aber ja, wenn die DLL erst nach dem Start geladen wird, wäre die DLL ein Gewinn. Leider werden im iOS-Fall in den Situationen, in denen ich gesehen habe, alle DLLs geladen, bevor die App gestartet wird, was die Dinge langsamer macht. Es gibt mindestens einen WWDC-Vortrag zum Thema Optimierung der Startzeiten von iOS-Apps, in dem ausdrücklich erwähnt wird, dass Sie nicht mehr als 3 oder 4 DLLs haben.
JosephH
1
Ich denke, dies ist das Video, auf das oben verwiesen wird: developer.apple.com/videos/play/wwdc2016/406 Ich möchte Sie dazu ermutigen, die Umgebungsvariable DYLD_PRINT_STATISTICS zu verwenden, um die Startgeschwindigkeit Ihrer App zu messen und herauszufinden, was für Sie am besten ist.
iMacHumphries
2

use_frameworkserklärt, dass Sie dynamische Frameworks anstelle von statischen Bibliotheken verwenden möchten .

Mit Xcode 9.0 und CocoaPods 1.5.0 können Sie statische Bibliotheken mit Swift verwenden, wenn Sie diese nicht verwenden use_frameworks.

Ein Problem dabei use_frameworksist, dass alle Ihre Frameworks in Pods / Produkten Frameworks sind.

Hier ist ein verwandter Artikel: Grundlegende Übersicht über statische und dynamische Frameworks auf ios

Mistdon
quelle
4
> One performance with use_frameworks is that all your framework in Pods/Products is frameworks. Eine Aufführung was?
Alex Zavatone
2

Cocoapods [About] use_frameworks! ist für den Typ der Binärdatei verantwortlich:

  • wenn use_frameworks!ist vorhanden -dynamic framework
  • wenn use_frameworks!ist nicht vorhanden -static library

use_frameworks!hat eine Reflexion in Mach-O Type[Über] in einem entsprechenden PodsProjektziel.

Zeitleiste:

  1. Es wurden CocoaPods 0.36 eingeführt, use_frameworks!die Sie für den Swift-Pod verwenden mussten
  2. Mit CocoaPods 1.5.0 und Xcode 9 hatten Sie die Wahl

[Wortschatz]

yoAlex5
quelle
-1

Hinzufügen

use_frameworks!

im Podfile bedeutet, dass die aufgelisteten Frameworks stattdessen dynamisch als statische Frameworks installiert werden sollen.

Chiara
quelle
Vielen Dank, aber bitte geben Sie weitere Details zur dynamischen Installation im Vergleich zur statischen Installation an.
BuffK