Maybaygiare.org

Blog Network

CocoaPods Tutorial voor Swift: aan de slag

update opmerking: Rony Rozen heeft deze tutorial bijgewerkt voor Xcode 11 en Swift 5. Joshua Greene schreef het origineel.

CocoaPods is een populaire dependency manager voor Swift en Objective-C Cocoa projecten. Duizenden bibliotheken en miljoenen apps gebruiken het, volgens de CocoaPods website. Maar wat is een dependency manager en waarom heb je er een nodig?

een dependency manager maakt het eenvoudig om de afhankelijkheden van derden toe te voegen, te verwijderen, bij te werken en te beheren.

bijvoorbeeld, in plaats van uw eigen netwerkbibliotheek opnieuw uit te vinden, kunt u eenvoudig alamofire Pullen met behulp van een dependency manager. U kunt de exacte versie opgeven die u wilt gebruiken of een reeks aanvaardbare versies.

Dit betekent dat zelfs als Alamofire een update krijgt met wijzigingen die niet achterwaarts compatibel zijn, uw app de oudere versie kan blijven gebruiken totdat u klaar bent om deze bij te werken.

in deze tutorial leert u hoe u CocoaPods met Swift kunt gebruiken. Specifiek:

  • installeer CocoaPods.
  • werk met een functionele demo-app die je aan het denken zet over ijs.
  • gebruik CocoaPods om netwerken toe te voegen.
  • leer meer over semantische versiebeheer.
  • voeg een andere bibliotheek toe met behulp van een flexibele versie.
Opmerking: Deze CocoaPods handleiding vereist basiskennis van iOS en Swift ontwikkeling. Als je helemaal nieuw bent voor iOS en / of Swift, bekijk dan enkele van de andere geschreven en/of video tutorials op deze site voordat je deze tutorial doet. Of, duik in ons boek, iOS leerling.

Deze tutorial bevat ook klassen die Kerngrafieken gebruiken. Hoewel kennis van de kern Graphics is gunstig, Het is niet vereist. Als u meer wilt weten, lees dan onze moderne Core Graphics met Swift-serie.

aan de slag

Download het startproject door op de knop materialen Downloaden boven of onder in de tutorial te klikken.

gedurende deze tutorial werkt u met een app genaamd Ice Cream Shop, Inc. U zult CocoaPods gebruiken om afhankelijkheden toe te voegen aan de app op de gemakkelijke manier, in plaats van het schrijven van uw eigen.

voordat u verder kunt gaan met deze handleiding, moet u CocoaPods installeren. Gelukkig maakt CocoaPods gebruik van Ruby, die wordt geleverd met alle versies van macOS X sinds Versie 10.7.

Open Terminal en voer het volgende commando in:

sudo gem install cocoapods

Voer uw wachtwoord in wanneer daarom wordt gevraagd. De Terminal uitvoer zal verschillende ophalen, installeren en documentatie-gerelateerde uitgangen tonen, eindigend met “XX gems installed”.

opmerking: u moet sudo gebruiken om CocoaPods te installeren, maar als het eenmaal is geïnstalleerd, hoeft u het niet meer te gebruiken in deze tutorial.

ten slotte, voer dit commando in Terminal in om de setup te voltooien:

pod setup --verbose

Dit proces duurt een paar minuten omdat het de Cocoapods Master Specs repository in ~/klonen.cocoapods / op uw computer.

de verbose optie logt de voortgang tijdens het proces, zodat u het proces kunt bekijken in plaats van een schijnbaar” bevroren ” scherm te zien.

geweldig, je bent nu ingesteld om CocoaPods te gebruiken!

Ice Cream Shop, Inc.

uw beste klant is Ice Cream Shop, Inc. Hun ijs is zo populair dat ze niet kunnen bijhouden met de bestellingen van klanten aan de balie. Ze hebben je gerekruteerd om een slanke iOS-app te maken waarmee klanten ijs kunnen bestellen vanaf hun iPhones.

