13. Juli 2019

Bibliotheken per Swift Package Manager in iOS-Projekte einbinden

Mit Xcode 11 wurde der Swift Package Manager zur Verwendung in iOS-Projekten erweitert. Es können nun damit iOS-Frameworks/Module erstellt werden und diese in Xcode-Projekte eingebunden werden. Damit wird das Tool eine Alternative zu Cocoapods und Carthage für das Verwalten der Abhängigkeiten eines iOS-Projektes.

Das folgende Tutorial zeigt die Schritte zur Einbindung der 3rd-Party-Bibliothek Kingfisher zum asynchronen Laden von Bildern - diese stellt in einem separaten Branch bereits die für den Swift Package Manager benötigten Metadaten bereit.

  1. Lade das Beispielprojekt ImageDownload. Dieses enthält den Grundaufbau für eine App, die Bilder in einem TableViewController anzeigt:

    Simulator Imagedownload Example

  2. Wähle File » Swift Packages » Add Package Dependency… um eine neue Abhängigkeit hinzuzufügen und gib die Clone-URL der Kingfisher-Bibliothek an: https://github.com/onevcat/Kingfisher.git:

    File » Swift Packages » Add Package Dependency…

  3. Gib als Branch xcode11 an:

    Branch angeben

  4. Die Bibliothek wird nun im Projekt eingerichtet und im Projekt Navigator angezeigt:

    Xcode Swift Package Dependencies
  5. Im Projekt unter Swift Packages kann die Versionsangabe geändert werden, z.B. um auf eine neue Version zu aktualisieren:

    Swift Package Version

  6. Verwende die Bibliothek im FruitsTableViewController: Importiere dort das Kingfisher-Modul und verwende die kf-Extension um ein Bild-Download asynchron im Hintergrund zu starten:

    import UIKit
    import Kingfisher
    
    class FruitsTableViewController: UITableViewController {
    
        // ...
        
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            // ...
            let placeholder = UIImage(named: "placeholder")
    cell.fruitImage.kf.indicatorType = .activity
    cell.fruitImage.kf.setImage(with: fruit.image, placeholder: placeholder)
            // ...
        }
        
    }

Fragen & Antworten

Wo wird das ausgecheckte Modul abgelegt?

Im Derived Data Ordner von Xcode:

Xcode Derived Data

Was passiert, wenn das Projekt geöffnet wird ohne das die Bibliothek bereits heruntergeladen wurde?

Die Bibliothek wird von Xcode automatisch heruntergeladen:

Dependency Fetching

Was passiert, wenn eine neue Version der Bibliothek erscheint?

Der verwendete Commit-Hash der Bibliothek wird im Xcode-Projekt unter project.xcworkspace/xcshareddata/swiftpm/Package.resolved abgelegt. Diese Angabe wird verwendet, um die Bibliothek herunterzuladen. Es erfolgt also kein automatisches Update sondern die Version der Bibliothek ist auf diesen Stand festgelegt.

Die Abhängigkeit kann mit File » Swift Packages » Update to Latest Package Versions aktualisiert werden.