Maybaygiare.org

Blog Network

CocoaPods Tutorial für Swift: Erste Schritte

Update Hinweis: Rony Rozen hat dieses Tutorial für Xcode 11 und Swift 5 aktualisiert. Joshua Greene schrieb das Original.

CocoaPods ist ein beliebter Abhängigkeitsmanager für Swift- und Objective-C-Cocoa-Projekte. Tausende von Bibliotheken und Millionen von Apps verwenden es laut der CocoaPods-Website. Aber was ist ein Abhängigkeitsmanager und warum brauchen Sie einen?

Ein Abhängigkeitsmanager erleichtert das Hinzufügen, Entfernen, Aktualisieren und Verwalten der von Ihrer App verwendeten Abhängigkeiten von Drittanbietern.

Anstatt beispielsweise Ihre eigene Netzwerkbibliothek neu zu erfinden, können Sie Alamofire mithilfe eines Abhängigkeitsmanagers einfach abrufen. Sie können entweder die genaue zu verwendende Version oder eine Reihe akzeptabler Versionen angeben.

Selbst wenn Alamofire ein Update mit Änderungen erhält, die nicht abwärtskompatibel sind, kann Ihre App die ältere Version weiterhin verwenden, bis Sie bereit sind, sie zu aktualisieren.

In diesem Tutorial erfahren Sie, wie Sie CocoaPods mit Swift verwenden. Insbesondere werden Sie:

  • CocoaPods installieren.
  • Arbeiten Sie mit einer funktionalen Demo-App, mit der Sie über Eiscreme nachdenken können.
  • Verwenden Sie CocoaPods, um Netzwerke hinzuzufügen.
  • Erfahren Sie mehr über semantische Versionierung.
  • Fügen Sie eine weitere Bibliothek mit einer flexiblen Version hinzu.Hinweis: Dieses CocoaPods-Tutorial erfordert grundlegende Kenntnisse mit iOS und der schnellen Entwicklung. Wenn Sie iOS und / oder Swift noch nicht kennen, lesen Sie bitte einige der anderen schriftlichen und / oder Video-Tutorials auf dieser Website, bevor Sie dieses Tutorial ausführen. Oder tauchen Sie ein in unser Buch iOS Apprentice.

    Dieses Tutorial enthält auch Klassen, die Core Graphics verwenden. Kenntnisse in Core Graphics sind zwar von Vorteil, jedoch nicht erforderlich. Wenn Sie mehr erfahren möchten, lesen Sie unsere Modern Core Graphics With Swift Serie.

    Erste Schritte

    Laden Sie das Starter-Projekt herunter, indem Sie oben oder unten im Tutorial auf die Schaltfläche Materialien herunterladen klicken.

    In diesem Tutorial arbeiten Sie mit einer App namens Ice Cream Shop, Inc. Sie verwenden CocoaPods, um der App auf einfache Weise Abhängigkeiten hinzuzufügen, anstatt Ihre eigenen zu schreiben.

    Bevor Sie mit diesem Tutorial fortfahren können, müssen Sie CocoaPods installieren. Glücklicherweise verwendet CocoaPods Ruby, das mit allen Versionen von macOS X seit Version 10.7 ausgeliefert wird.

    Öffnen Sie das Terminal und geben Sie den folgenden Befehl ein:

    sudo gem install cocoapods

    Geben Sie Ihr Passwort ein, wenn Sie dazu aufgefordert werden. Die Terminalausgabe zeigt verschiedene Ausgaben zum Abrufen, Installieren und Dokumentieren an, die mit „XX gems installed“ abgeschlossen werden.

    Hinweis: Sie müssen sudo verwenden, um CocoaPods zu installieren.

    Geben Sie schließlich diesen Befehl in das Terminal ein, um das Setup abzuschließen:

    pod setup --verbose

    Dieser Vorgang dauert einige Minuten, da das Repository der CocoaPods-Masterspezifikationen in ~/ geklont wird.cocoapods/ auf Ihrem Computer.

    Die Option verbose protokolliert den Fortschritt während des Prozesses, sodass Sie den Prozess beobachten können, anstatt einen scheinbar „eingefrorenen“ Bildschirm zu sehen.

    Super, Sie sind jetzt für die Verwendung von CocoaPods eingerichtet!

    Eisdiele, Inc.

    Ihr Top-Kunde ist Ice Cream Shop, Inc. Ihr Eis ist so beliebt, dass sie nicht mit Kundenaufträgen an der Theke Schritt halten können. Sie haben Sie rekrutiert, um eine schlanke iOS-App zu erstellen, mit der Kunden Eis direkt von ihren iPhones aus bestellen können.

    Sie haben mit der Entwicklung der App begonnen und es kommt gut voran. Sehen Sie sich Ihren Fortschritt an, indem Sie IceCreamShop öffnen.xcodeproj, dann erstellen und ausführen. Sie werden eine köstliche Vanilleeistüte sehen:

    Ice Cream Shop, Inc.'s Startseite's start page

    Der Benutzer sollte in der Lage sein, einen Eisgeschmack von diesem Bildschirm zu wählen, aber das ist noch nicht möglich. Ihr erster Schritt besteht darin, die Implementierung dieser Funktionalität abzuschließen.

    Öffnen Sie Main.storyboard aus der Gruppe Ansichten/Storyboards & Nibs, um das Layout der App anzuzeigen. Hier ist ein kurzer Überblick über das Herzstück der App, die Choose Your Flavor-Szene:

    Komponenten der Choose Your Flavor-Szene

    • PickFlavorViewController ist der View Controller für diese Szene. Es übernimmt die Benutzerinteraktion und stellt die Daten für die Sammlungsansicht bereit, in der die verschiedenen Eissorten angezeigt werden.
    • IceCreamView ist eine benutzerdefinierte Ansicht, die eine Eistüte basierend auf dem Backing-Modus anzeigt, Flavor.
    • ScoopCell ist eine benutzerdefinierte Sammlungsansichtszelle, die ein ScoopView enthält, das Farben von einem Flavor Modell erhält.

    Während jede Eisdiele, Inc. jeder Ort hat charakteristische Aromen gemeinsam, jeder trägt auch seine eigenen lokalen Aromen. Aus diesem Grund muss ein Webdienst die Daten für die Flavors bereitstellen.

    Dies erklärt jedoch immer noch nicht, warum Benutzer ihre Eissorten nicht auswählen können.

    Öffnen Sie PickFlavorViewController.swift, gefunden unter der Gruppe Controller, und Sie werden eine Stubbed-Methode sehen:

    private func loadFlavors() { // TO-DO: Implement this}

    Aha, es gibt keine Geschmacksrichtungen! Sie müssen die Funktion implementieren!

    Während Sie URLSession und Ihre eigenen Netzwerkklassen schreiben können, gibt es einen einfacheren Weg: Verwenden Sie Alamofire!

    Sie könnten versucht sein, diese Bibliothek herunterzuladen und die Quelldateien direkt in Ihr Projekt zu ziehen. Das würde es jedoch auf die harte Tour machen. CocoaPods bietet eine viel elegantere und flinkere Lösung.

    Installieren der ersten Abhängigkeit

    Der erste Schritt besteht darin, Xcode zu schließen. Ja, du hast richtig gelesen.

    Es ist Zeit, das Podfile zu erstellen, in dem Sie die Abhängigkeiten Ihres Projekts definieren.

    Öffnen Sie Terminal und navigieren Sie mit dem Befehl cd zu dem Verzeichnis, das Ihr IceCreamShop-Projekt enthält:

    cd ~/Path/To/Folder/Containing/IceCreamShop

    Geben Sie als nächstes den folgenden Befehl ein:

    pod init

    Dadurch wird eine Poddatei für Ihr Projekt erstellt.

    Geben Sie schließlich den folgenden Befehl ein, um die Poddatei mit Xcode zum Bearbeiten zu öffnen:

    open -a Xcode Podfile
    Hinweis: Verwenden Sie TextEdit nicht zum Bearbeiten der Poddatei, da es Standardzitate durch grafisch ansprechendere Anführungszeichen ersetzt. Dies kann dazu führen, dass CocoaPods verwirrt werden und Fehler auslösen. Verwenden Sie stattdessen Xcode oder einen anderen Programmiertexteditor, um Ihre Poddatei zu bearbeiten.

    Das Standard-Podfile sieht folgendermaßen aus:

    # Uncomment the next line to define a global platform for your project# platform :ios, '9.0'target 'IceCreamShop' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for IceCreamShopend

    Löschen Sie die # und Leerzeichen vor platform, dann löschen Sie die anderen Zeilen beginnend mit #.

    Ihre Poddatei sollte jetzt folgendermaßen aussehen:

    platform :ios, '9.0'target 'IceCreamShop' do use_frameworks!end

    Dies teilt CocoaPods mit, dass Ihr Projekt auf iOS 9.0 abzielt und Frameworks anstelle statischer Bibliotheken verwendet. Während Swift und CocoaPods beide statische Verknüpfungen unterstützen, tun dies nicht alle von Ihnen enthaltenen Bibliotheken. Einer von ihnen, die Sie in diesem Projekt verwenden werden, nicht.

    Wenn Sie nur in Swift programmiert haben, kann dies etwas seltsam aussehen. Das liegt daran, dass das Podfile tatsächlich in Ruby geschrieben ist. Sie müssen Ruby nicht kennen, um CocoaPods zu verwenden, aber Sie sollten sich bewusst sein, dass selbst geringfügige Textfehler dazu führen, dass CocoaPods Fehler auslösen.

    Ein Wort zu Bibliotheken

    Sie werden sehen, dass der Begriff Bibliothek oft als allgemeiner Begriff verwendet wird, der eigentlich eine Bibliothek oder ein Framework bedeutet. Dieses Tutorial ist schuldig, diese Wörter auch beiläufig zu vermischen.

    Sie wundern sich vielleicht über die Unterschiede zwischen einer Bibliothek, einem Framework und einem CocoaPod. Es ist in Ordnung, wenn Sie die Terminologie etwas verwirrend finden!

    Ein CocoaPod oder kurz Pod ist ein allgemeiner Begriff für eine Bibliothek oder ein Framework, das Ihrem Projekt mithilfe von CocoaPods hinzugefügt wird.

    iOS 8 hat dynamische Frameworks eingeführt, mit denen Sie Code, Bilder und andere Assets bündeln können. Vor iOS 8 haben Sie CocoaPods als „fette“ statische Bibliotheken erstellt. „Fat“ bedeutet, dass sie mehrere Code-Befehlssätze enthielten, wie i386 für den Simulator, armv7 für Geräte usw. Swift erlaubt jedoch nicht, dass statische Bibliotheken Ressourcen wie Bilder oder Assets enthalten.

    Zurück zur Installation Ihrer ersten Abhängigkeit

    Es ist endlich Zeit, Ihre erste Abhängigkeit mit CocoaPods hinzuzufügen. Fügen Sie Ihrer Poddatei direkt nach use_frameworks! Folgendes hinzu:

    pod 'Alamofire', '4.9.1'

    Dies teilt CocoaPods mit, dass Sie Alamofire Version 4.9.1 als Abhängigkeit für Ihr Projekt einfügen möchten.

    Speichern und schließen Sie das Podfile.

    Sie müssen nun CocoaPods anweisen, die Abhängigkeiten für Ihr Projekt zu installieren.

    Geben Sie den folgenden Befehl in Terminal ein, nachdem Sie sichergestellt haben, dass Sie sich noch in dem Verzeichnis befinden, das das IceCreamShop-Projekt und die Poddatei enthält:

    pod install

    Sie sollten die Ausgabe wie folgt sehen:

    Analyzing dependenciesAdding spec repo `trunk` with CDN `https://cdn.cocoapods.org/`Downloading dependenciesInstalling Alamofire (4.9.1)Generating Pods projectIntegrating client project Please close any current Xcode sessions and use `IceCreamShop.xcworkspace` for this project from now on.Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

    Öffnen Sie den Projektordner mit dem Finder und Sie werden sehen, dass CocoaPods einen neuen IceCreamShop erstellt hat.xcworkspace-Datei und einen Pods-Ordner zum Speichern aller Abhängigkeiten des Projekts.

    Hinweis: Von nun an müssen Sie, wie in der Befehlszeilenwarnung erwähnt, das Projekt immer mit dem öffnen .xcworkspace-Datei und nicht die .xcodeproj. Andernfalls treten Build-Fehler auf.

    Ausgezeichnet! Sie haben gerade Ihre erste Abhängigkeit mit CocoaPods hinzugefügt!

    Installierte Pods verwenden

    Jetzt verwenden Sie Ihre brandneue Abhängigkeit Alamofire.

    Wenn das Xcode-Projekt geöffnet ist, schließen Sie es jetzt und öffnen Sie IceCreamShop.xcworkspace.

    Öffnen Sie PickFlavorViewController.swift und fügen Sie Folgendes direkt unter dem vorhandenen Import hinzu:

    import Alamofire

    Erstellen und ausführen. Sie werden noch keine Änderung sehen, aber seien Sie versichert, dass Alamofire jetzt verfügbar ist.

    Erste Kompilierung nach Integration der Alamofire-Abhängigkeit

    Ersetzen Sie als nächstes loadFlavors() durch Folgendes:

     private func loadFlavors() { // 1 Alamofire.request( "https://www.raywenderlich.com/downloads/Flavors.plist", method: .get, encoding: PropertyListEncoding(format: .xml, options: 0)) .responsePropertyList { response in // 2 guard let self = self else { return } // 3 guard response.result.isSuccess, let dictionaryArray = response.result.value as? ] else { return } // 4 self.flavors = self.flavorFactory.flavors(from: dictionaryArray) // 5 self.collectionView.reloadData() self.selectFirstFlavor() } }

    Hier ist das Play-by-Play, was in diesem Code passiert:

    1. Sie verwenden Alamofire, um eine GET-Anfrage zu erstellen und eine Liste mit Eissorten herunterzuladen.
    2. Um einen starken Referenzzyklus zu unterbrechen, verwenden Sie eine schwache Referenz auf self im Antwortvervollständigungsblock. Sobald der Block ausgeführt wird, erhalten Sie sofort einen starken Verweis auf self damit Sie später Eigenschaften festlegen können.
    3. Als nächstes überprüfen Sie, ob response.result erfolgreich ist und response.result.value ein Array von Wörterbüchern ist.
    4. Jetzt setzen Sie self.flavors auf ein Array von Flavor Objekten, die FlavorFactory erstellt. Dies ist eine Klasse, die ein „Kollege“ für Sie geschrieben hat (gerne geschehen!), die ein Array von Wörterbüchern verwendet, um Instanzen von Flavor .
    5. Schließlich laden Sie die Sammlungsansicht neu und wählen den ersten Geschmack aus.

    Erstellen und ausführen. Sie können jetzt einen Eisgeschmack wählen!

    Geschmack auswählen

    Jetzt für ein leckeres Topping

    Die App sieht gut aus, aber Sie können sie noch verbessern.

    Haben Sie bemerkt, dass die App eine Sekunde braucht, um die Pdf-Datei herunterzuladen? Wenn Sie über eine schnelle Internetverbindung verfügen, bemerken Sie die Verzögerung möglicherweise nicht, aber Ihre Kunden haben nicht immer so viel Glück.

    Der nächste Schritt besteht darin, eine Ladeanzeige in Ihrer App anzuzeigen, damit Kunden verstehen, dass Daten geladen werden und nicht nur die Bibliotheken. MBProgressHUD ist ein wirklich schöner Indikator, der hier gut funktionieren wird. Und es unterstützt CocoaPods; was für ein Zufall! :]

    Um diesen Pod zu verwenden, müssen Sie ihn zu Ihrer Poddatei hinzufügen. Anstatt die Poddatei über die Befehlszeile zu öffnen, finden Sie sie jetzt im Pods-Ziel im Arbeitsbereich:

    Pods im Arbeitsbereich

    Öffnen Sie Podfile und fügen Sie direkt nach der Alamofire-Zeile Folgendes hinzu:

    pod 'MBProgressHUD', '~> 1.0'

    Speichern Sie die Datei und installieren Sie die Abhängigkeiten wie zuvor über pod install in Terminal.

    Haben Sie dieses Mal etwas anderes bemerkt? Ja, Sie haben die Versionsnummer als ~> 1.0 angegeben. Aber warum?

    CocoaPods empfiehlt, dass alle Pods Semantische Versionierung verwenden. Nimm dir einen Moment Zeit, um zu verstehen, was das ist.

    Semantische Versionierung

    Oft sehen Sie eine Version, die so geschrieben ist: 1.0.0. Diese drei Nummern sind Major-, Minor- und Patch-Versionsnummern.

    Für die Versionsnummer 1.0.0 ist beispielsweise 1 die Hauptnummer, die erste 0 die Nebennummer und die zweite 0 die Patchnummer.

    Semantic Versioning Example

    Wenn die Major-Nummer zunimmt, zeigt dies an, dass die Version nicht abwärtskompatible Änderungen enthält. Wenn Sie einen Pod auf die nächste Hauptversion aktualisieren, müssen Sie möglicherweise Buildfehler beheben, oder der Pod verhält sich möglicherweise anders als zuvor.

    Wenn die kleinere Anzahl zunimmt, bedeutet dies, dass die Version neue Funktionen enthält, die abwärtskompatibel sind. Wenn Sie sich für ein Upgrade entscheiden, benötigen Sie möglicherweise die neue Funktionalität, aber sie sollte keine Buildfehler verursachen oder das vorhandene Verhalten ändern.

    Wenn die Anzahl der Patches steigt, bedeutet dies, dass die neue Version Fehlerbehebungen, aber keine neuen Funktionen oder Verhaltensänderungen enthält. Im Allgemeinen möchten Sie Patch-Versionen immer so schnell wie möglich aktualisieren, um die neueste stabile Version des Pods zu erhalten.

    Wenn Sie schließlich die Nummer höchster Ordnung – Major, dann Minor und dann Patch — gemäß den obigen Regeln erhöhen, müssen Sie alle Nummern niedrigerer Ordnung auf Null zurücksetzen.

    Hier ein Beispiel:

    Betrachten Sie einen Pod mit der aktuellen Versionsnummer 1.2.3.

    Wenn Sie Änderungen vornehmen, die nicht abwärtskompatibel sind, keine neuen Funktionen haben, aber vorhandene Fehler beheben, geben Sie Version 2.0.0 an.

    Herausforderungszeit

    Wenn ein Pod eine aktuelle Version von 2.4 hat.6 wenn Sie Änderungen vornehmen, die Fehler beheben und abwärtskompatible Funktionen hinzufügen, wie sollte die neue Versionsnummer lauten?

    Antwort: 2.5.0
    Erklärung: Wenn Sie Änderungen vornehmen, die neue Funktionen enthalten, die abwärtskompatibel sind, erhöhen Sie die Minor-Nummer und setzen den Patch auf Null zurück.

    Wenn ein Pod eine aktuelle Version von 3.5.8 hat und Sie Änderungen an vorhandenen Funktionen vornehmen, die nicht abwärtskompatibel sind, wie sollte die neue Versionsnummer lauten?

    Antwort: 4.0.0
    Erklärung: Wenn Änderungen das vorhandene Verhalten ändern und nicht abwärtskompatibel sind, müssen Sie die Hauptnummer erhöhen und die Neben- und Patchnummern auf Null zurücksetzen.

    Wenn ein Pod eine aktuelle Version von 10.20.30 hat und Sie nur Fehler beheben, wie sollte die neue Versionsnummer lauten?

    Antwort: 10.20.31
    Erklärung: Wenn Sie nur Fehler beheben, erhöhen Sie nur die Patch-Nummer.

    Trotzdem gibt es eine Ausnahme von diesen Regeln:

    Wenn die Versionsnummer eines Pods kleiner als 1.0.0 ist, wird er als Beta-Version betrachtet. Geringfügige Zahlenerhöhungen können Änderungen beinhalten, die nicht abwärtskompatibel sind.

    Also zurück zu MBProgressHUB: Die Verwendung von ~> 1.0 bedeutet, dass Sie die neueste Version installieren sollten, die größer oder gleich 1.0 aber kleiner als 2.0 ist.Dies stellt sicher, dass Sie die neuesten Fehlerbehebungen und Funktionen erhalten, wenn Sie diesen Pod installieren, aber Sie werden nicht versehentlich abwärtsinkompatible Änderungen vornehmen.

    Es gibt mehrere andere Operatoren, die Sie ebenfalls verwenden können. Eine vollständige Liste finden Sie in der Podfile-Syntaxreferenz.

    Nachdem Sie gelernt haben, wie Operatoren mit Ihren CocoaPods arbeiten, ist es Zeit, Ihre App fertigzustellen.

    Fortschritt anzeigen

    Wenn Sie sich erinnern, haben Sie eine Fortschrittsanzeige erstellt, um Ihren Benutzern anzuzeigen, wann Flavors in der App geladen werden.

    Um diese Funktion zu beenden, gehen Sie zurück zu PickFlavorViewController.swift und fügen Sie direkt nach den anderen Importen Folgendes hinzu:

    import MBProgressHUD

    Fügen Sie als nächstes die folgenden Hilfsmethoden nach loadFlavors() hinzu:

    private func showLoadingHUD() { let hud = MBProgressHUD.showAdded(to: contentView, animated: true) hud.label.text = "Loading..."}private func hideLoadingHUD() { MBProgressHUD.hide(for: contentView, animated: true)}

    Fügen Sie nun in loadFlavors() wie angegeben):

     private func loadFlavors() { showLoadingHUD() // <-- Add this line Alamofire.request( "https://www.raywenderlich.com/downloads/Flavors.plist", method: .get, encoding: PropertyListEncoding(format: .xml, options: 0)) .responsePropertyList { response in guard let self = self else { return } self.hideLoadingHUD() // <-- Add this line // ...

    Wie die Methodennamen andeuten, showLoadingHUD() zeigt eine Instanz von MBProgressHUD während die GET-Anforderung heruntergeladen wird. hideLoadingHUD() blendet das HUD aus, wenn die Anforderung beendet ist. Da sich showLoadingHUD() außerhalb der Schließung befindet, wird das Präfix self nicht benötigt.

    Erstellen und ausführen. Sie sehen jetzt eine Ladeanzeige, während die Aromen geladen werden. Wenn Ihre Internetverbindung dafür zu schnell ist, können Sie kurz vor hideLoadingHUD() eine sleep(_:) -Anweisung hinzufügen, damit Sie die Güte von MBProgressHUD erleben können. :]

    App mit Ladesymbol

    Tolle Arbeit! Kunden können jetzt ihren bevorzugten Eiscreme-Geschmack auswählen und sehen eine Ladeanzeige, während Aromen heruntergeladen werden.

    Wohin von hier aus?

    Sie können das abgeschlossene Projekt über die Schaltfläche Materialien herunterladen oben oder unten auf dieser Seite herunterladen.

    Herzlichen Glückwunsch! Sie kennen jetzt die Grundlagen der Verwendung von CocoaPods, einschließlich des Erstellens und Änderns von Abhängigkeiten und des Verständnisses der semantischen Versionierung. Sie sind jetzt bereit, sie in Ihren eigenen Projekten zu verwenden!

    Mit CocoaPods können Sie noch viel mehr tun. Sie können auf der offiziellen CocoaPods-Website nach vorhandenen Pods suchen. Lesen Sie auch die CocoaPods-Anleitungen, um die feineren Details dieses hervorragenden Tools zu erfahren. Aber seien Sie gewarnt, sobald Sie anfangen, es zu benutzen, werden Sie sich fragen, wie Sie es jemals ohne es geschafft haben! :]

    Ich hoffe, Sie haben es genossen, dieses CocoaPods-Tutorial genauso zu lesen wie ich es geschrieben habe. Was sind einige Ihrer Lieblings-CocoaPods? Auf welche setzen Sie bei alltäglichen Projekten am meisten? Fühlen Sie sich frei zu teilen, oder Fragen zu stellen, in den Kommentaren unten!

    raywenderlich.com Wöchentlich

    Die raywenderlich.com newsletter ist der einfachste Weg, um über alles auf dem Laufenden zu bleiben, was Sie als mobiler Entwickler wissen müssen.

    Holen Sie sich einen wöchentlichen Überblick über unsere Tutorials und Kurse und erhalten Sie als Bonus einen kostenlosen ausführlichen E-Mail-Kurs!

    Durchschnittliche Bewertung

    4.8/5

    Bewertung für diesen Inhalt hinzufügen

    Zum Hinzufügen einer Bewertung anmelden

    33 Bewertungen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.