u bent begonnen met het ontwikkelen van de app en het gaat goed. Bekijk je voortgang door IceCreamShop te openen.xcodeproj, dan bouwen en draaien. U zult een watertanden vanille-ijsje zien:

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

De gebruiker zou in staat moeten zijn om een ijssmaak uit dit scherm te kiezen, maar dat is nog niet mogelijk. Uw eerste stap is het voltooien van de implementatie van deze functionaliteit.

open Main.storyboard vanuit de Views / Storyboards & Nibs groep om de lay-out van de app te zien. Hier is een snel overzicht van het hart van de app, de choose Your Flavor scene:

componenten van de Choose Your Flavor scene

  • PickFlavorViewController is de weergavecontroller voor deze scene. Het behandelt interactie met de gebruiker en biedt de gegevens voor de collectie weergave die de verschillende ijs smaken weergeeft.
  • IceCreamView is een aangepaste weergave die een ijsje toont op basis van de backing mode, Flavor.
  • ScoopCell is een aangepaste collectieweergavecel die een ScoopView bevat, die Kleuren krijgt van een Flavor model.

terwijl elke ijssalon, Inc. locatie heeft handtekening smaken gemeen, elk draagt zijn eigen lokale smaken, ook. Om deze reden moet een webservice de gegevens leveren voor de Flavors.

Dit verklaart echter nog steeds niet waarom gebruikers hun ijssmaak niet kunnen selecteren.

Open PickFlavorViewController.swift, gevonden onder de Controllers groep, en je zult een stubbed methode zien:

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

Aha, er zijn geen smaken! Je moet de functie implementeren!

terwijl u URLSession zou kunnen gebruiken en uw eigen netwerk klassen zou kunnen schrijven, is er een eenvoudiger manier: gebruik Alamofire!

u zou in de verleiding kunnen komen om deze bibliotheek te downloaden en de bronbestanden rechtstreeks naar uw project te slepen. Maar dat zou het op de moeilijke manier doen. Cocoapoden bieden een veel elegantere en wendbare oplossing.

uw eerste afhankelijkheid installeren

uw eerste stap is het sluiten van Xcode. Ja, dat heb je goed gelezen.

Het is tijd om het Podbestand aan te maken, waar u de afhankelijkheden van uw project zult definiëren.

Open Terminal en navigeer naar de map die uw IceCreamShop-project bevat met behulp van het cd-Commando:

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

voer vervolgens het volgende commando in:

pod init

Dit maakt een Podbestand voor uw project.

ten slotte, typ het volgende commando om het Podbestand te openen met behulp van Xcode voor het bewerken:

open -a Xcode Podfile
opmerking: Gebruik geen TextEdit om het Podbestand te bewerken omdat het standaard aanhalingstekens vervangt door grafisch aantrekkelijker typeset aanhalingstekens. Dit kan ertoe leiden dat Cocoapoden in de war raken en fouten gooien. Gebruik in plaats daarvan Xcode of een andere programmerende teksteditor om je Podfile te bewerken.

het standaard Podbestand ziet er zo uit:

# 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

verwijder de # en spatie voor platform, verwijder vervolgens de andere regels die beginnen met #.

uw Podbestand zou er nu zo uit moeten zien:

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

Dit vertelt CocoaPods uw project richt zich op iOS 9.0 en zal frameworks gebruiken in plaats van statische bibliotheken. Hoewel Swift en CocoaPods beide statisch linken ondersteunen, doen niet alle bibliotheken die u bevat dat. Een van hen die u zult gebruiken in dit project niet.

als je alleen in Swift hebt geprogrammeerd, kan dit er een beetje vreemd uitzien. Dat komt omdat de Podfile in Ruby is geschreven. Je hoeft Ruby niet te kennen om CocoaPods te gebruiken, maar je moet je ervan bewust zijn dat zelfs kleine tekstfouten ervoor zorgen dat CocoaPods fouten gaan gooien.

een woord over bibliotheken

