IPA (iPhone) neu signieren

128

Ich erstelle derzeit alle meine Anwendungen mit Hudson mit xcodebuild, gefolgt von einem xcrun ohne Probleme

Ich habe einige IPA-Dateien von verschiedenen Personen erhalten, die ich mit einem Unternehmenskonto anstelle des Unternehmenskontos (für den App Store oder manchmal ad-hoc verteilt) erneut signieren möchte.

Mein Problem ist, dass beim Versuch, die App zu kündigen, sie nicht auf meinem Gerät installiert wird (und dies sollte auch der Fall sein, da es sich um ein Enterprise-Build handelt). Die Fehlermeldung befindet sich auf dem Gerät (nicht in iTunes) und sagt mir einfach, dass die App nicht installiert werden konnte. Es werden keine weiteren Informationen angegeben.

Ich habe einige Informationen gefunden ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- Upload / )

Und das könnte möglich sein. Das Problem, mit dem ich konfrontiert bin, ist, dass das mobile Bereitstellungsprofil nicht wie bei meinen normalen Builds (mit xcrun) eingebettet zu sein scheint. Dies kann mit dem Codesign-Tool gesteuert oder mit xcrun erneut signiert werden ?

Mit meinem Rücktrittsskript mache ich derzeit

  • entpacke app.ipa
  • appname = $ (ls Payload)
  • xcrun -sdk iphoneos PackageApplication -s "$ provisioning_profile" "$ project_dir / Payload / $ appname" -o "$ project_dir / app-resigned.ipa" --sign "$ provisioning_profile" --embed "$ mobileprovision"

Ich habe in der resultierenden ipa-Datei nachgesehen und sie scheint der ursprünglichen App sehr ähnlich zu sein. Welche Dateien sollten sich hier wirklich ändern? Ich dachte anfangs, dass sich die _CodeSignature / CodeResources ändern würden, aber der Inhalt sieht ziemlich genau gleich aus.

Zeiger werden sehr geschätzt.

Erik
quelle

Antworten:

211

Endlich funktioniert das!

Getestet mit einem mit cert1 signierten IPA für die App Store-Übermittlung, ohne dass Geräte im Bereitstellungsprofil hinzugefügt wurden. Das Ergebnis ist eine neue IPA, die mit einem Unternehmenskonto und einem mobilen Bereitstellungsprofil für die interne Bereitstellung signiert ist (das mobile Bereitstellungsprofil wird in die IPA eingebettet).

Lösung:

Entpacken Sie die IPA

unzip Application.ipa

Entfernen Sie die alte CodeSignature

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

Ersetzen Sie das eingebettete Mobile Provisioning-Profil

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

Zurücktreten

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

Neu verpacken

zip -qr "Application.resigned.ipa" Payload

Bearbeiten: Der Berechtigungsteil wurde entfernt (siehe Gassenkommentar, danke)

Erik
quelle
6
Eine Sache, die uns Probleme bereitete, war, dass die Berechtigungsdatei (falls vorhanden) mit der von Apple bereitgestellten App-ID übereinstimmen muss. Da wir die Bundle-ID geändert haben, stimmten die Berechtigungen nicht überein. Die App würde ausgeführt, aber der Schlüsselbund würde nach jedem Lauf gelöscht.
tjg184
5
Laut oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 ist die App-ID in die Binärdatei integriert, sodass Sie nur mit derselben App-ID zurücktreten können. Ich weiß, dass ich nicht mit einer anderen App-ID zurücktreten konnte.
Michael Baltaks
7
@ValerioSantinelli Sie müssen Berechtigungen aus der vorherigen Codesignatur übertragen. FWIW-Push-Benachrichtigungen funktionieren nicht ohne Berechtigungen. Nach dem Entpacken: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appDann während des Rücktritts hinzufügen--entitlements entitlements.plist
Peter
11
Codesign schlägt bei Yosemite fehl - Warnung: --Ressource-Rules sind in Mac OS X veraltet> = 10.10! Payload / Aaa.app / ResourceRules.plist: Ressourcen können nicht gelesen werden
Jibeex
4
Warnung: --resource-rules ist in Mac OS X> = 10.10 veraltet! Payload / Application.app / ResourceRules.plist: Ressourcen können nicht gelesen werden. Erhalten Sie diesen Fehler?
Megha
43

Die Antworten auf diese Frage sind etwas veraltet und es fehlen möglicherweise wichtige Schritte. Dies ist also eine aktualisierte Anleitung zum Installieren einer App von einem externen Entwickler.

----- So kündigen Sie eine iOS-App -----

Angenommen, Sie erhalten eine App (z. B. MyApp.ipa) von einem anderen Entwickler und möchten sie auf Ihren Geräten installieren und ausführen können ( z. B. mithilfe von ideviceinstaller ).

