Maybaygiare.org

Blog Network

CocoaPods samouczek dla Swift: pierwsze kroki

aktualizacja Uwaga: Rony Rozen zaktualizował ten samouczek dla Xcode 11 i Swift 5. Oryginał napisał Joshua Greene.

CocoaPods jest popularnym menedżerem zależności dla projektów Swift i Objective-C Cocoa. Tysiące bibliotek i miliony aplikacji korzystają z niego, zgodnie ze stroną internetową CocoaPods. Ale co to jest menedżer zależności i dlaczego go potrzebujesz?

menedżer zależności ułatwia dodawanie, usuwanie, aktualizowanie i zarządzanie zależnościami innych firm, których używa Twoja aplikacja.

na przykład, zamiast wymyślać własną bibliotekę sieciową, możesz łatwo pobrać Alamofire za pomocą Menedżera zależności. Możesz określić dokładną wersję do użycia lub zakres dopuszczalnych wersji.

oznacza to, że nawet jeśli Alamofire otrzyma aktualizację ze zmianami, które nie są kompatybilne wstecz, Twoja aplikacja może nadal używać starszej wersji, dopóki nie będziesz gotowy do jej aktualizacji.

w tym samouczku dowiesz się, jak używać CocoaPods z Swift. W szczególności:

  • zainstaluj CocoaPods.
  • Pracuj z funkcjonalną aplikacją demo, która pozwoli Ci myśleć o lodach.
  • użyj CocoaPods, aby dodać sieć.
  • poznaj wersjonowanie semantyczne.
  • dodaj kolejną bibliotekę używając elastycznej wersji.
Uwaga: Ten samouczek CocoaPods wymaga podstawowej znajomości iOS i szybkiego rozwoju. Jeśli jesteś całkowicie nowy na iOS i / lub Swift, sprawdź niektóre inne pisemne i/lub samouczki wideo na tej stronie przed wykonaniem tego samouczka. Lub zanurz się w naszej książce, iOS Apprentice.

ten samouczek zawiera również klasy, które używają podstawowej Grafiki . Chociaż znajomość podstawowej Grafiki jest korzystna, nie jest wymagana. Jeśli chcesz dowiedzieć się więcej, przeczytaj naszą serię Modern core Graphics With Swift.

wprowadzenie

Pobierz projekt startowy, klikając przycisk Pobierz Materiały na górze lub na dole samouczka.

w tym samouczku będziesz pracować z aplikacją o nazwie Ice Cream Shop, Inc. Będziesz używać CocoaPods, aby w łatwy sposób dodawać zależności do aplikacji, zamiast pisać własne.

zanim będziesz mógł kontynuować ten samouczek, musisz zainstalować CocoaPods. Na szczęście CocoaPods używa Ruby, który jest dostarczany ze wszystkimi wersjami macOS X od wersji 10.7.

Otwórz Terminal i wprowadź następujące polecenie:

sudo gem install cocoapods

wprowadź swoje hasło, gdy zażądasz. Wyjście terminala pokaże różne wyjścia pobierania, instalacji i dokumentacji, kończąc z „XX gems installed”.

uwaga: musisz użyć sudo, aby zainstalować CocoaPods, ale po zainstalowaniu nie będziesz musiał go ponownie używać w tym samouczku.

na koniec wprowadź To polecenie w Terminalu, aby zakończyć konfigurację:

pod setup --verbose

ten proces trwa kilka minut, ponieważ klonuje repozytorium CocoaPods Master Specs do~/.cocoapods / na twoim komputerze.

opcja verbose rejestruje postęp podczas uruchamiania procesu, pozwalając na obserwowanie procesu zamiast widoku pozornie „zamrożonego” ekranu.

zajebiste, teraz masz możliwość korzystania z CocoaPods!

lodziarnia

twoim najlepszym klientem jest lodziarnia, Inc. Ich lody są tak popularne, że nie mogą nadążyć za zamówieniami klientów w kasie. Zrekrutowali Cię, aby stworzyć elegancką aplikację na iOS, która pozwala klientom zamawiać lody bezpośrednio z ich iphone ’ ów.

