22. Juni 2018

Xcode Build-Prozess und Signieren von Apps

Build einer Xcode-App

In einem Xcode-Projekt wird in den Targets das Bauen der App durch den Xcode-Build-Prozess konfiguriert. Ein Projekt kann mehrere Targets enthalten, typischerweise ein Target für die App selbst und separate Targets für die separaten, automatisierten Tests des Projektes:

Targets

Insbesondere in den Build Settings kann mit einer Vielzahl von Optionen auf das Verhalten der beim Build beteiligten Werkzeuge wie Compiler und Linker Einfluss genommen werden. Xcode gibt für alle Optionen Standardwerte vor, die für das gesamte Projekt oder für einzelne Build-Targets überschrieben werden können.

Beispielsweise wird über die Build-Einstellung Optimization Level konfiguriert, ob der Compiler optimierten Code generiert. Die Einstellungen können unterschieden werden für die Build-Konfiguration Debug und Release. So wird standardmäßig im Debug-Modus mit der Option Optimization Level die Code-Optimierung deaktiviert, um besser debugbaren Code zu erzeugen:

Xcode Build Settings

Den Xcode-Build führen Sie mit Product » Build ⌘B aus. Bei Problemen mit dem Xcode-Projekt kann es helfen, die Buildergebnisse zurückzusetzen. Dies erreichen Sie über Product » Clean.

Schemas: Xcode-Startkonfiguration

Über ein Schema wird der Start der App in Xcode konfiguriert. Dabei wird zwischen den Varianten unterschieden, die sich im Product-Menü finden. Mit Run wird die App regulär gestartet, Test führt die automatisierten Tests aus, Profile baut die App mit der Release-Konfiguration und startet den Profiler Instruments, Analyze lässt Xcode den Code nach potentiellen Programmierfehlern untersuchen und Archive erstellt einen Release-Build zum Verteilen der App:

Xcode Scheme

Die Schema-Konfiguration kann mit Edit Scheme bearbeitet werden (Alternativ: mit Product » Run wählen). Hier wird beispielsweise unter Build konfiguriert, welche Targets in welcher Variante gebaut werden:

Xcode Scheme: Build

Unter Run ist konfiguriert, mit welcher Build-Konfiguration beim Starten über Product » Run gebaut wird:

Xcode Scheme: Run

Signaturprozess und Ausführen von Apps auf dem Gerät

iOS-Hardwaregeräte führen im Gegensatz zum Simulator nur signierte App-Binaries aus. Voraussetzung für diesen Signaturprozess ist ein Provisoning Profile, das beim Start der App von Xcode automatisch erstellt und auf dem Gerät installiert wird.

Dazu ist eine kostenfreie Apple ID oder die kostenpflichtige Mitgliedschaft im Apple Developer Program notwendig. Die Mitgliedschaft wird benötigt, um Zusatzdienste (wie iCloud oder Push-Benachrichtigen) zu verwenden sowie für das Einstellen von Apps in den App Store.

Der Signaturprozess und die Beschaffung des Provisioning Profiles läuft automatisch ab, sofern im Target die Option Automatically manage signing aktiviert ist. Hier kann auch die zu verwendende Apple ID ausgewählt werden:

Automatically Manage Signing

Für das Signieren der App wird dabei von Xcode automatisch ein privater Schlüssel erstellt. Dieser verbleibt lokal im Schlüsselbund. Zudem wird automatisiert ein Zertifikat beantragt und von Apple ausgestellt, welches das Ausführen von Apps, die mit dem privaten Schlüssel signiert wurden, erlaubt. Beides ist im macOS-Schlüsselbund unter Keys sichtbar:

Zertifikat im macOS-Schlüsselbund

Zudem wird der Unique Device Identifier (UDID) des Gerätes bei Apple registriert und ein Provisioning Profile erstellt, welches auf das Entwicklerzertifikat, die ID der App sowie die Geräte-IDs verweist:

Zertifkate, App-ID, UDIDs -> Provisioning Profile

Dieses Provisoning Profile wird auf dem Gerät installiert und erlaubt die Ausführung von App-Binaries, die mit dem privaten Schlüssel des zugehörigen Zertifikates signiert wurden.

Als Mitglied im Apple-Entwicklerprogramm können Sie die Entwicklerzertifikate und Geräte-IDs im Apple Developer Account unter Certificates, Identifiers & Profiles verwalten:

Verwaltung von Entwicklerzertifikaten und Geräte-IDs im Apple-Entwicklerprogramm

Tutorial 1: Projekt einrichten und bauen

  1. Öffnen Sie das im ersten Kapitel erstellte Flashcards-Projekt in Xcode.

  2. Machen Sie sich anhand der Einstellung Optimization Level mit den Build Settings vertraut. Öffnen Sie dazu die Build Settings und suchen Sie nach optimize:

    Xcode Build Settings
  3. Setzen Sie das Deployment Target in den Projekteinstellungen auf 9.0 um auch noch ältere Geräte zu unterstützen:

    Xcode Deployment Target

    Tipp: Unter iossupportmatrix.com finden Sie eine Übersicht, welche Geräte von welchen iOS-Versionen unterstützt werden.

  4. Bauen Sie das Projekt mit Product » Build ⌘B und prüfen Sie die Buildergebnisse in der Titelzeile und im Report Navigator ⌘9:

    Xcode Build Result
  5. Setzen Sie den Build mit Build » Clean zurück.

  6. Öffnen Sie die Schema-Konfiguration mit Edit Scheme (Alternativ: mit Product » Run wählen):

    Edit Scheme
  7. Prüfen Sie hier unter Run die Einstellung, mit welcher Build Configuration das Projekt gebaut wird:

    Xcode Scheme: Run

Tutorial 2: App auf einem Testgerät ausführen

  1. Verbinden Sie ein iPhone mit dem Mac. Prüfen Sie, dass es unter Window » Devices ⇧⌘2 erscheint. Wählen Sie das Gerät aus und starten Sie die App mit ⌘R auf dem Gerät:

    Schema-Auswahl: iPhone-Gerät

    Falls das Gerät als Inelegible Devices - Device OS version lower than deployment target angezeigt wird, verwenden Sie auf dem Gerät noch eine ältere iOS-Version. Konfigurieren Sie dann in den Projekteinstellungen ein Mindest-Deployment-Target welches der Version auf dem Gerät entspricht, siehe Deployment Target.

    Beim ersten Start einer App auf dem Gerät wird Xcode automatisch ein Provisioning Profile und ein Entwickler-Zertifikat einrichten und auf dem Gerät installieren.

  2. Öffnen Sie den Schlüsselbund und suchen Sie nach iOS Developer, um zu prüfen, dass das Zertifikat und der zugehörige private Schlüssel vorhanden sind:

    iOS Distribution Zertifikat im Schlüsselbund