Come firmare nuovamente il file ipa?


107

Come faccio a firmare il file .ipa con un profilo di fornitura dopo aver generato un IPA come il seguente con un profilo di fornitura diverso? Vorrei firmare l'IPA con un profilo di provisioning ad-hoc per i beta test, quindi firmare nuovamente l'IPA esatto con un profilo di provisioning per l'invio di app per l'app store.

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}"

1
Possibile duplicato di Re-sign IPA (iPhone)
InnisBrendan

Risposte:


207

È davvero facile da fare dalla riga di comando. Avevo l'essenza di un copione per farlo. Ora è stato incorporato nello script ipa_sign in https://github.com/RichardBronosky/ota-tools che uso quotidianamente. Se hai domande sull'utilizzo di questi strumenti, non esitare a chiedere.

Il cuore è questo:

CODESIGN_ALLOCATE=`xcrun --find codesign_allocate`; export CODESIGN_ALLOCATE
IPA="/path/to/file.ipa"
PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in keychain
# unzip the ipa
unzip -q "$IPA"
# remove the signature
rm -rf Payload/*.app/_CodeSignature
# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision
# sign with the new certificate (--resource-rules has been deprecated OS X Yosemite (10.10), it can safely be removed)
/usr/bin/codesign -f -s "$CERTIFICATE" Payload/*.app
# zip it back up
zip -qr resigned.ipa Payload

La tua nuova app firmata si chiama resigned.ipa


31
7 voti positivi e non una sola domanda. Immagino che la mia bash sia proprio così chiara.
Bruno Bronosky

4
In effetti è gentile, signore.
Rui Peres

3
@RahmathullahMPulikkal Vedo che avevo erroneamente codificato un percorso nella sostanza. Dovresti davvero usare github.com/RichardBronosky/ota-tools/blob/master/ipa_sign invece del succo. È il codice mantenuto.
Bruno Bronosky

5
Potresti ricevere un avviso / errore sui parametri --resource-rules, che sono stati deprecati in OS X Yosemite (10.10), elimina semplicemente questo parametro per risolvere questo problema.
ıɾuǝʞ

4
Una piccola nota: sembra che CodeResourcesora si trovi all'interno della _CodeSignaturecartella, quindi devi solo rimuovere quella cartella.
dadude999

36

Controlla iResign per uno strumento facile su come farlo!

[modifica] dopo un po 'di confusione, ho trovato una soluzione alle dimissioni consapevoli del portachiavi. Puoi verificarlo su https://gist.github.com/Weptun/5406993


c'è qualche strumento che può cambiare il nome visualizzato insieme all'ID bundle durante le dimissioni? Ciò contribuirà ad avere nomi di visualizzazione diversi per ambienti diversi. come App-Dev, App-QA, App-Stage ecc.
Nishanth Nair

1
Sì, floatsign.sh fa esattamente questo.
Blitz

Lavori. Semplice e bello.
Arjun Kalidas

13

Una specie di vecchia domanda, ma con l'ultimo XCode, codesignè facile:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement

2
@Pavel Questa domanda ha ricevuto risposta quando iOS 6.x era l'ultima versione. Da allora, abbiamo avuto due versioni principali, che ovviamente hanno cambiato molte cose. Potresti voler limitare le tue ricerche alle risposte che prendono di mira la tecnologia attuale.
BryanH

Ha funzionato per me. devi sostituire "my_certificate" con il nome della chiave nel tuo portachiavi.
Franziskus Karsunke

2
codesignil comando è utilizzato anche nella risposta @BrunoBronosky. Non sono in grado di usarlo direttamente sul file "* .ipa" e l'opzione "-vv" ritorna sempre code object is not signed at allsui file che so che sono firmati ...
Mariano Paniga

12

Le risposte pubblicate qui non hanno funzionato affatto per me. Principalmente ignoravano la firma di framework incorporati (o includevano i diritti).

Ecco cosa ha funzionato per me (si presume che esista un file ipa nella directory corrente):

PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in the keychain

unzip -q *.ipa
rm -rf Payload/*.app/_CodeSignature/

# Replace embedded provisioning profile
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# Extract entitlements from app
codesign -d --entitlements :entitlements.plist Payload/*.app/

# Re-sign embedded frameworks
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Frameworks/*

# Re-sign the app (with entitlements)
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/

zip -qr resigned.ipa Payload

# Cleanup
rm entitlements.plist
rm -r Payload/

Utile osservazione dal post sopra (Rich): stackoverflow.com/questions/5160863/...
Serzas

9

Il sospiro di Fastlane fornisce una soluzione abbastanza robusta per le dimissioni degli IPA.

Dal loro README:

Dimettersi

Se hai generato il ipafile ma desideri applicare un codice di firma diverso al file ipa, puoi utilizzare sigh resign:

fastlane sigh resign

sigh troverà il file ipa e il profilo di provisioning per te se si trovano nella cartella corrente.

Puoi passare più informazioni utilizzando la riga di comando:

fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

Gestirà anche i profili di provisioning per le applicazioni nidificate (ad es. Se hai app watchkit)


8

Ho aggiornato il codice di Bryan per il mio iMac Sierra:

# this version was tested OK vith macOs Sierra 10.12.5 (16F73) on oct 0th, 2017
# original ipa file must be store in current working directory 

IPA="ipa-filename.ipa"
PROVISION="path-to.mobileprovision"
CERTIFICATE="hexadecimal-certificate-identifier" # must be in keychain
# identifier maybe retrieved by running: security find-identity -v -p codesigning

# unzip the ipa
unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature

# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# generate entitlements for current app
cd Payload/
codesign -d --entitlements - *.app > entitlements.plist
cd ..
mv Payload/entitlements.plist entitlements.plist

# sign with the new certificate and entitlements
/usr/bin/codesign -f -s "$CERTIFICATE" '--entitlements' 'entitlements.plist'  Payload/*.app

# zip it back up
zip -qr resigned.ipa Payload

ho ricevuto il seguente errore entitlements.plist: tipo di blob non riconosciuto (che accetta ciecamente) entitlements.plist: lunghezza non valida nel blob dei diritti
Amr Angry

puoi condividere i contenuti del tuo file di autorizzazione?
Pierre Priot

Ha funzionato come un fascino!
Luis E. Prado

5
  1. Decomprimere il file .ipa cambiando la sua estensione con .zip
  2. Vai a Payload. Troverai il file .app
  3. Fare clic con il pulsante destro del mouse sul file .app e fare clic su Mostra contenuto pacchetto
  4. Elimina la _CodeSignedcartella
  5. Sostituisci il embedded.mobileprovisionfile con il nuovo profilo di fornitura
  6. Vai a KeyChain Access e assicurati che il certificato associato al profilo provvisorio sia presente
  7. Esegui il comando indicato di seguito: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Ora comprimi di nuovo la cartella Payload e cambia l'estensione .zip con .ipa

Spero sia utile.

Per riferimento segui il link sotto indicato: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/


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.