zacząłeś rozwijać aplikację i idzie dobrze. Spójrz na swoje postępy, otwierając IceCreamShop.xcodeproj, a następnie budowanie i uruchamianie. Zobacz przepyszny rożek do lodów waniliowych:

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

Użytkownik powinien mieć możliwość wyboru smaku lodów z tego ekranu, ale nie jest to jeszcze możliwe. Pierwszym krokiem jest zakończenie wdrażania tej funkcjonalności.

Otwórz Main.storyboard z widoków / Storyboardów & Grupa Nibs, aby zobaczyć układ aplikacji. Oto krótki przegląd serca aplikacji, Wybierz scenę smaku:

składniki Wybierz scenę smaku

  • PickFlavorViewController jest kontrolerem widoku dla tej sceny. Obsługuje interakcję z użytkownikiem i zapewnia dane dla widoku kolekcji, który wyświetla różne smaki lodów.
  • IceCreamView to niestandardowy widok, który wyświetla stożek lodów oparty na trybie podkładu,Flavor.
  • ScoopCell to niestandardowa komórka widoku kolekcji, która zawieraScoopView, która pobiera kolory z modeluFlavor.

podczas gdy każda lodziarnia, Inc. lokalizacja ma wspólne smaki podpisu, każdy ma swoje własne lokalne smaki, zbyt. Z tego powodu serwis internetowy musi podać dane dlaFlavor.

jednak to nadal nie wyjaśnia, dlaczego użytkownicy nie mogą wybrać swoich smaków lodów.

Otwórz PickFlavorViewController.swift, znajduje się w grupie kontrolerów, a zobaczysz metodę stubową:

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

Aha, nie ma smaków! Musisz zaimplementować tę funkcję!

chociaż możesz użyć URLSession I napisać własne klasy sieciowe, jest łatwiejszy sposób: użyj Alamofire!

możesz pokusić się o pobranie tej biblioteki i przeciągnięcie plików źródłowych bezpośrednio do swojego projektu. Ale to byłoby trudne. CocoaPods zapewnia znacznie bardziej eleganckie i zwinne rozwiązanie.

instalacja pierwszej zależności

pierwszym krokiem jest zamknięcie Xcode. Tak, dobrze to przeczytałeś.

czas utworzyć Podfile, w którym zdefiniujesz zależności projektu.

Otwórz Terminal i przejdź do katalogu, który zawiera twój projekt IceCreamShop, używając polecenia cd:

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

następnie wprowadź następujące polecenie:

pod init

To tworzy Podfile dla Twojego projektu.

na koniec wpisz następujące polecenie, aby otworzyć Podfile przy użyciu Xcode do edycji:

open -a Xcode Podfile
uwaga: nie używaj programu TextEdit do edycji Podfile, ponieważ zastępuje on standardowe cudzysłowy bardziej atrakcyjnymi graficznie cytatami. Może to spowodować, że CocoaPods stają się zdezorientowane i rzucają błędy. Zamiast tego użyj Xcode lub innego programistycznego edytora tekstu, aby edytować Podfile.

domyślny Podfile wygląda tak:

# 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

Usuń# I spację przedplatform, a następnie usuń inne linie zaczynające się od#.

Twój Podfile powinien teraz wyglądać tak:

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

To informuje CocoaPods, że twój projekt jest skierowany na iOS 9.0 i będzie używał frameworków zamiast statycznych bibliotek. Podczas gdy Swift i CocoaPods obsługują statyczne łączenie, nie wszystkie biblioteki, które dołączasz. Jeden z nich, którego użyjesz W tym projekcie, nie.

Jeśli programowałeś tylko w Swifcie, może to wyglądać trochę dziwnie. To dlatego, że Podfile jest napisany w Ruby. Nie musisz znać Rubiego, aby używać CocoaPods, ale powinieneś mieć świadomość, że nawet drobne błędy tekstowe spowodują, że CocoaPods wyrzuci błędy.

słowo o bibliotekach

