Como assinar novamente o arquivo ipa?


107

Como assino o arquivo .ipa com um perfil de provisionamento depois de gerar um IPA como o seguinte com um perfil de provisionamento diferente? Gostaria de assinar o IPA com um perfil de provisionamento ad-hoc para teste beta e, em seguida, assinar novamente o IPA exato com um perfil de provisionamento de envio de aplicativo para a loja de aplicativos.

/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
Possível duplicata de
— reassinar

Respostas:


207

É realmente fácil de fazer na linha de comando. Eu tinha a essência de um script para fazer isso. Agora ele foi incorporado ao script ipa_sign em https://github.com/RichardBronosky/ota-tools, que uso diariamente. Se você tiver alguma dúvida sobre como usar essas ferramentas, não hesite em perguntar.

O cerne disso é:

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

Seu novo aplicativo assinado é denominado resigned.ipa


31
7 votos positivos e nenhuma pergunta. Acho que minha festa é bem clara.
— Bruno Bronosky

4
Na verdade, é bom senhor.
— Rui Peres

3
@RahmathullahMPulikkal Vejo que codifiquei erroneamente um caminho na essência. Você realmente deveria usar github.com/RichardBronosky/ota-tools/blob/master/ipa_sign em vez da essência. É o código mantido.
— Bruno Bronosky,

5
Você pode receber um aviso / erro nos parâmetros --resource-rules, que estão obsoletos no OS X Yosemite (10.10), simplesmente exclua este parâmetro para resolver este problema.
— ıɾuǝʞ

4
Uma pequena observação: parece que CodeResourcesagora está localizado dentro da _CodeSignaturepasta, então você só precisa remover essa pasta.
— dadude999

36

Verifique iResign para uma ferramenta fácil de como fazer isso!

[editar] depois de alguma confusão, eu encontrei uma solução para a demissão por uso de chaveiro. Você pode conferir em https://gist.github.com/Weptun/5406993


existe alguma ferramenta que pode alterar o nome de exibição junto com a id do pacote durante a desistência? Isso ajudará a ter nomes de exibição diferentes para ambientes diferentes. como App-Dev, App-QA, App-Stage etc.
— Nishanth Nair

1
Sim, o floatsign.sh faz exatamente isso.
— Blitz de

Trabalho. Simples e bonito.
— Arjun Kalidas

13

Uma pergunta meio antiga, mas com o XCode mais recente, codesigné fácil:

$ codesign -s my_certificate example.ipa 

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

2
@Pavel Esta pergunta foi respondida quando o iOS 6.x era a versão mais recente. Desde então, tivemos dois lançamentos importantes, que obviamente mudaram muitas coisas. Você pode querer limitar suas pesquisas a respostas que visam a tecnologia atual.
— BryanH 01 de

Funcionou para mim você deve substituir "my_certificate" pelo nome da chave em seu chaveiro.
— Franziskus Karsunke

2
codesigncomando também é usado na resposta @BrunoBronosky. Não consigo usá-lo diretamente no arquivo "* .ipa", e a opção "-vv" sempre retorna code object is not signed at allnos arquivos que eu sei que estão assinados ...
— Mariano Paniga

12

As respostas postadas aqui não funcionaram bem para mim. Eles principalmente ignoraram a assinatura de estruturas incorporadas (ou incluindo os direitos).

Aqui está o que funcionou para mim (presume-se que exista um arquivo ipa no diretório atual):

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/

Comentário útil da postagem acima (Rich): stackoverflow.com/questions/5160863/…
— Serzas

9

Suspiro de Fastlane fornece uma solução bastante robusta para renunciar IPAs.

Do README:

Demitir-se

Se você gerou seu ipaarquivo, mas deseja aplicar um código diferente de assinatura ao arquivo ipa, pode usar sigh resign:

fastlane sigh resign

sigh encontrará o arquivo ipa e o perfil de provisionamento para você, se eles estiverem localizados na pasta atual.

Você pode passar mais informações usando a linha de comando:

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

Ele até lidará com perfis de provisionamento para aplicativos aninhados (por exemplo, se você tiver aplicativos watchkit)


8

Atualizei o código de Bryan para meu Sierra iMac:

# 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

Eu obtenho o seguinte erro: entitlements.plist: tipo de blob não reconhecido (aceitando cegamente) entitlements.plist: comprimento inválido no blob de direito
— Amr Angry

você pode compartilhar o conteúdo do seu arquivo de direitos?
— Pierre Priot

Funcionou como um encanto!
— Luis E. Prado

5
  1. Descompacte o arquivo .ipa alterando sua extensão para .zip
  2. Vá para Payload. Você encontrará o arquivo .app
  3. Clique com o botão direito no arquivo .app e clique em Mostrar conteúdo do pacote
  4. Exclua o _CodeSigned pasta
  5. Substitua o embedded.mobileprovision arquivo pelo novo perfil de provisão
  6. Vá para KeyChain Access e certifique-se de que o certificado associado ao perfil provisório está presente
  7. Execute o comando abaixo mencionado: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Agora compacte a pasta Payload novamente e altere a extensão .zip com .ipa

Espero que isso seja útil.

Para referência, siga o link mencionado abaixo: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.