Bereiten Sie neue Signatur-Assets vor

Der erste Schritt besteht darin, ein Bereitstellungsprofil zu erstellen, das alle Geräte enthält, auf denen Sie installieren und ausführen möchten. Stellen Sie sicher, dass das Profil ein Zertifikat enthält, das Sie in Ihrem Schlüsselbundzugriff installiert haben (z. B. iPhone Developer: Some Body (XXXXXXXXXX)). Laden Sie das Profil (MyProfile.mobileprovision) herunter, damit Sie das in die App eingebettete Profil ersetzen können.

Als Nächstes bereiten wir eine Berechtigungsdatei vor, die in die Signatur aufgenommen werden soll. Öffnen Sie Ihr Terminal und führen Sie Folgendes aus.

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

Dadurch wird eine XML-Datei erstellt, die Ihr Bereitstellungsprofil beschreibt . Als nächstes wollen wir die Berechtigungen in eine Datei extrahieren.

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

Ersetzen Sie das Bereitstellungsprofil und geben Sie die App zurück

Wenn Sie mit einer .ipa- Datei arbeiten, entpacken Sie zuerst die App (wenn Sie stattdessen eine .app haben , können Sie diesen Schritt überspringen).

$ unzip MyApp.ipa

Ihr Arbeitsverzeichnis enthält jetzt Payload/und Payload/MyApp.app/. Entfernen Sie als Nächstes die alten Codesignaturdateien.

$ rm -rf Payload/MyApp.app/_CodeSignature

Ersetzen Sie das vorhandene Bereitstellungsprofil (dh embedded.mobileprovision) durch Ihr eigenes.

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

Signieren Sie nun die App mit dem in Ihrem Bereitstellungsprofil enthaltenen Zertifikat und der zuvor erstellten Berechtigungsliste.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

WICHTIG: Sie müssen auch alle in der App enthaltenen Frameworks zurücktreten . Sie finden diese in Payload/MyApp.app/Frameworks. Wenn die App in Swift geschrieben ist oder zusätzliche Frameworks enthält, müssen diese zurückgetreten werden, sonst wird die App installiert, aber nicht ausgeführt.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

Sie können die App jetzt erneut komprimieren.

$ zip -qr MyApp-resigned.ipa Payload

Getan

Sie können das PayloadVerzeichnis jetzt entfernen, da Sie über Ihre ursprüngliche App (MyApp.ipa) und Ihre zurückgetretene Version (MyApp-resigned.ipa) verfügen. Sie können MyApp-resigned.ipa jetzt auf jedem Gerät installieren, das in Ihrem Bereitstellungsprofil enthalten ist.

InnisBrendan
quelle
Wird dieser Ansatz auch für Verteilungsprofile gelten? IE: Kann ich die Berechtigungen extrahieren und aus meiner distro.mobileprovision neu signieren?
Chase Florell
@grez Funktioniert dies auch für die Verteilung von IPAs?
LearneriOS
Ich meine die Verteilung von 'Enterprise'-App-IPAs auch @grez
LearneriOS
@LearneriOS Dies hat bei Enterprise IPA Distribution nicht funktioniert. Ich verwende Sierra, Xcode 8, iOS 10. Die App wird über iTunes installiert, aber sofort nach der Installation gelöscht.
Bryan Bryce
@PhoenixFF Ich bin nicht sicher über die Installation mit iTunes, aber können Sie versuchen, über die Befehlszeile wie folgt zu installieren: $ ideviceinstaller -i myapp.ipa
InnisBrendan
11

Ich habe diese Antwort erfolgreich befolgt, aber da sich die Berechtigungen geändert haben, habe ich einfach den --entitlements "Payload/Application.app/Entitlements.plist"Teil der vorletzten Aussage entfernt, und es hat wie ein Zauber funktioniert.

Alleus
quelle
Ich werde den vorherigen Kommentar an zweiter Stelle setzen. Entfernen Sie die Berechtigungen, damit dies mit dem modernen Toolkit funktioniert.
Bruno Bronosky
2
Ohne Berechtigungen begann meine App tatsächlich seltsam zu funktionieren und gab dies im Protokoll an : SecItemCopyMatching: missing entitlement. Ich habe keine separate Datei "Entitlements.plist". Um die Berechtigungen beizubehalten, habe ich den Kommentar von @ LordT verwendet : Erstellen Sie zuerst eine Berechtigungsdatei: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlementsund verwenden Sie sie dann beim Signieren : --entitlements temp/newEntitlements.
Bulat
5

Überprüft mit Mac OS High Sierra und Xcode 10

Sie können dasselbe einfach mit der Anwendung iResign implementieren .

Geben Sie den Pfad von 1) .ipa an

2) Neues Rückstellungsprofil

