wake-up-neo.net

Verwenden Sie xcodebuild (Xcode 8) und automatische Signatur in CI-Umgebungen (Travis/Jenkins)

Mit der Veröffentlichung von Xcode 8 hat Apple eine neue Art der Verwaltung der Signaturkonfiguration eingeführt. Jetzt haben Sie zwei Optionen Manual und Automatic.

Laut der WWDC 2016-Sitzung über die Codesignatur (WWDC 2016 - 401 - Was ist neu in der Xcode-App-Signierung) , wenn Sie Automatic-Signatur auswählen, wird Xcode angezeigt:

  • Erstellen Sie Signaturzertifikate
  • Erstellen und aktualisieren Sie App-IDs
  • Erstellen und Aktualisieren von Bereitstellungsprofilen

Gemäß den Aussagen von Apple in dieser Sitzung wird Automatic Signing jedoch Development signing verwendet und ist auf von Xcode erstellte Bereitstellungsprofile beschränkt.

Das Problem tritt auf, wenn Sie versuchen, Automatic Signing in einer CI-Umgebung (wie Travis CI oder Jenkins) zu verwenden. Ich kann keinen einfachen Weg finden, Automatic zu verwenden und für die Distribution zu unterschreiben (da Xcode Sie zwingt, Entwicklungs- und von Xcode erstellte Bereitstellungsprofile zu verwenden).

Die neuen "Xcode-erstellten Bereitstellungsprofile" werden nicht im Entwicklerportal angezeigt, obwohl ich sie dann auf meinem Computer finden kann ... sollte ich diese Profile auf den CI-Computer verschieben, für Development erstellen und für Distribution exportieren? Gibt es eine Möglichkeit, den Automatic Signing mit xcodebuild zu überschreiben?

71
pablobart

Nachdem ich einige Optionen ausprobiert hatte, konnte ich diese Lösungen auf meinem CI-Server verwenden:

  • Fügen Sie das Developer-Zertifikat und den privaten Schlüssel sowie die automatisch generierten Bereitstellungsprofile in die CI-Umgebung ein:

Die Verwendung von Automatic signing zwingt Sie zur Verwendung eines Developer-Zertifikats und auto-generated provisioning profiles. Eine Option ist das Exportieren Ihres Entwicklungszertifikats und Ihres privaten Schlüssels (Anwendung -> Dienstprogramme -> Schlüsselbundzugriff) und der automatisch generierten Bereitstellungsprofile auf den CI-Computer. Um die automatisch generierten Bereitstellungsprofile zu finden, navigieren Sie zu ~/Library/MobileDevice/Provisioning\ Profiles/, verschieben Sie alle Dateien in einen Sicherungsordner, öffnen Sie Xcode und archivieren Sie das Projekt. Xcode erstellt automatisch generierte Entwicklungs-Bereitstellungsprofile und kopiert sie in den Ordner Provisioning Profiles.

xcodebuild archive ... erstellt ein für Development signiertes .xcarchive. xcodebuild -exportArchive ... kann dann den Build für Distribution aufgeben 

  • Ersetzen Sie 'Automatisch' durch 'Manuell', wenn Sie eine CI-Umgebung erstellen

Vor dem Aufruf von xcodebuild ist es eine Problemumgehung, alle Instanzen von ProvisioningStyle = Automatic durch ProvisioningStyle = Manual in der Projektdatei zu ersetzen. sed kann für ein einfaches Suchen und Ersetzen in der pbxproj-Datei verwendet werden:

sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' <ProjectName>.xcodeproj/project.pbxproj

@thelvis hat auch ein Ruby-Skript erstellt, um dies mit der xcodeproj gem durchzuführen. Das Skript gibt Ihnen eine bessere Kontrolle über die Änderungen.

xcodebuild verwendet dann die im Projekt festgelegte Codesignaturidentität (CODE_SIGN_IDENTITY) sowie die Bereitstellungsprofile (PROVISIONING_PROFILE_SPECIFIER). Diese Einstellungen können auch als Parameter für xcodebuild bereitgestellt werden und überschreiben die im Projekt festgelegte Codesignaturidentität und/oder das Bereitstellungsprofil.

