Maybaygiare.org

Blog Network

CocoaPods handledning för Swift :komma igång

Uppdatering Obs: Rony Rozen uppdaterade denna handledning för Xcode 11 och Swift 5. Joshua Greene skrev originalet.

CocoaPods är en populär beroendehanterare för Swift-och Objective-C-Kakaoprojekt. Tusentals bibliotek och miljoner appar använder det, enligt CocoaPods webbplats. Men vad är en beroendehanterare och varför behöver du en?

en beroendehanterare gör det enkelt att lägga till, ta bort, uppdatera och hantera de beroenden från tredje part som din app använder.

till exempel, istället för att återuppfinna ditt eget nätverksbibliotek, kan du enkelt dra in Alamofire med en beroendehanterare. Du kan ange antingen den exakta versionen som ska användas eller en rad acceptabla versioner.

det betyder att även om Alamofire får en uppdatering med ändringar som inte är bakåtkompatibla, kan din app fortsätta använda den äldre versionen tills du är redo att uppdatera den.

i den här handledningen lär du dig hur du använder CocoaPods med Swift. Specifikt kommer du:

  • installera CocoaPods.
  • arbeta med en funktionell demo-app som får dig att tänka på glass.
  • använd CocoaPods för att lägga till nätverk.
  • lär dig mer om Semantisk versionshantering.
  • Lägg till ett annat bibliotek med en flexibel version.
Obs: Denna CocoaPods handledning kräver grundläggande förtrogenhet med iOS och snabb utveckling. Om du är helt ny på iOS och/eller Swift, Vänligen kolla in några av de andra skriftliga och / eller video tutorials på denna webbplats innan du gör denna handledning. Eller dyka in i vår bok, iOS Apprentice.

denna handledning innehåller också klasser som använder Kärngrafik. Även om kunskap om Kärngrafik är fördelaktig krävs det inte. Om du vill lära dig mer, Läs vår moderna Kärngrafik med Swift-serien.

komma igång

ladda ner startprojektet genom att klicka på knappen Hämta Material längst upp eller längst ner i handledningen.

under hela denna handledning arbetar du med en app som heter Ice Cream Shop, Inc. Du använder CocoaPods för att lägga till beroenden i appen på det enkla sättet, istället för att skriva din egen.

innan du kan fortsätta med denna handledning måste du installera CocoaPods. Lyckligtvis använder CocoaPods Ruby, som levereras med alla versioner av macOS X sedan version 10.7.

Öppna Terminal och ange följande kommando:

sudo gem install cocoapods

Ange ditt lösenord när du begär det. Terminalutgången visar olika hämtnings -, installations-och dokumentationsrelaterade utgångar och avslutas med ”XX gems installed”.

Obs: du måste använda sudo för att installera CocoaPods, men när den är installerad behöver du inte använda den igen i den här handledningen.

slutligen, ange detta kommando i Terminal för att slutföra installationen:

pod setup --verbose

denna process tar några minuter eftersom den klonar CocoaPods Master Specs repository till ~/.cocoapods / på din dator.

alternativetverbose loggar framsteg när processen körs, så att du kan titta på processen istället för att se en till synes ”frusen” skärm.

fantastiskt, du är nu inställd på att använda CocoaPods!

Ice Cream Shop, Inc.

din bästa kund är Ice Cream Shop, Inc. Deras Glass är så populär att de inte kan hålla jämna steg med kundorder vid disken. De har rekryterat dig för att skapa en snygg iOS-app som gör det möjligt för kunder att beställa glass direkt från sina iPhones.

Du har börjat utveckla appen och det kommer bra. Ta en titt på dina framsteg genom att öppna IceCreamShop.xcodeproj, sedan bygga och köra. Du kommer att se en aptitretande vaniljglasskotte:

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

användaren ska kunna välja en glass smak från den här skärmen, men det är inte möjligt ännu. Ditt första steg är att slutföra implementeringen av denna funktionalitet.

Öppna Huvud.storyboard från Views / Storyboards & Nibs grupp för att se appens layout. Här är en snabb översikt över appens hjärta, Välj din Smakscen:

komponenter i Välj din Smakscen

  • PickFlavorViewController är vykontrollen för den här scenen. Den hanterar användarinteraktion och ger data för insamlingsvyn som visar de olika glassmakerna.
  • IceCreamView är en anpassad vy som visar en glasskotte baserad på bakningsläget, Flavor.
  • ScoopCell är en anpassad samlingsvycell som innehåller en ScoopView, som får färger från en Flavor modell.

