*.ipa neu signieren - Wenn der Entwickler entwickelt und der Kunde veröffentlicht
- 24. Oct. 2019
- Lukas Denker
TLDR
TL;DR:
1. ipa entzippen
2. _CodeSignature löschen
3. Profil austauschen
4. Bundle und Info.plist austauschen
5. App mit codesign --entitlements entitlements.xml -f -s "iPhone Distribution: Company (YXZ)“ Payload/YourAppName.app signieren
6. alles wieder zippen: zip -qr app-resigned.ipa Payload/
In welchen Fällen ist eine Neu-Signierung notwendig?
Normalerweise wird eine App von einem Entwickler für einen Kunden programmiert. Dieser Entwickler kann unabhängig vom Kunden Zertifikate und Profile verwenden und die App fertigstellen.
Da der Kunde die App aber meist nicht unter dem Entwicklername, sondern unter dem Kundenname im AppStore veröffentlichen möchte, müssen die Zertifikate und Profile ausgetauscht werden, weil Apple die App sonst nicht akzeptiert – die App muss neu signiert werden.
Die Neu-Signierung ist nicht notwendig, wenn der Auftraggeber dem Entwickler Zugriff auf sein Profile und die Zertifikate gewährt.
Was ist eine ipa-Datei?
Die ipa-Datei ist das Produkt, dass bei der Entwicklung einer iOS-App entsteht. Diese Datei ist eigentlich ein gezippter Ordner, der
- Programmiercode
- Sprachdateien
- Inhalte wie Bilder, Videos und PDF
- Infos zu Zertifikaten und Profilen
- Infos zu verwendeten Capabilities (z.B. NFC, Siri, PushNotifications, In-App-Käufe)
enthält.
Übermittelt wird diese Datei anschließend per Xcode, Application Loader oder Transporter an AppStoreConnect, wo sie weiterverarbeitet und letztendlich in den Apple AppStore hochgeladen wird.
Voraussetzungen
- Apple Entwickler Account
- iOS Distribution (App Store and Ad Hoc) Zertifikat, dass mit einem Certificate Signing Request (CSR) erstellt wurde
Das CSR muss mit dem MAC erstellt werden, auf dem später die ipa neu signiert wird. Zertifikat muss heruntergeladen und im Schlüsselbund hinterlegt sein (geht per Doppelklick) - gültige App ID
- App Store Distribution Profil, dass mit der App ID und dem Distribution Zertifikat generiert wurde. Profil muss heruntergeladen werden
Anleitung
codesign --entitlements entitlements.xml -f -s "iPhone Distribution: Company (YXZ)“ Payload/YourAppName.app
- ipa entzippen
Verwende hierzu ein Programm das Ordner entzippen kann - Payload-Ordner öffnen
- *.app öffnen
Rechtsklick auf *.app-Datei und Paketinhalt anzeigen - _CodeSignature
Der Ordner "_CodeSignature" muss gelöscht werden. Dieser Ordner wird später neu erstellt - App Store Distribution Profil
Neu erstelltes App Store Distribution Profil in "embedded.mobileprovision" umbenennen und das Vorhandene Profil ersetzten - Info.plist
Info.plist öffnen und Bundle Identifier austauschen -> Speichern - Terminal
mit dem Terminal in den entzippten ipa-Ordner navigieren
liegt der ipa-Odner z.B. auf dem Desktop, get das mit cd Desktop/DeinOrdner - Entitlements übernehmen
Verwendete die App z.B. NFC oder Push Nachrichten ist das in den Entitlements hinterlegt. Diese Datei wird somit auch beim neuen Signieren benötigt. Der Befehl
codesign -dv --entitlements :- YouAppName.app
zeigt die Entitlements an. - Entitlements.xml
- Gibt es Entitlements muss mit
codesign -d --entitlements entitlements.xml Payload/YourAppName.app
eine neue entitlements.xml generiert werden
- entitlements.xml öffnen und application-identifier und team-identifier (wenn vorhanden) austauschen - App signieren
- Mit codesign --entitlements entitlements.xml -f -s "iPhone Distribution: Company (YXZ)“ Payload/YourAppName.app
wird eine neue App signiert
- mit security find-identity werden alle installierten Zertifikate angezeigt - neue ipa erstellen
Damit wir wieder eine Apple-konforme Datei haben, muss alles gezippt und eine ipa erstellt werden
zip -qr app-resigned.ipa Payload/ neue ipa erstellen
Nächste Schritte
Die ipa kann nun mit dem Application Loader bzw Transporter auf AppStore Connect hochgeladen werden.
Beim Upload wird überprüft, ob Entitlements, App Identifier, etc mit den im Profil gespeicherten Informationen übereinstimmen.
Credits
Die Anleitung basiert auf dem Medium-Artikel von Saad El Oulladi und dem Stackoverflow-Beitrag von Erik Engheim.