Firma nuovamente IPA (iPhone)


129

Attualmente costruisco tutte le mie applicazioni con hudson usando xcodebuild seguito da un xcrun senza problemi

Ho ricevuto un paio di file IPA da persone diverse che vorrei firmare nuovamente con un account aziendale anziché con l'account aziendale (per l'app store o talvolta distribuito ad hoc).

Il mio problema è che quando provo a dare le dimissioni l'app, non si installerà sul mio dispositivo (e dovrebbe essere poiché è una build Enterprise). Il messaggio di errore si trova sul dispositivo (non in iTunes) e mi dice semplicemente che non è stato possibile installare l'app. Non vengono fornite ulteriori informazioni.

Ho trovato alcune informazioni, ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- carica / )

E questo potrebbe essere possibile. Il problema che sto affrontando è che non sembra incorporare il profilo di provisioning mobile come faccio con le mie build normali (usando xcrun) è possibile controllare con lo strumento codesign o è possibile ripetere la firma con xcrun ?

Con il mio script di dimissioni attualmente lo faccio

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

Ho cercato nel file ipa risultante e sembra essere molto simile all'app originale. Quali file dovrebbero davvero cambiare qui? Inizialmente pensavo che _CodeSignature / CodeResources sarebbe cambiato, ma il contenuto è praticamente identico.

I puntatori sono molto apprezzati.

Risposte:


212

Finalmente ha funzionato!

Testato con un IPA firmato con cert1 per l'invio dell'app store senza dispositivi aggiunti nel profilo di provisioning. Risultati in un nuovo IPA firmato con un account aziendale e un profilo di provisioning mobile per la distribuzione interna (il profilo di provisioning mobile viene incorporato nell'IPA).

Soluzione:

Decomprimi l'IPA

unzip Application.ipa

Rimuovi la vecchia firma del codice

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

Sostituisci profilo di provisioning mobile incorporato

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

Dimettersi

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

Re-package

zip -qr "Application.resigned.ipa" Payload

Modifica: rimossa la parte dei diritti (vedi commento sui vicoli, grazie)


6
Una cosa che ci ha causato problemi è stato il file Entitlements, se ne hai uno, deve corrispondere all'ID app fornito da Apple. Dato che stavamo cambiando l'id del bundle, i diritti non corrispondevano. L'app verrà eseguita, ma il portachiavi verrà cancellato dopo ogni esecuzione.
tjg184,

5
Secondo oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 l'ID app è incorporato nel file binario, quindi è possibile dimettersi solo utilizzando lo stesso ID app. So che non sono riuscito a dimettermi con un ID app diverso.
Michael Baltaks,

7
@ValerioSantinelli Dovrai trasferire i diritti dalla precedente firma del codice. Le notifiche push di FWIW non funzioneranno senza diritti. Dopo aver decompresso: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appQuindi durante le dimissioni aggiungi--entitlements entitlements.plist
Peter

11
codesign fallisce su Yosemite - Avvertenza: --resource-rules è stato deprecato in Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: impossibile leggere le risorse
Jibeex,

4
Attenzione: --resource-rules è stato deprecato in Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: impossibile leggere le risorse. Ricevi questo errore?
megha,

44

Le risposte a questa domanda sono un po 'obsolete e mancano passaggi potenzialmente chiave, quindi questa è una guida aggiornata per l'installazione di un'app da uno sviluppatore esterno.

----- Come dimettersi da un'app iOS -----

Supponiamo che tu riceva un'app (ad esempio MyApp.ipa) da un altro sviluppatore e desideri poterla installare ed eseguire sui tuoi dispositivi (utilizzando ideviceinstaller , ad esempio).

Preparare nuove risorse di firma

Il primo passo è ottenere un profilo di provisioning che includa tutti i dispositivi che si desidera installare ed eseguire. Assicurati che il profilo contenga un certificato che hai installato nel tuo Accesso Portachiavi (ad es. IPhone Developer: Some Body (XXXXXXXXXX)). Scarica il profilo (MyProfile.mobileprovision) in modo da poter sostituire il profilo incorporato nell'app.

Successivamente, prepareremo un file di diritti da includere nella firma. Apri il tuo terminale ed esegui quanto segue.

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

Questo creerà un file XML che descrive il tuo profilo di provisioning . Successivamente, vogliamo estrarre i diritti in un file.

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

Sostituisci il profilo di provisioning e rassegna l'app

Se stai lavorando con un file .ipa , prima decomprimi l'app (se invece hai un .app , puoi saltare questo passaggio).

$ unzip MyApp.ipa

La tua directory di lavoro conterrà ora Payload/e Payload/MyApp.app/. Quindi, rimuovere i vecchi file di firma del codice.

$ rm -rf Payload/MyApp.app/_CodeSignature

Sostituisci il profilo di provisioning esistente (ad esempio embedded.mobileprovision) con il tuo.

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

Ora firma l'app con il certificato incluso nel tuo profilo di provisioning e il entitlements.plist che hai creato in precedenza.

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

IMPORTANTE: è necessario inoltre dimettersi da tutti i framework inclusi nell'app . Li troverai in Payload/MyApp.app/Frameworks. Se l'app è scritta in Swift o se include framework aggiuntivi, questi devono essere rassegnati o l'app verrà installata ma non eseguita.

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

Ora puoi riaprire l'app.

$ zip -qr MyApp-resigned.ipa Payload

Fatto

È ora possibile rimuovere la Payloaddirectory poiché si dispone dell'app originale (MyApp.ipa) e della versione rassegnata (MyApp-resigned.ipa). Ora puoi installare MyApp-resigned.ipa su qualsiasi dispositivo incluso nel tuo profilo di provisioning.


Questo stesso approccio si applicherà ai profili di distribuzione? IE: posso estrarre i diritti e ri-firmare dalla mia distribuzione distro.mobile?
Chase Florell,

@grez Funzionerà anche per la distribuzione di IPA?
LearneriOS,

Intendo anche la distribuzione di IPA per app "enterprise" @grez
LearneriOS

@LearneriOS Questo non ha funzionato per me con Enterprise IPA Distribution. Sto usando Sierra, Xcode 8, iOS 10. L'app si installa tramite iTunes ma viene eliminata immediatamente dopo l'installazione.
Bryan Bryce il

@PhoenixFF Non sono sicuro di installare con iTunes, ma puoi provare a installare dalla riga di comando in questo modo: $ ideviceinstaller -i myapp.ipa
InnisBrendan

11

Ho seguito con successo questa risposta, ma poiché i diritti sono cambiati, ho semplicemente rimosso la --entitlements "Payload/Application.app/Entitlements.plist"parte della penultima dichiarazione e ha funzionato come un incantesimo.


2 ° il commento precedente. Rimuovi i diritti per farlo funzionare con il moderno toolkit.
Bruno Bronosky,

2
Senza diritti mia app in realtà ha iniziato a lavorare strano, dando a questo nel registro: SecItemCopyMatching: missing entitlement. Non ho il file Entitlements.plist separato, in modo di preservare i diritti che ho usato @ il commento di LordT : innanzitutto creare un file di diritti: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, poi usarlo al momento della firma: --entitlements temp/newEntitlements.
Bulat,

5

Controllato con Mac OS High Sierra e Xcode 10

Puoi semplicemente implementare lo stesso usando l'applicazione iResign .

Dare percorso di 1) .ipa