medan varje glassbutik, Inc. platsen har signatursmaker gemensamt, var och en bär också sina egna lokala smaker. Av denna anledning måste en webbtjänst tillhandahålla data för Flavors.

detta förklarar dock fortfarande inte varför användare inte kan välja sina glassmaker.

Öppna PickFlavorViewController.snabb, finns under gruppen Controllers, och du kommer att se en stubbed metod:

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

Aha, det finns inga smaker! Du måste implementera funktionen!

medan du kan använda URLSession och skriva egna nätverksklasser, finns det ett enklare sätt: Använd Alamofire!

Du kan bli frestad att ladda ner det här biblioteket och dra källfilerna direkt till ditt projekt. Men det skulle göra det på det svåra sättet. CocoaPods ger en mycket mer elegant och smidig lösning.

installera ditt första beroende

ditt första steg är att stänga Xcode. Ja, du läste rätt.

det är dags att skapa Podfilen, där du definierar projektets beroenden.

Öppna Terminal och navigera till katalogen som innehåller ditt IceCreamShop-projekt med kommandot cd:

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

ange sedan följande kommando:

pod init

detta skapar en Podfil för ditt projekt.

slutligen skriver du följande kommando för att öppna Podfilen med Xcode för redigering:

open -a Xcode Podfile
Obs: Använd inte TextEdit för att redigera Podfilen eftersom den ersätter standard citat med mer grafiskt tilltalande typeset citat. Detta kan orsaka att CocoaPods blir förvirrade och kastar fel. Använd istället Xcode eller en annan programmeringstextredigerare för att redigera din Podfile.

standard Podfilen ser ut så här:

# 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

Ta bort # och mellanslag före platform, ta sedan bort de andra raderna som börjar med #.

din Podfil ska nu se ut så här:

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

detta berättar CocoaPods dina projektmål iOS 9.0 och kommer att använda ramar istället för statiska bibliotek. Medan Swift och CocoaPods båda stöder statisk länkning, inte alla bibliotek du inkluderar gör. En av dem som du kommer att använda i det här projektet gör det inte.

om du bara har programmerat i Swift kan det se lite konstigt ut. Det beror på att Podfilen faktiskt är skriven i Ruby. Du behöver inte veta Ruby att använda CocoaPods, men du bör vara medveten om att även mindre textfel kommer att orsaka CocoaPods att kasta fel.

ett ord om Bibliotek

du ser termen bibliotek som ofta används som en allmän term som faktiskt betyder ett bibliotek eller ramverk. Denna handledning är skyldig till nonchalant blanda dessa ord, för.

Du kanske undrar om skillnaderna mellan ett bibliotek, ett ramverk och en CocoaPod. Det är OK om du tycker att terminologin är lite förvirrande!

en CocoaPod, eller pod för kort, är en allmän term för antingen ett bibliotek eller ramverk som läggs till i ditt projekt med CocoaPods.

iOS 8 introducerade dynamiska ramar, som låter dig kombinera kod, bilder och andra tillgångar tillsammans. Före iOS 8 skapade du CocoaPods som” feta ” statiska bibliotek. ”Fat” betyder att de innehöll flera kodinstruktionsuppsättningar, som i386 för simulatorn, armv7 för enheter etc. Swift tillåter dock inte att statiska bibliotek innehåller resurser som bilder eller resurser.

tillbaka till att installera ditt första beroende

det är äntligen dags att lägga till ditt första beroende med CocoaPods. Lägg till följande i din Podfile, direkt efter use_frameworks!:

pod 'Alamofire', '4.9.1'

detta berättar CocoaPods du vill inkludera Alamofire version 4.9.1 som ett beroende för ditt projekt.

spara och stäng Podfilen.

Du måste nu berätta för CocoaPods att installera beroenden för ditt projekt.

Ange följande kommando i Terminal, efter att du har kontrollerat att du fortfarande är i katalogen som innehåller IceCreamShop-projektet och Podfile:

pod install

Du bör se utdata så här:

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.

Öppna projektmappen med Finder så ser du CocoaPods skapade en ny IceCreamShop.xcworkspace-fil och en Pods-mapp för att lagra alla projektets beroenden.