zobaczysz termin biblioteka często używany jako ogólny termin, który faktycznie oznacza bibliotekę lub framework. Ten poradnik jest winny przypadkowego mieszania tych słów, zbyt.

możesz się zastanawiać nad różnicami między biblioteką, frameworkiem i CocoaPod. Jest OK, jeśli uważasz, że terminologia jest nieco myląca!

CocoaPod, lub w skrócie pod, jest ogólnym terminem dla biblioteki lub frameworka dodanego do twojego projektu przy użyciu CocoaPods.

w systemie iOS 8 wprowadzono dynamiczne struktury, które umożliwiają łączenie kodu, obrazów i innych zasobów. Przed iOS 8 tworzyłeś CocoaPods jako „grube” biblioteki statyczne. „Fat” oznacza, że zawierały kilka zestawów instrukcji kodu, takich jak i386 dla symulatora, armv7 dla urządzeń itp. Jednak Swift nie pozwala bibliotekom statycznym zawierać zasobów, takich jak obrazy lub zasoby.

powrót do instalacji pierwszej zależności

nadszedł wreszcie czas, aby dodać swoją pierwszą zależność za pomocą CocoaPods. Dodaj następujący plik do swojego Podfile, zaraz po use_frameworks!:

pod 'Alamofire', '4.9.1'

To informuje CocoaPods, że chcesz włączyć alamofire w wersji 4.9.1 jako zależność dla Twojego projektu.

Zapisz i zamknij Podfile.

musisz teraz powiedzieć CocoaPods, aby zainstalował zależności dla Twojego projektu.

wprowadź następujące polecenie w terminalu, po upewnieniu się, że nadal jesteś w katalogu zawierającym projekt IceCreamShop i Podfile:

pod install

powinieneś zobaczyć wyjście w następujący sposób:

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.

Otwórz folder projektu za pomocą Findera, a zobaczysz, że CocoaPods utworzył nowy IceCreamShop.plik xcworkspace i folder Pods do przechowywania wszystkich zależności projektu.

Uwaga: Od teraz, jak wspomniano w ostrzeżeniu wiersza poleceń, zawsze musisz otworzyć projekt za pomocą .plik xcworkspace, a niexcodeproj. W przeciwnym razie napotkasz błędy kompilacji.

rewelacja! Właśnie dodałeś swoją pierwszą zależność używając CocoaPods!

używając zainstalowanych Podów

teraz użyjesz swojej nowej zależności, Alamofire.

Jeśli projekt Xcode jest otwarty, zamknij go teraz i otwórz IceCreamShop.xcworkspace.

Otwórz PickFlavorViewController.szybki i dodaj poniżej istniejącego importu:

import Alamofire

Zbuduj i uruchom. Nie zauważycie jeszcze żadnych zmian, ale możecie być pewni, że Alamofire jest już dostępny.

pierwsza kompilacja po zintegrowaniu zależności Alamofire

następnie zastąp loadFlavors() następującym:

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

oto, co dzieje się w tym kodzie:

  1. używasz Alamofire, aby utworzyć żądanie GET i pobrać plik zawierający smaki lodów.
  2. aby przerwać silny cykl odniesienia, użyj słabego odniesienia doself w bloku uzupełniania odpowiedzi. Gdy blok zostanie wykonany, natychmiast otrzymasz silne odniesienie do self, dzięki czemu możesz ustawić właściwości na nim później.
  3. następnie sprawdzaszresponse.result pokazuje sukces, aresponse.result.value jest tablicą słowników.
  4. teraz ustawiaszself.flavors na tablicęFlavor obiektów, któreFlavorFactory tworzy. To jest klasa, którą napisał dla Ciebie „kolega” (nie ma za co!), który pobiera tablicę słowników i używa ich do tworzenia instancji Flavor.
  5. na koniec przeładowujesz widok kolekcji i wybierasz pierwszy smak.

Zbuduj i uruchom. Teraz możesz wybrać smak lodów!

wybierz smak

teraz na smaczną polewę

aplikacja wygląda dobrze, ale nadal można ją poprawić.