u ziet de term bibliotheek vaak gebruikt als een algemene term die eigenlijk betekent een bibliotheek of framework. Deze tutorial is schuldig aan terloops mengen van deze woorden, ook.

u vraagt zich misschien af wat de verschillen zijn tussen een bibliotheek, een framework en een CocoaPod. Het is OK als je de terminologie een beetje verwarrend vindt!

een CocoaPod, of kortweg pod, is een algemene term voor een bibliotheek of framework die aan uw project is toegevoegd met behulp van CocoaPods.

iOS 8 introduceerde dynamische frameworks, waarmee u code, afbeeldingen en andere assets samen kunt bundelen. Voorafgaand aan iOS 8, heb je CocoaPods gemaakt als “fat” statische bibliotheken. “Fat” betekent dat ze verschillende codeinstructie sets bevatten, zoals i386 voor de simulator, armv7 voor apparaten, enz. Swift staat echter niet toe dat statische bibliotheken bronnen zoals afbeeldingen of assets bevatten.

terug naar het installeren van uw eerste afhankelijkheid

Het is eindelijk tijd om uw eerste afhankelijkheid toe te voegen met behulp van CocoaPods. Voeg het volgende toe aan uw Podfile, direct na use_frameworks!:

pod 'Alamofire', '4.9.1'

Dit vertelt CocoaPods dat u alamofire versie 4.9.1 wilt opnemen als een afhankelijkheid voor uw project.

Het Podbestand opslaan en sluiten.

Je moet nu CocoaPods vertellen om de afhankelijkheden voor je project te installeren.

voer het volgende commando in In Terminal, nadat u er zeker van bent dat u zich nog steeds in de map bevindt die het Icecreamshop-project en het Podbestand bevat:

pod install

u ziet de volgende uitvoer:

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.

Open de projectmap met Finder en u zult zien dat CocoaPods een nieuwe IceCreamShop heeft aangemaakt.xcworkspace-bestand en een Pods-map om alle afhankelijkheden van het project op te slaan.

opmerking: vanaf nu, zoals de opdrachtregel waarschuwing vermeld, moet u het project altijd Openen met de .xcworkspace bestand en niet de .xcodeproj. Anders, zult u build fouten tegenkomen.

uitstekend! Je hebt zojuist je eerste afhankelijkheid toegevoegd met behulp van CocoaPods!

met behulp van geà Nstalleerde Pods

nu gebruikt u uw gloednieuwe afhankelijkheid, Alamofire.

als het Xcode-project geopend is, sluit het dan nu en open IceCreamShop.xcworkspace.

Open PickFlavorViewController.swift en voeg het volgende toe net onder de bestaande import:

import Alamofire

bouwen en uitvoeren. U zult nog geen verandering zien, maar wees gerust dat Alamofire nu beschikbaar is.

eerste compilatie na integratie van alamofire-afhankelijkheid

volgende, vervang loadFlavors() door het volgende:

 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 is de play-by-play van wat er gebeurt in deze code:

  1. u gebruikt Alamofire om een GET request aan te maken en een plist te downloaden die ijsaroma ‘ s bevat.
  2. om een sterke referentiecyclus te doorbreken, gebruikt u een zwakke referentie naar self in het response completion block. Zodra het blok is uitgevoerd, krijg je onmiddellijk een sterke verwijzing naar self zodat je later eigenschappen kunt instellen.
  3. vervolgens controleert u of de response.result succes toont en de response.result.value een reeks woordenboeken is.
  4. nu stelt u self.flavors in op een array van Flavor objecten die FlavorFactory maakt. Dit is een klasse een” collega ” schreef voor u (graag gedaan!), die een reeks woordenboeken neemt en deze gebruikt om instanties van Flavoraan te maken.
  5. tenslotte herlaadt u de collectieweergave en selecteert u de eerste smaak.

bouwen en uitvoeren. U kunt nu kiezen voor een ijssmaak!

kies smaak

nu voor een smakelijke Topping

De app ziet er goed uit, maar je kunt het nog steeds verbeteren.