OBS: från och med nu, som kommandoraden varning nämns, du måste alltid öppna projektet med .xcworkspace-fil och inte .xcodeproj. Annars kommer du att stöta på byggfel.

utmärkt! Du har just lagt till ditt första beroende med CocoaPods!

använda installerade Pods

Nu använder du ditt helt nya beroende, Alamofire.

om Xcode-projektet är öppet, stäng det nu och öppna IceCreamShop.xcworkspace.

Öppna PickFlavorViewController.swift och Lägg till följande strax under den befintliga importen:

import Alamofire

Bygg och kör. Du ser ingen förändring ännu men vara säker på att Alamofire är nu tillgänglig.

första kompileringen efter integrering av Alamofire-beroende

nästa, ersätt loadFlavors() med följande:

 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() } }

här är play-by-play av vad som händer i den här koden:

  1. du använder Alamofire för att skapa en GET-förfrågan och ladda ner en plist som innehåller glasssmaker.
  2. för att bryta en stark referenscykel använder du en svag referens till self I response completion-blocket. När blocket körs får du omedelbart en stark hänvisning till self så att du kan ställa in egenskaper på det senare.
  3. därefter verifierar du attresponse.result visar framgång ochresponse.result.value är en rad ordböcker.
  4. nu ställer du inself.flavors till en array medFlavor objekt somFlavorFactory skapar. Detta är en klass A ”kollega” skrev för dig (du är välkommen!), som tar en rad ordböcker och använder dem för att skapa instanser av Flavor.
  5. slutligen laddar du om samlingsvyn och väljer den första smaken.

Bygg och kör. Du kan nu välja en glassmak!

Välj smak

nu för en god toppning

appen ser bra ut, men du kan fortfarande förbättra den.

märkte du att appen tar en sekund att ladda ner flavors-filen? Om du har en snabb Internetanslutning kanske du inte märker förseningen, men dina kunder kommer inte alltid att vara så lyckliga.

ditt nästa steg är att visa en laddningsindikator i din app, för att hjälpa kunder att förstå att det laddar data och inte bara twiddling dess bibliotek. MBProgressHUD är en riktigt trevlig indikator som fungerar bra här. Och det stöder CocoaPods; vilket sammanträffande! :]

för att använda denna pod måste du lägga till den i din Podfile. I stället för att öppna Podfilen från kommandoraden kan du nu hitta den i Pods-målet i arbetsytan:

Pods i arbetsytan

Öppna Podfile och Lägg till följande, direkt efter Alamofire-raden:

pod 'MBProgressHUD', '~> 1.0'

spara filen och installera beroenden via pod install i Terminal, precis som du gjorde tidigare.

Lägg märke till något annat den här gången? Japp, du angav versionsnumret som ~> 1.0. Men varför?

CocoaPods rekommenderar att alla skida använder Semantisk versionshantering. Ta en stund att förstå vad det är.

Semantisk versionshantering

många gånger ser du en version skriven så här: 1.0.0. Dessa tre siffror är stora, mindre och patch versionsnummer.

till exempel för versionsnummer 1.0.0 är 1 huvudnumret, det första 0 är det mindre numret och det andra 0 är patchnumret.

semantisk Versionsexempel

om huvudnumret ökar indikerar det att versionen innehåller icke-bakåtkompatibla ändringar. När du uppgraderar en pod till nästa huvudversion kan du behöva fixa byggfel eller så kan pod-enheten fungera annorlunda än tidigare.

om det mindre antalet ökar indikerar det att versionen innehåller ny funktionalitet som är bakåtkompatibel. När du bestämmer dig för att uppgradera behöver du kanske eller inte den nya funktionaliteten, men det bör inte orsaka några byggfel eller ändra befintligt beteende.

om patchnumret ökar betyder det att den nya versionen innehåller buggfixar men ingen ny funktionalitet eller beteende förändras. I allmänhet vill du alltid uppgradera patchversioner så snart som möjligt för att få den senaste, stabila versionen av pod.

slutligen, när du ökar det högsta ordernumret-major, då mindre sedan patch — enligt ovanstående regler, måste du återställa eventuella lägre ordernummer till noll.

Här är ett exempel:

Tänk på en pod som har ett aktuellt versionsnummer på 1.2.3.

Om du gör ändringar som inte är bakåtkompatibla, har inte ny funktionalitet, men fixar befintliga buggar, skulle du ge den version 2.0.0.

