webentwicklung-frage-antwort-db.com.de

Erstellen von iOS / OSX-Frameworks: Ist es erforderlich, diese vor dem Verteilen an andere Entwickler mit einem Codesign zu versehen?

Ich lerne, wie man iOS- und OSX-Frameworks erstellt. Nehmen wir zum Beispiel iOS, die folgenden Schritte funktionieren bisher für mich:

  1. xcodebuild-Framework mit -sdk iphonesimulator und Build-Aktion
  2. xcodebuild-Framework mit -sdk iphoneos und Build-Aktion
  3. Verwenden Sie das Lipo-Tool, um universelle Binärdateien zu erstellen, sodass lipo -info produziert erwartet:

Architekturen in der Fat-Datei: Foo.framework/Foo sind: i386 x86_64 armv7 arm64

Die Fragen sind:

  1. Ich habe gelesen, dass mein Framework von dem Entwickler, der es verwendet, neu signiert werden kann: "Code Sign on Copy", aber ich verstehe nicht, was die Voraussetzungen dafür sind, z. B. , wenn ich einen Codesign-Schritt hinzufügen soll Codesignieren Sie diese universelle Binärdatei mit meiner Signaturidentität, bevor Sie sie an andere Entwickler weitergeben?

  2. wenn die vorherige positiv ist - sollte ich meine "iPhone Distribution: ..." -Identität oder "iPhone Developer: ..." verwenden, reicht dies aus (damit mein Framework, das Teil eines iOS-Projekts ist, alle Arten von Validierungen besteht, insbesondere die App Store-Validierung ) ?.

Hintergrund für meine Antwort ist der "CodeSign-Fehler: Code-Signierung ist für den Produkttyp 'Framework' im SDK 'iOS 8.3' erforderlich", den ich auf einer Reihe von Frameworks von Drittanbietern gesehen habe und Carthage # 235 oder "Codeobjekt ist überhaupt nicht signiert" (ein Beispiel: Problem, über das ich berichtet habe Realm # 1998 .

Daher möchte ich sicherstellen, dass Benutzer meiner Frameworks bei ihrer Verwendung keine Probleme mit der Codesignierung haben.

P.S. Diese Frage wird noch interessanter, wenn sie nicht auf einen einzelnen Entwickler, sondern auf eine Organisation angewendet wird, die ein Framework-Anbieter ist.

73

Ich eröffnete die Prämie: "Suche nach einer Antwort aus glaubwürdigen und/oder offiziellen Quellen." aber habe solche seitdem nicht erhalten.

Die Antwort von @jackslash ist zwar korrekt, sie erzählt jedoch nur einen Teil der Geschichte. Daher möchte ich meine eigene so schreiben, wie ich es in dem Moment, in dem ich diese Frage gestellt habe, gerne gesehen hätte.

Die Aktualität dieser Antwort ist: Juli 2015. Es ist sehr wahrscheinlich, dass sich die Dinge ändern werden.

Nehmen wir zunächst an, dass die für die korrekte Codesignatur des Frameworks erforderlichen Aktionen in Schritte unterteilt werden sollten, die der Entwickler des Frameworks ausführen muss und Schritte, die der Consumer des Frameworks ausführen muss nehmen.

TLDR;

Für OSX-Framework: Es steht Entwicklern frei, OSX-Framework ohne Codesignierung zu verteilen, da Consumer es trotzdem neu codiert.

Für iOS-Framework: Entwickler können das iOS-Framework kostenlos verteilen, ohne es mit einem Codesign zu versehen, da der Consumer es ohnehin neu mit einem Codesign versehen wird. Entwickler werden jedoch von Xcode gezwungen, ihr Framework mit einem Codesign zu versehen, wenn sie für iOS-Geräte erstellen.

Wegen Radar: "iOS-Frameworks mit Simulator-Slices können nicht an den App Store gesendet werden" Benutzer von iOS-Framework müssen ein spezielles Skript wie ausführen "copy_frameworks" oder "strip_frameworks", die lipo -remove verwenden, um Simulator-Slices vom iOS-Framework zu entfernen und das entfernte Framework neu zu codieren, da an diesem Punkt seine codierende Identität, was auch immer es war (oder nicht war), als Seite entfernt wird Wirkung von lipo -remove Manipulation.

Eine längere Antwort folgt.