zauważyłeś, że aplikacja pobiera plik smaków? Jeśli korzystasz z szybkiego połączenia internetowego, możesz nie zauważyć opóźnienia, ale twoi klienci nie zawsze będą mieli tyle szczęścia.

następnym krokiem jest pokazanie wskaźnika ładowania w aplikacji, aby pomóc klientom zrozumieć, że ładuje dane, a nie tylko przekręca biblioteki. MBProgressHUD jest naprawdę ładny wskaźnik, który będzie działać dobrze tutaj. I obsługuje CocoaPods; co za zbieg okoliczności! :]

aby użyć tego pod, musisz dodać go do swojego Podfile. Zamiast otwierać Podfile z wiersza poleceń, możesz teraz znaleźć go w docelowym Pods w obszarze roboczym:

Pods w obszarze roboczym

Otwórz Podfile i dodaj następujące, zaraz po wierszu Alamofire:

pod 'MBProgressHUD', '~> 1.0'

Zapisz plik i zainstaluj zależności poprzez pod install w Terminal, tak jak wcześniej.

tym razem zauważyłeś coś innego? Tak, podałeś numer wersji jako ~> 1.0. Ale dlaczego?

CocoaPods zaleca, aby wszystkie Pody używały wersji semantycznej. Poświęć chwilę, aby zrozumieć, co to jest.

wersjonowanie semantyczne

wiele razy zobaczysz wersję napisaną tak: 1.0.0. Te trzy numery to numery wersji major, minor I patch.

na przykład dla wersji 1.0.0, 1 jest liczbą główną, pierwsze 0 jest liczbą podrzędną, a drugie 0 jest numerem poprawki.

przykład wersjonowania semantycznego

Jeśli większa liczba zwiększa się, oznacza to, że wersja zawiera zmiany niezgodne z poprzednimi wersjami. Podczas uaktualniania pod do następnej wersji głównej może być konieczne naprawienie błędów kompilacji lub pod może zachowywać się inaczej niż wcześniej.

jeśli liczba pomniejsza wzrasta, oznacza to, że wersja zawiera nową funkcjonalność, która jest wstecznie kompatybilna. Gdy zdecydujesz się na aktualizację, możesz lub nie potrzebujesz nowej funkcjonalności, ale nie powinno to powodować błędów kompilacji ani zmieniać istniejącego zachowania.

jeśli liczba poprawek wzrośnie, oznacza to, że nowa wersja zawiera poprawki błędów, ale nie ma nowych funkcji ani zmian w zachowaniu. Ogólnie rzecz biorąc, zawsze chcesz jak najszybciej uaktualnić wersje poprawek, aby mieć najnowszą, stabilną wersję pod.

wreszcie, gdy zwiększasz liczbę najwyższego rzędu-major, potem minor, a następnie patch-zgodnie z powyższymi zasadami, musisz zresetować wszystkie numery niższego rzędu do zera.

oto przykład:

rozważ pod, który ma bieżący numer wersji 1.2.3.

Jeśli wprowadzasz zmiany, które nie są kompatybilne wstecz, nie mają nowej funkcjonalności, ale naprawiasz istniejące błędy, dałbyś mu wersję 2.0.0.

czas wyzwania

Jeśli pod ma aktualną wersję 2.4.6 i wprowadzasz zmiany, które naprawiają błędy i dodajesz wstecznie kompatybilną funkcjonalność, jaki powinien być numer nowej wersji?

odpowiedź: 2.5.0
Wyjaśnienie: jeśli wprowadzasz zmiany, które zawierają nową funkcjonalność, która jest wstecznie kompatybilna, zwiększasz liczbę podrzędną i resetujesz łatkę do zera.

Jeśli pod ma aktualną wersję 3.5.8 i wprowadzasz zmiany w istniejących funkcjach, które nie są kompatybilne wstecz, jaki powinien być numer nowej wersji?

odpowiedź: 4.0.0
Wyjaśnienie: Jeśli zmiany modyfikują istniejące zachowanie i nie są kompatybilne wstecz, należy zwiększyć liczbę główną i zresetować numery podrzędne i poprawki do zera.