2) Nuovo profilo di fornitura

3) File di diritti (Opzionale, aggiungere solo se si dispone di diritti)

4) ID pacchetto

5) Certificato di distribuzione

È possibile visualizzare il file .ipa di output salvato dopo la nuova firma

Strumento semplice e potente


4

Nessuno di questi approcci rassicuranti funzionava per me, quindi ho dovuto elaborare qualcos'altro.

Nel mio caso, avevo un IPA con un certificato scaduto. Avrei potuto ricostruire l'app, ma poiché volevamo assicurarci di distribuire esattamente la stessa versione (solo con un nuovo certificato), non volevamo ricostruirla.

Invece dei modi di dimettersi menzionati nelle altre risposte, mi sono rivolto al metodo di Xcode per creare un IPA, che inizia con un archivio .x di una build.

  1. Ho duplicato un file .xcarchive esistente e ho iniziato a sostituire i contenuti. (Ho ignorato il file .dSYM.)

  2. Ho estratto la vecchia app dal vecchio file IPA (tramite decompressione; l'app è l'unica cosa nella cartella Payload)

  3. Ho spostato questa app nel nuovo .xcarchive, Products/Applicationssostituendo l'app che era lì.

  4. Ho modificato Info.plist, modificato

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Di solito ho spostato il .xcarchive nella cartella di archivio di Xcode /Users/xxxx/Library/Developer/Xcode/Archives.

  6. In Xcode, ho aperto la finestra Organizer, ho scelto questo nuovo archivio e fatto un'esportazione regolare (in questo caso Enterprise).

Il risultato è stato un buon IPA che funziona.


1
Questa è una soluzione geniale che funziona ancora a partire da Xcode 9.2. Nel mio caso ho appena copiato il vecchio file .app sotto il .xcarchive esistente. Non ho modificato Info.plist e quindi la versione dell'app è rimasta come la vecchia versione ma è stata firmata con il nuovo certificato aziendale.
dodgy_coder

3

Penso che il modo più semplice sia usare Fastlane:

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"

Ho provato molti modi, ma senza fortuna. Questa soluzione ha funzionato per me grazie.
Omid Kia

1

Con l'opzione di dimissioni di Fastlane sigh puoi farlo molto facilmente.

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

Puoi anche scaricare il profilo usando sigh, appena prima del comando.


0

Grazie, Erik, per aver pubblicato questo. Questo ha funzionato per me. Vorrei aggiungere una nota su un passaggio in più di cui avevo bisogno. All'interno di "Payload / Application.app /" c'era una directory chiamata " CACertChains " che conteneva un file chiamato " cacert.pem ". Ho dovuto rimuovere la directory e il .pem per completare questi passaggi. Grazie ancora! -


-1

Se disponi di un'app con estensioni e / o un'app di controllo e hai più profili di provisioning per ciascuna estensione / app di controllo, devi utilizzare questo script per firmare nuovamente il file ipa.

Riscrivere la sceneggiatura su Github

Ecco un esempio di come utilizzare questo script:

./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

Puoi includere anche altri profili di provisioning delle estensioni aggiungendolo con l'ennesima opzione -p.

Per me - tutti i profili di provisioning sono stati firmati con lo stesso certificato / identità di firma.


Il tuo link è rotto ... ho trovato questa alternativa guardando il github dell'autore. github.com/fastlane/fastlane/blob/…
jugutier,

questa è una vecchia risposta e probabilmente dovrebbe essere eliminata dal momento che non funziona più ma non c'è modo di eliminarla in StackOverflow
RPM

1
Questo ha funzionato per noi,
ho

ok bene sapere che funziona ancora. Non posso più modificare la risposta originale, quindi le persone dovranno leggere i commenti :)
RPM

Usa 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>.mobileprovisioninvece.
green0range,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.