Diese Antwort basiert nicht auf glaubwürdigen und/oder offiziellen Quellen, sondern auf einer Reihe von empirischen Beobachtungen.

Empirische Beobachtung # 1: Verbraucher interessiert es nicht, weil sie das Framework, das sie vom Entwickler erhalten, neu codieren

Binäre Framework-Distributionen bekannter Open Source-Projekte auf Github sind nicht mit einem Codesigner versehen. Der Befehl codesign -d -vvvv gibt an: "Codeobjekt ist überhaupt nicht signiert" auf allen binären iOS- und OSX-Frameworks, die ich untersucht habe. Einige Beispiele: ReactiveCocoa und Mantle , Realm , PromiseKit .

Aus dieser Beobachtung geht hervor, dass die Autoren dieser Frameworks beabsichtigen, dass sie von Consumer codiert werden, dh ein Consumer muss entweder das "Code Sign on Copy" -Flag in der von Xcode bereitgestellten "Embed Frameworks" -Erstellungsphase verwenden oder eine benutzerdefinierte Shell verwenden Skript, das dasselbe manuell ausführt: Codesigns Framework im Auftrag des Verbrauchers.

Ich habe kein einziges Beispiel für das Gegenteil gefunden: ein Open-Source-Framework, das mit einer darin enthaltenen Codesigning-Identität verbreitet wird. Daher gehe ich im Rest der Antwort davon aus, dass dieser weit verbreitete Ansatz richtig ist: Es ist nicht erforderlich, dass Framework-Entwickler ihr Framework an andere Entwickler mit darin enthaltener Code-Signatur-Identität verteilen, da Consumer es ohnehin neu codieren wird .

Empirische Beobachtung Nr. 2, die nur für iOS gilt und ausschließlich ein Anliegen des Entwicklers ist

Während es dem Verbraucher egal ist, ob das Framework, das er von Developer erhält, mit einem Code versehen ist oder nicht, muss Developer sein iOS-Framework im Rahmen seines Erstellungsprozesses mit einem Code versehen, wenn er es für iOS-Geräte erstellt Andernfalls wird Xcode nicht erstellt: CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'. So zitieren Sie Justin Spahr-Summers :

OS X-Frameworks müssen beim Erstellen nicht mit einem Code versehen werden ... Leider erfordert Xcode, dass iOS-Frameworks beim Erstellen mit einem Code versehen werden.

Dies ist eine gute Antwort auf meine Frage Nr. 2: "iPhone Developer" -Identität reicht aus, um Xcode so zu definieren, dass es ein iOS-Framework für das Gerät erstellt. Dieser Kommentar zu Karthago # 339 sagt dasselbe.

Empirische Beobachtung # 3: Lipo-Tool

Spezifisches Verhalten von lipo tool: Wenn es auf Framework-Binärdateien angewendet wird, werden alle Codesign-Identitäten immer rekursiv entfernt : lipo -create/-remove codesigned framework ... -> not codesigned framework.

Dies könnte eine Antwort sein, warum alle Beispiele in Beobachtung Nr. 1 überhaupt nicht mit einem Code versehen sind: Ihre mit einem Code versehene Identität wird weggeblasen, nachdem Lipo aufgetragen wurde, aber da es dem Verbraucher gemäß Beobachtung Nr. 1 egal ist, ist es in Ordnung.

Diese Beobachtung ist besonders relevant für die nächste Beobachtung # 4 über AppStore.

Empirische Beobachtung # 4: iOS-Frameworks mit Simulator-Slices können nicht an den App Store gesendet werden

Dies wird ausführlich diskutiert in: Realm # 1163 und Carthage # 188 und Radar wird geöffnet: rdar: // 19209161 .

Dies ist ganz und gar das Anliegen von Consumer: Für das universelle iOS-Framework, das Consumer in seine Anwendung einbezieht, müssen sie beim Erstellen der Anwendung ein spezielles Skript ausführen (benutzerdefinierte Ausführungsphase), mit dem Simulator-Slice aus der Binärdatei dieses Frameworks entfernt werden, damit die App die AppStore-Validierung bestehen kann.

Das gute Beispiel für binäre Frameworks, das ich in Realm gefunden habe: strip-frameworks.sh .

Mit lipo werden alle Architekturen außer ${VALID_ARCHS} entfernt und anschließend mit der Identität des Verbrauchers neu codiert - hier erfolgt die Beobachtung # 3 Kicks in: Das Framework muss aufgrund von Lipo-Manipulationen neu codiert werden.