Jeśli pod ma aktualną wersję 10.20.30 i naprawiasz tylko błędy, jaki powinien być numer nowej wersji?

odpowiedź: 10.20.31
Wyjaśnienie: jeśli naprawisz tylko błędy, zwiększysz tylko numer łatki.

powiedziawszy to wszystko, istnieje jeden wyjątek od tych zasad:

Jeśli numer wersji pod jest mniejszy niż 1.0.0, jest uważany za wersję beta. Nieznaczne zwiększenie liczby może obejmować zmiany, które nie są kompatybilne wstecz.

wracając do MBProgressHUB: użycie ~> 1.0 oznacza, że powinieneś zainstalować najnowszą wersję, która jest większa lub równa 1.0, ale mniejsza niż 2.0.

zapewnia to uzyskanie najnowszych poprawek błędów i funkcji podczas instalacji tego pod, ale przypadkowo nie pociągniesz za sobą wstecznie niekompatybilnych zmian.

istnieje kilka innych operatorów, których możesz również użyć. Aby uzyskać pełną listę, zobacz odniesienie do składni Podfile.

teraz, gdy nauczyłeś się, jak operatorzy pracują z Twoimi Cocoapodami, nadszedł czas, aby zakończyć aplikację.

Pokazywanie postępu

Jeśli pamiętasz, budowałeś wskaźnik postępu, aby pokazać użytkownikom, gdy smaki ładują się w aplikacji.

aby zakończyć tę funkcję, wróć do PickFlavorViewController.następnie dodaj następujące metody pomocnicze po 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)}

teraz, w 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)}

w loadFlavors(), dodaj następujące dwie linie (jak wskazano):

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

jak sugerują nazwy metod,showLoadingHUD() pokazuje instancjęMBProgressHUD podczas pobierania żądania GET. hideLoadingHUD() ukrywa HUD po zakończeniu żądania. Ponieważ showLoadingHUD() znajduje się poza zamknięciem, nie potrzebuje prefiksu self.

Zbuduj i uruchom. Podczas ładowania smaków zobaczysz wskaźnik ładowania. Jeśli Twoje połączenie internetowe jest do tego zbyt szybkie, możesz dodaćsleep(_:) polecenie tuż przedhideLoadingHUD(), abyś mógł doświadczyć dobroci, jaką jest MBProgressHUD. :]

Świetna robota! Klienci mogą teraz wybrać swój ulubiony smak lodów i zobaczyć wskaźnik ładowania podczas pobierania smaków.

gdzie stąd iść?

możesz pobrać ukończony projekt za pomocą przycisku Pobierz Materiały na górze lub na dole tej strony.

Gratulacje! Teraz znasz podstawy korzystania z CocoaPods, w tym tworzenie i modyfikowanie zależności I Zrozumienie wersjonowania semantycznego. Teraz możesz zacząć używać ich we własnych projektach!

z CocoaPods możesz zrobić wiele więcej. Możesz wyszukać istniejące kapsuły na oficjalnej stronie CocoaPods. Zapoznaj się również z przewodnikami CocoaPods, aby poznać najdrobniejsze szczegóły tego doskonałego narzędzia. Ale ostrzegam, gdy zaczniesz go używać, będziesz się zastanawiać, jak kiedykolwiek poradziłeś sobie bez niego! :]

mam nadzieję, że podobało ci się czytanie tego samouczka CocoaPods, tak samo jak ja go pisałem. Jakie są Twoje ulubione Cocoapody? Na których z nich najbardziej polegasz w codziennych projektach? Zachęcamy do dzielenia się lub zadawania pytań w komentarzach poniżej!

raywenderlich.com tygodniowy

raywenderlich.com newsletter to najprostszy sposób, aby być na bieżąco ze wszystkim, co musisz wiedzieć jako programista mobilny.

Otrzymuj cotygodniowy przegląd naszych samouczków i kursów, a otrzymasz darmowy pogłębiony kurs e-mail jako bonus!

Średnia ocena

4.8/5

dodaj ocenę dla tej zawartości

Zaloguj się, aby dodać ocenę

33 oceny

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.