heeft u gemerkt dat de app een seconde duurt om het flavors-bestand te downloaden? Als je op een snelle internetverbinding, je zou niet merken de vertraging, maar uw klanten zullen niet altijd zo gelukkig zijn.

uw volgende stap is het tonen van een laadindicator in uw app, om klanten te helpen begrijpen dat het laden van gegevens en niet alleen twiddling de bibliotheken. MBProgressHUD is een echt mooie indicator die hier goed zal werken. En het ondersteunt Cocoapoden; wat een toeval! :]

om deze pod te gebruiken, moet u deze toevoegen aan uw Podfile. In plaats van het Podbestand te openen vanaf de opdrachtregel, kunt u het nu vinden in het Pods-doel in de werkruimte:

Pods in werkruimte

Open Podbestand en voeg het volgende toe, direct na de Alamofire-regel:

pod 'MBProgressHUD', '~> 1.0'

sla het bestand op en installeer de afhankelijkheden via pod install in Terminal, net als vroeger.

ziet u deze keer iets anders? Yep, je hebt het versienummer opgegeven als ~> 1.0. Maar waarom?

CocoaPods beveelt aan dat alle pods semantische versiebeheer gebruiken. Neem even de tijd om te begrijpen wat dat is.

semantische versiebeheer

vaak ziet u een versie als volgt geschreven: 1.0.0. Deze drie nummers zijn major, minor en patch versie nummers.

bijvoorbeeld, voor het versienummer 1.0.0 is 1 het hoofdnummer, de eerste 0 het kleine nummer en de tweede 0 het patchnummer.

semantische versiebeheer voorbeeld

als het grote aantal toeneemt, geeft dit aan dat de versie niet-achterwaarts compatibele wijzigingen bevat. Wanneer u een pod upgrade naar de volgende grote versie, kan het nodig zijn om build fouten op te lossen of de pod kan zich anders gedragen dan voorheen.

als het kleine getal toeneemt, geeft dit aan dat de versie nieuwe functionaliteit bevat die achterwaarts compatibel is. Wanneer u besluit om te upgraden, kan het zijn dat u de nieuwe functionaliteit al dan niet nodig hebt, maar het mag geen bouwfouten veroorzaken of bestaand gedrag veranderen.

als het patchnummer toeneemt, betekent dit dat de nieuwe versie bugfixes bevat, maar geen nieuwe functionaliteit of gedragsveranderingen. In het algemeen wil je altijd patchversies zo snel mogelijk upgraden om de nieuwste, stabiele versie van de pod te hebben.

ten slotte, wanneer u het hoogste-ordernummer — major verhoogt, dan klein en vervolgens patch — volgens de bovenstaande regels, moet u alle lagere-ordernummers resetten naar nul.

Hier is een voorbeeld:

beschouw een pod met een huidig versienummer van 1.2.3.

Als u wijzigingen aanbrengt die niet achterwaarts compatibel zijn, geen nieuwe functionaliteit heeft, maar bestaande bugs repareert, geeft u het Versie 2.0.0.

Challenge Time

als een pod een huidige versie van 2.4 heeft.6 en u maakt wijzigingen die bugs repareren en backwards-compatibele functionaliteit toevoegen, wat moet het nieuwe versienummer zijn?

antwoord: 2.5.0
uitleg: als u wijzigingen aanbrengt die nieuwe functionaliteit bevatten die achterwaarts compatibel is, verhoog u het kleine getal en reset u de patch naar nul.

als een pod een huidige versie van 3.5.8 heeft en u wijzigingen aanbrengt in bestaande functionaliteit die niet achterwaarts compatibel zijn, wat moet het nieuwe versienummer dan zijn?

antwoord: 4.0.0
uitleg: Als wijzigingen bestaand gedrag wijzigen en niet achterwaarts compatibel zijn, moet u het hoofdnummer verhogen en de minor-en patchnummers resetten naar nul.