3) Berechtigungsdatei (Optional, nur hinzufügen, wenn Sie berechtigt sind)

4) Bundle-ID

5) Vertriebszertifikat

Sie können sehen, dass die IPA-Ausgabedatei nach dem erneuten Signieren gespeichert wird

Einfaches und leistungsstarkes Werkzeug

Saranjith
quelle
4

Keiner dieser zurückgetretenen Ansätze funktionierte für mich, also musste ich etwas anderes ausarbeiten.

In meinem Fall hatte ich eine IPA mit einem abgelaufenen Zertifikat. Ich hätte die App neu erstellen können, aber da wir sicherstellen wollten, dass wir genau dieselbe Version vertreiben (nur mit einem neuen Zertifikat), wollten wir sie nicht neu erstellen.

Anstelle der in den anderen Antworten erwähnten Möglichkeiten zum Rücktritt habe ich mich der Methode von Xcode zum Erstellen eines IPA zugewandt, die mit einem .xcarchive aus einem Build beginnt.

  1. Ich habe ein vorhandenes .xcarchive dupliziert und begonnen, den Inhalt zu ersetzen. (Ich habe die .dSYM-Datei ignoriert.)

  2. Ich habe die alte App aus der alten IPA-Datei extrahiert (per Entpacken; die App ist das einzige, was sich im Payload-Ordner befindet).

  3. Ich habe diese App in das neue .xcarchive verschoben, Products/Applicationsindem ich die dort vorhandene App ersetzt habe.

  4. Ich habe bearbeitet Info.plist, bearbeitet

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Normalerweise habe ich das .xcarchive in den Archivordner von Xcode verschoben /Users/xxxx/Library/Developer/Xcode/Archives.

  6. In Xcode habe ich das Organizer-Fenster geöffnet, dieses neue Archiv ausgewählt und einen regulären Export (in diesem Fall Enterprise) durchgeführt.

Das Ergebnis war eine gute IPA, die funktioniert.

Gary Makin
quelle
1
Dies ist eine geniale Lösung, die ab Xcode 9.2 noch funktioniert. In meinem Fall habe ich gerade die alte .app-Datei unter dem vorhandenen .xcarchive kopiert. Ich habe Info.plist nicht geändert und so blieb die App-Version wie die alte Version, wurde aber mit dem neuen Unternehmenszertifikat signiert.
dodgy_coder
3

Ich denke, am einfachsten ist es, Fastlane zu verwenden:

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"
Marián Černý
quelle
Ich habe viele Möglichkeiten ausprobiert, aber kein Glück. Diese Lösung hat bei mir funktioniert, danke.
Omid Kia
1

Mit der Rücktrittsoption von Fastlane Seufzer können Sie dies sehr einfach tun.

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

Sie können das Profil auch direkt vor dem Befehl mit seufzen herunterladen.

Vineeth
quelle
0

Vielen Dank, Erik, dass du das gepostet hast. Das hat bei mir funktioniert. Ich möchte eine Notiz über einen zusätzlichen Schritt hinzufügen, den ich brauchte. In "Payload / Application.app /" gab es ein Verzeichnis mit dem Namen " CACertChains ", das eine Datei mit dem Namen " cacert.pem " enthielt . Ich musste das Verzeichnis und die .pem entfernen, um diese Schritte abzuschließen. Danke noch einmal! - -

William Power
quelle
-1

Wenn Sie eine App mit Erweiterungen und / oder eine Überwachungs-App haben und mehrere Bereitstellungsprofile für jede Erweiterungs- / Überwachungs-App haben, sollten Sie dieses Skript verwenden, um die IPA-Datei erneut zu signieren.

Skript bei Github neu signieren

Hier ist ein Beispiel für die Verwendung dieses Skripts:

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

Sie können auch andere Erweiterungsbereitstellungsprofile einschließen, indem Sie sie mit einer weiteren Option -p hinzufügen.

Für mich wurden alle Bereitstellungsprofile mit derselben Zertifikat- / Signaturidentität signiert.

U / min
quelle
Ihr Link ist defekt ... Sie haben diese Alternative gefunden, indem Sie sich den Github des Autors angesehen haben. github.com/fastlane/fastlane/blob/…
jugutier
Dies ist eine alte Antwort und sollte wahrscheinlich gelöscht werden, da sie nicht mehr funktioniert, aber es gibt keine Möglichkeit, sie in StackOverflow zu löschen
RPM
1
Dies funktionierte für uns, muss nur den Link dazu aktualisieren: github.com/fastlane/fastlane/blob/…
jugutier
ok gut zu wissen, dass es noch funktioniert. Die ursprüngliche Antwort kann nicht mehr bearbeitet werden, sodass die Leute die Kommentare lesen müssen :)
RPM
Verwenden Sie fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovisionstattdessen.
green0range