Ich habe gerade ein Upgrade auf XCode 6 durchgeführt und versucht, eine mit meiner Entwickler-ID signierte Mac-App zu erstellen. Jetzt erhalte ich jedoch den folgenden Codesign-Fehler:
unsealed contents present in the root directory of an embedded framework
Dies gilt für den von mir verwendeten Dropbox.framework
. Offensichtlich konnte das nicht unterschrieben werden. Was bedeutet der Fehler? Was ist falsch?
Werfen Sie einen Blick auf OS X Code Signing In Depth
Ab OS X Version 10.9.5 wird es Änderungen geben, wie OS X signierte Apps erkennt
Strukturiere dein Bundle entsprechend den Erwartungen für OS X Version 10.9 oder höher:
Das Problem ist die version.txt
-Datei, die sich im Dropbox.framework
befindet. Dies ist zwar nützlich, um zu wissen, um welche Version es sich bei dem Framework handelt, es scheint jedoch nicht mehr in Ordnung zu sein.
Als ich die Datei entfernte, funktionierte alles wieder gut.
Hatte heute das gleiche Problem für mehrere Stunden, als ich versuchte, ein vor-Yosemite-Framework-Paket an Yosemite anzupassen. Das Problem waren letztendlich die von mir erstellten Symlinks, nicht unbedingt Dateien im Verzeichnis.
Anfangs hatte das Paket einen fehlerhaften Symlink im Stammverzeichnis. Ich habe es repariert.
Der Symlink, den ich hinzugefügt habe:
Headers -> Versions/Current/Headers/
Was es sein musste:
Headers -> Versions/Current/Headers
Dieser zusätzliche Schrägstrich ist der Mörder.
Beachten Sie, dass ich zweimal an zwei verschiedenen Stellen gebissen wurde: ich hatte es auch
Current -> 1.8.0/
wo ich brauchte
Current -> 1.8.0
Ich bin kein großer Nixer, also ist das vielleicht ein gesunder Menschenverstand, aber hoffentlich hilft es anderen Windows-Entwicklern wie mir.
Ich bin heute auf ein ähnliches Problem gestoßen ... mein Fehler war "nicht gesiegelter Inhalt in der Bundle-Wurzel". Die Lösung für mich bestand darin, das benutzerdefinierte Symbol zu entfernen, das ich in meiner App hatte. AppName.app/Icon? war irgendwie korrupt ...
Ich habe heute eine Weile recherchiert und keiner der Vorschläge, die ich gefunden habe, hat geholfen. Mein sdl_mixer.framework verfügte über fünf eingebettete Frameworks, die ich nicht an iTunesConnect überholen konnte. Meine Lösung bestand darin, drei davon zu entfernen, die ich eigentlich nicht brauchte, und die anderen beiden wurden meinem Projekt als eigenständige Frameworks hinzugefügt, nicht eingebettet in den sdl_mixer. Hoffentlich hilft das jemandem, ich habe Stunden damit verbracht.
Ich traf das Problem, als ich versuchte, ein anderes Framework zu signieren. Die Antworten hier sind sehr inspirierend. Hier müssen einige Probleme mit der Framework-Struktur auftreten, aber ich habe sie gefunden. Die Struktur scheint richtig zu sein, die Symlinks haben kein "/", es gibt keine zusätzliche Datei (Überprüfung mit ls
) ...
Nach vielen Versuchen bemerkte ich schließlich, dass es einen zusätzlichen .DS_Store
im Framework gibt, was wirklich nervig ist :(
Wenn Sie immer noch auf den Fehler stoßen, prüfen Sie, ob versteckte Dateien vorhanden sind.
Ich hatte das gleiche Problem und für das Löschen des Inhalts des DerivedData-Ordners. Xcode sagt nicht, welche Ressource das Problem verursacht, also habe ich alles von Grund auf neu aufgebaut. Sauber hat auch nicht funktioniert.
In meinem Fall habe ich versucht, eine App mit alten Frameworks zu signieren. Keiner dieser Vorschläge hat geholfen. Es stellte sich heraus, dass ich die PkgInfo-Datei aus einem Framework entfernen musste, damit diese Nachricht verschwindet.
Eine weitere mögliche Ursache für dieses Problem: Wenn Sie iOS- und MacOS-Apps mit demselben Namen und demselben Installationsort erstellen, stellen Sie möglicherweise fest, dass beide in dasselbe Anwendungspaket geschrieben sind. Zuerst legt der iOS-App-Build seinen Inhalt direkt im App-Bundle-Stammverzeichnis ab. Anschließend platziert der macOS-App-Build seinen Inhalt in einem "Contents" -Ordner im App-Bundle.
Ich habe das jetzt zweimal getroffen, deshalb füge ich die Ursachen hinzu, da Codesign sehr undurchsichtig ist und generell ablehnt, Ihnen die problematische Ressource mitzuteilen.
Einmal hatte ich eine vorzeichenlose binäre ausführbare Datei. Jede ausführbare Datei und jedes Framework muss einzeln signiert werden, bevor das Bundle als Ganzes gesungen wird.
Dann habe ich einen anderen Fall getroffen. Ich signiere meinen Code als Teil des Veröffentlichungsprozesses und signiere jede ausführbare Datei und jedes Framework neu. Aber auch Xcode signiert das Bundle und es stellt sich heraus, dass Cruft in _CodeSignature-Ordnern zurückblieb. Bevor ich nun die ausführbaren Dateien und Frameworks und dann das Bundle signiere, entferne ich die generierten _CodeSignature-Ordner von Xcode folgendermaßen:
find MyApp.app -name _CodeSignature -type d -exec rm -rf {} +
Ich hoffe, diese hart erarbeiteten Informationen werden irgendwann irgendwann jemanden retten.