BEARBEITEN: Mit Xcode 9 verfügt xcodebuild über einen neuen Build-Settings-Parameter CODE_SIGN_STYLE, um zwischen Automatic und Manual zu wählen, sodass keine Instanzen von automatic mit manual in der Projektdatei gesucht und ersetzt werden müssen. Weitere Informationen finden Sie unter WWDC 2017-Sitzung 403 Neuerungen beim Signieren für Xcode und Xcode Server

  • Wechseln Sie zu manuellem Signieren

Durch manuelles Signieren haben Sie die vollständige Kontrolle über die verwendeten Codesignaturen und Bereitstellungsprofile. Es ist wahrscheinlich die sauberste Lösung, aber mit dem Nachteil, dass Sie alle Vorteile der automatischen Signatur verlieren.

Um mehr über das Code-Signieren mit Xcode 8 zu erfahren, empfehle ich wirklich diesen article sowie die WWDC2016-Sitzung 401 - Was ist neu in der Xcode-App-Signierung

34
pablobart

Ich habe im Grunde dasselbe Problem mit Jenkins CI und dem Xcode-Plugin. __ Am Ende habe ich die Build- und Codierungssachen selbst mit xcodebuild erledigt.

0. Voraussetzungen

Um die folgenden Schritte erfolgreich ausführen zu können, müssen Sie die erforderlichen Bereitstellungsprofile und Zertifikate installiert haben. Das bedeutet, dass Ihre Codesignierung bereits allgemein funktionieren sollte.

1. Erstellen eines .xcarchive

xcodebuild -project <path/to/project.xcproj> -scheme <scheme-name> -configuration <config-name> clean archive -archivePath <output-path> DEVELOPMENT_TEAM=<dev-team-id>
  • DEVELOPMENT_TEAM: Ihre 10-stellige Entwicklerteam-ID (etwa A1B2C3D4E5)

2. Export nach .ipa

xcodebuild -exportArchive -archivePath <path/to/your.xcarchive> -exportOptionsPlist <path/to/exportOptions.plist> -exportPath <output-path>

Beispiel für einen exportOptions.plist:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>development</string>
    <key>teamID</key>
    <string> A1B2C3D4E5 </string>
</dict>
</plist>
  • method: ist eine von development, app-store, ad-hoc, enterprise
  • teamID: Ihre 10-stellige Entwicklerteam-ID (etwa A1B2C3D4E5)

Dieser Prozess ist ohnehin näher an dem, was Sie mit Xcode manuell tun würden, als das, was beispielsweise das Jenkins Xcode Plugin macht.

Hinweis: Die .xcarchive-Datei wird immer mit einer Entwicklungssignatur versehen. Wenn Sie jedoch im zweiten Schritt "app-store" als Methode auswählen, wird die richtige Distributionssignierung durchgeführt und das Verteilungsprofil auch als "embedded.mobileprovision" eingeschlossen.

Hoffe das hilft.

58
d4Rk

Ich erwäge eine andere Option, die ich hier noch nicht erwähnt habe. Richten Sie zwei identische Ziele ein, die sich nur in den Signatureinstellungen unterscheiden. 

  • Entwicklungsziel verwendet die automatische Signatur, um all diese Vorteile zu nutzen, wenn neue Geräte/Entwickler hinzugefügt werden
  • CI Target verwendet manuelles Signieren

Nachteil ist, dass Sie zwei identische Ziele verwalten müssen. Ein Vorteil ist, dass Sie die Vorteile des automatischen Signierens für die Entwicklung nutzen können und keine potenziell spröden Skripts verwalten müssen, die Ihr Projekt unmittelbar vor dem Erstellungszeitpunkt ändern.

2
Paul Buchanan

Wenn Sie Xcode 8.x und Jenkins für CI verwenden. Dann würden Sie wahrscheinlich ein Problem mit "Signieren für" YourProjectName "haben, wenn Sie ein Entwicklungsteam benötigen. Wählen Sie im Projekteditor ein Entwicklungsteam aus.

Die Codesignatur ist für den Produkttyp 'Application' im SDK 'iOS 10.1' erforderlich. ** BUILD FAILED ** beim Ausführen des Jobs.

Was ist die Lösung?.