Utmaningstid

om en pod har en aktuell version av 2.4.6 och du gör ändringar som fixar buggar och lägger till bakåtkompatibel funktionalitet, vad ska det nya versionsnumret vara?

svar: 2.5.0
förklaring: om du gör ändringar som innehåller ny funktionalitet som är bakåtkompatibel ökar du det mindre antalet och återställer korrigeringsfilen till noll.

om en pod har en aktuell version av 3.5.8 och du gör ändringar i befintliga funktioner som inte är bakåtkompatibla, vad ska det nya versionsnumret vara?

svar: 4.0.0
förklaring: Om ändringar ändrar befintligt beteende och inte är bakåtkompatibla måste du öka huvudnumret och återställa mindre och korrigeringsnummer till noll.

om en pod har en aktuell version av 10.20.30 och du bara fixar fel, Vad ska det nya versionsnumret vara?

svar: 10.20.31
förklaring: om du bara fixar fel, ökar du bara patchnumret.

Efter att ha sagt allt detta finns det ett undantag från dessa regler:

om en pods versionsnummer är mindre än 1.0.0 anses den vara en betaversion. Mindre antal ökningar kan inkludera ändringar som inte är bakåtkompatibla.

så tillbaka till MBProgressHUB: använda ~> 1.0 betyder att du ska installera den senaste versionen som är större än eller lika med 1.0 men mindre än 2.0.

detta säkerställer att du får de senaste buggfixarna och funktionerna när du installerar denna pod, men du kommer inte av misstag att dra in bakåtkompatibla ändringar.

det finns flera andra operatörer Du kan använda också. För en fullständig lista, se Podfile Syntax referens.

Nu när du har lärt dig hur operatörer arbetar med dina CocoaPods är det dags att avsluta din app.

visar framsteg

om du kommer ihåg byggde du en framstegsindikator för att visa dina användare när smaker laddas i appen.

för att avsluta den här funktionen, gå tillbaka till PickFlavorViewController.swift och Lägg till följande direkt efter den andra importen:

import MBProgressHUD

lägg sedan till följande hjälpmetoder efter loadFlavors():

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

nu, i loadFlavors(), Lägg till följande två rader (som anges):

 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 // ...

som metodnamnen antyder, showLoadingHUD() visar en instans av MBProgressHUD medan GET-begäran hämtas. hideLoadingHUD() döljer HUD när begäran är klar. Eftersom showLoadingHUD() ligger utanför Stängningen behöver den inte prefixet self.

Bygg och kör. Du ser nu en laddningsindikator medan smakerna laddas. Om din Internet-anslutning är för snabb för detta, Du kan lägga till ensleep(_:) uttalande strax förehideLoadingHUD() så att du kan uppleva godhet som är MBProgressHUD. :]

App med laddningssymbol

bra arbete! Kunderna kan nu välja sin favoritglassmak och de ser en laddningsindikator medan smaker laddas ner.

vart ska man gå härifrån?

Du kan ladda ner det slutförda projektet med knappen Hämta Material längst upp eller längst ner på den här sidan.

Grattis! Du vet nu grunderna i att använda CocoaPods, inklusive att skapa och ändra beroenden och förstå Semantisk versionshantering. Du är nu redo att börja använda dem i dina egna projekt!

det finns mycket mer som du kan göra med CocoaPods. Du kan söka efter befintliga pods på den officiella CocoaPods-webbplatsen. Se också CocoaPods-guiderna för att lära dig de finare detaljerna i detta utmärkta verktyg. Men varnas, när du börjar använda det, kommer du att undra hur du någonsin lyckats utan det! :]

Jag hoppas att du gillade att läsa den här CocoaPods-handledningen så mycket jag skrev den. Vilka är några av dina favorit CocoaPods? Vilka litar du mest på för vardagliga projekt? Dela gärna, eller ställa några frågor, i kommentarerna nedan!

raywenderlich.com veckovis

raywenderlich.com nyhetsbrev är det enklaste sättet att hålla dig uppdaterad om allt du behöver veta som mobilutvecklare.

få en veckovis sammanfattning av våra handledning och kurser, och få en gratis fördjupad e-postkurs som en bonus!

Medelbetyg

4.8/5

Lägg till ett betyg för detta innehåll

logga in för att lägga till ett betyg

33 betyg

Lämna ett svar

Din e-postadress kommer inte publiceras.