Carthage hat ein CopyFrameworks.Swift Skript, das dasselbe für alle von Consumer enthaltenen Frameworks ausführt: Es entfernt die Simulator-Slices und codiert das Framework im Auftrag von Consumer neu.

Es gibt auch einen guten Artikel: Entfernen unerwünschter Architekturen aus dynamischen Bibliotheken in Xcode .


Nun die Übersicht der Schritte, die erforderlich sind, um sowohl iOS als auch OSX aus der Sicht von Entwicklern und Verbrauchern zu erstellen. Zuerst das einfachere:

[~ # ~] osx [~ # ~]

Entwickler:

  1. Erstellt ein OSX-Framework
  2. Gibt es dem Verbraucher

Vom Entwickler sind keine Codesigning-Aktivitäten erforderlich.

Verbraucher:

  1. Erhält das OSX-Framework von Developer
  2. Kopiert das Framework in das Frameworks/-Verzeichnis und codiert es automatisch im Namen des Verbrauchers als Teil des "Code Sign on Copy" -Prozesses.

iOS

Entwickler:

  1. Erstellt ein iOS-Framework für das Gerät. Die Codesignierung ist für Xcode erforderlich, die Identität des "iPhone-Entwicklers" ist ausreichend.
  2. Erstellt ein iOS-Framework für den Simulator.
  3. Verwendet Lipo, das das universelle iOS-Framework aus den beiden vorherigen erstellt. Zu diesem Zeitpunkt ist die Codesigning-Identität von 1 Schritt verloren: Universal Framework Binary "ist überhaupt nicht signiert", aber das ist in Ordnung, da "Consumer egal".
  4. Gibt es dem Verbraucher

Verbraucher:

  1. Erhält iOS-Framework vom Entwickler
  2. Kopiert das Framework in das Frameworks/-Verzeichnis (dieser Schritt ist möglicherweise redundant, je nachdem, welches Skript in Schritt 3 ausgeführt wird.)
  3. Verwendet ein spezielles Skript als Teil des Erstellungsprozesses: Dieses Skript entfernt Simulator-Slices aus dem iOS-Framework und kodiert sie dann im Namen des Verbrauchers neu.
115

Das Lesen des verlinkten Threads auf dem Carthage Repo scheint relativ einfach zu sein. Wenn Sie das binäre Framework verteilen, müssen Sie es mit Code signieren, und wenn Sie die Quelle über Carthage oder Cocoa Pods verteilen, tun Sie dies nicht, da diese Tools dies über verschiedene Methoden erledigen.

Der Grund, warum Sie es beim Verteilen des Binär-Frameworks mit Code signieren müssen, ist, dass Xcode ohne Code-Signierung kein Framework-Binary erzeugt. Wenn Sie versuchen, das Binär-Framework nicht mit Code zu signieren, erhalten Sie folgende Fehlermeldung:

CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'

Es spielt keine Rolle, mit welcher Identität Sie das Framework codieren (iPhone Developer oder iPhone Distribution), da das Framework, wie Sie darauf hinweisen, mit der Einstellung "Code Sign On Copy" neu codiert wird. Dies bedeutet, dass Ihr Framework durch das entsprechende Zertifikat aus dem Entwicklerprofil des Framework-Consumers neu codiert wird, wenn Ihr Framework in dessen Anwendung kopiert wird. Dies bedeutet, dass es keine Probleme mit dem App Store gibt, da nur die endgültige Codesignatur vom Framework-Konsumenten angezeigt wird.

Am Ende des Tages können Sie Ihre .framework-Binärdatei auch mit Code signieren, da Sie keinen exotischen Build-Prozess benötigen und Xcode nur signierte Frameworks ausgibt Standardeinstellungen. Es spielt sowieso keine Rolle, da der Endverbraucher es neu signieren wird.

19
jackslash

Die Antwort von Stanislav Pankevich ist sehr richtig und richtig. Beachten Sie jedoch, dass Sie ab Xcode 9.4 von IDE aufgefordert werden, die Codesignatur für iOS Cocoa Touch Frameworks zu deaktivieren. Apple hier sagt jetzt, es wird nicht empfohlen, dass Sie Ihren .framework-Code signieren.

Ich hoffe das hilft.

1
Dino Alves