als een pod een huidige versie van 10.20.30 heeft en u alleen bugs repareert, wat moet het nieuwe versienummer dan zijn?

antwoord: 10.20.31
uitleg: als u alleen bugs repareert, verhoogt u alleen het patchnummer.

Dit gezegd hebbende, is er één uitzondering op deze regels:

als het versienummer van een pod minder is dan 1.0.0, wordt het beschouwd als een bètaversie. Kleine nummerverhogingen kunnen wijzigingen bevatten die niet achterwaarts compatibel zijn.

So back to MBProgressHUB: met ~> 1.0 betekent dat u de nieuwste versie moet installeren die groter of gelijk is aan 1.0 maar kleiner dan 2.0.

Dit zorgt ervoor dat u de nieuwste bugfixes en functies krijgt wanneer u deze pod installeert, maar u zult niet per ongeluk achterwaarts incompatibele wijzigingen invoeren.

er zijn verschillende andere operators die u ook kunt gebruiken. Voor een volledige lijst, zie de Podfile syntaxis referentie.

nu u hebt geleerd hoe operators werken met uw CocoaPods, is het tijd om uw app af te maken.

voortgang

Als u zich herinnert, bouwde u een voortgangsindicator om uw gebruikers te tonen wanneer smaken worden geladen in de app.

om deze functie te voltooien, ga terug naar PickFlavorViewController.swift en voeg het volgende recht na de andere imports toe:

import MBProgressHUD

volgende, voeg de volgende helper methoden toe na 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, in loadFlavors(), voeg de volgende twee regels toe (zoals aangegeven):

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

zoals de methodenamen impliceren, toont showLoadingHUD() een instantie van MBProgressHUD terwijl de GET request downloadt. hideLoadingHUD() verbergt de HUD wanneer het verzoek is voltooid. Aangezien showLoadingHUD() buiten de afsluiting is, heeft het niet het voorvoegsel self nodig.

bouwen en uitvoeren. Je ziet nu een laadindicator terwijl de smaken worden geladen. Als uw internetverbinding hiervoor te snel is, kunt u een sleep(_:) statement toevoegen net voor hideLoadingHUD() zodat u de goedheid kunt ervaren die MBProgressHUD is. :]

App met laadsymbool

geweldig werk! Klanten kunnen nu hun favoriete ijssmaak selecteren en ze zien een laadindicator terwijl smaken worden gedownload.

waar moet ik nu naartoe?

u kunt het voltooide project downloaden met behulp van de knop materialen Downloaden aan de boven-of onderkant van deze pagina.

Gefeliciteerd! Je kent nu de basisprincipes van het gebruik van CocoaPods, inclusief het maken en wijzigen van afhankelijkheden en het begrijpen van semantische versiebeheer. Je bent nu klaar om ze te gebruiken in je eigen projecten!

Er is veel meer dat je kunt doen met CocoaPods. U kunt zoeken naar bestaande pods op de officiële CocoaPods website. Raadpleeg ook de CocoaPods gidsen om de fijnere details van deze uitstekende tool te leren. Maar wees gewaarschuwd, als je het eenmaal gaat gebruiken, zul je je afvragen hoe je het ooit zonder hebt gedaan! :]

Ik hoop dat je genoten hebt van het lezen van deze cocoapods tutorial zoals ik het geschreven heb. Wat zijn enkele van je favoriete Cocoapoden? Op welke vertrouw je het meest voor alledaagse projecten? Voel je vrij om te delen, of om vragen te stellen, in de commentaren hieronder!

raywenderlich.com wekelijks

De raywenderlich.com nieuwsbrief is de makkelijkste manier om op de hoogte te blijven van alles wat u als mobiele ontwikkelaar moet weten.

ontvang een wekelijkse samenvatting van onze tutorials en cursussen, en ontvang een gratis diepgaande e-mail cursus als bonus!

gemiddelde waardering

4.8/5

voeg een waardering voor deze inhoud toe

Meld u aan om een waardering toe te voegen

33 beoordelingen

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.