Lösung ist:

  1. setzen Sie das Provisioning-Profil in den Xcode-Einstellungen zum Erstellen von Projekten auf Kein.

  2. Erstellen Sie in jenkins eine Ausführungsshell vor der Xcode-Einstellung und schreiben Sie den folgenden Befehl

    sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' ProjectName.xcodeproj/project.pbxproj 
    

    Denken Sie daran: Führen Sie die Shell vor den Xcode-Einstellungen im Build-Abschnitt von Jenkins aus.

Das funktioniert.

2
Ajeet Sharma

Für mich hat nichts funktioniert. Ich habe mein Problem gelöst, indem ich eine Datei in der Xcode-App geändert habe, die auf Ihrem Mac Mini (CI-Server mit Jenkins) installiert ist.
https://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts/
Außerdem habe ich die automatische Signatur von Xcode deaktiviert.

Alles erledigt! Endlich funktioniert!

1

Ich habe festgestellt, dass mein Unity-Build niemals einen ProvisioningStyle-Schlüssel zu meinem XCode-Projekt hinzugefügt hat. Ich habe dann einen Weg gefunden, den ProvisioningStyle mithilfe eines Build-Skripts "PostProcessBuild" manuell hinzuzufügen. eine Codeeinheit, die aufgerufen wird, nachdem das XCode-Projekt IOS von Unity erstellt wurde. 

Zuerst habe ich mir angesehen, wie die Datei project.pbxproj aussehen sollte - wenn sie auf Manual Provisioning eingestellt ist:

/* Begin PBXDictionary section */
    29B97313FDCFA39411CA2CEA /* Project object */ = {
        isa = PBXProject;
        attributes = {
            TargetAttributes = {
                1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = {
                    ProvisioningStyle = Manual;
                };
                5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = {
                    TestTargetID = 1D6058900D05DD3D006BFB54 /* Unity-iPhone     */;
                };
            };
        };

Dann habe ich meinen Code erstellt, um die "Struktur" der oben angezeigten Datei zu replizieren. (mit dem XCodeEditor-Projekt, das hier gefunden wird: XCodeEditor )

[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget target, string path)
{
    // Create a new project object from build target
    XCProject project = new XCProject(path);

    if (target == BuildTarget.iOS)
    {
        //Add Manual ProvisioningStyle - this is to force manual signing of the XCode project
        bool provisioningSuccess = AddProvisioningStyle(project, "Manual");

        if (provisioningSuccess)
            project.Save();
    }
}

private static bool AddProvisioningStyle(XCProject project, string style)
{
    var pbxProject = project.project;

    var attr = pbxProject.data["attributes"] as PBXDictionary;
    var targetAttributes = attr["TargetAttributes"] as PBXDictionary;

    var testTargetIDGuid = FindValue(targetAttributes, "TestTargetID");

    if (!string.IsNullOrEmpty(testTargetIDGuid))
    {
        var settings = new PBXDictionary();
        //here we set the ProvisioningStyle value
        settings.Add("ProvisioningStyle", style);

        targetAttributes.Add(testTargetIDGuid, settings);

        var masterTest = FindValue(targetAttributes, "ProvisioningStyle");

        if (masterTest == style)
        {
            return true;
        }
    }

    return false;
}

private static string FindValue(PBXDictionary targetAttributes, string key)
{
    foreach (var item in targetAttributes)
    {
        var ma = item.Value as PBXDictionary;

        foreach (var di in ma)
        {
            var lookKey = di.Key;

            if (lookKey == key)
            {
                return di.Value.ToString();
            }
        }
    }

    return "";
}
0
UberGeoff

Es gibt ein Tool namens fastlane , das die Verwendung von xcodebuild erheblich vereinfacht. Es wird beibehalten, wenn neue Updates weiterhin Änderungen an xcode unterstützen. Das Erstellen von Skripts und Konfigurationen für das Erstellen und Codieren Ihrer App unter vielen anderen von Xcode unterstützten Automatisierungswerkzeugen wird erheblich vereinfacht. Ich würde empfehlen, einen Blick darauf zu werfen.

0
lastlink

Für mich war das folgendes: http://code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html

... Kopieren von Zertifikaten aus dem Login-Schlüsselbund in den System-Schlüsselbund .. __ Sie können auch festlegen, dass alle dev-Zertifikate auf "Allen Anwendungen den Zugriff auf dieses Element zulassen" festgelegt sind (Rechtsklick/Informationen abrufen/Zugriffskontrolle).

0
BadmintonCat