Assinar novamente IPA (iPhone)

129

Atualmente, construo todos os meus aplicativos com hudson usando xcodebuild seguido de um xcrun sem problemas

Recebi alguns arquivos IPA de pessoas diferentes que gostaria de assinar novamente com uma conta corporativa em vez da corporativa (para a loja de aplicativos ou, às vezes, com distribuição ad-hoc).

Meu problema é que, quando tento renunciar ao aplicativo, ele não é instalado no meu dispositivo (e deveria, pois é uma versão Enterprise). A mensagem de erro está no dispositivo (não no iTunes) e diz-me simplesmente que não foi possível instalar o aplicativo. Não há mais informações.

Encontrei algumas informações ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- upload / )

E isso pode ser possível. O problema que estou enfrentando é que ele não parece incorporar o perfil de provisionamento móvel, como faço com minhas compilações normais (usando xcrun). Isso é possível de controlar com a ferramenta codesign, ou é possível assinar novamente com xcrun ?

Com o meu script de demissão eu atualmente

  • descompacte 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"

Eu olhei no arquivo ipa resultante e parece ser muito semelhante ao aplicativo original. Quais arquivos realmente devem mudar aqui? Inicialmente, pensei que o _CodeSignature / CodeResources mudaria, mas o conteúdo parece exatamente o mesmo.

Ponteiros são muito apreciados.

Erik
fonte

Respostas:

211

Finalmente consegui este trabalho!

Testado com um IPA assinado com cert1 para envio da loja de aplicativos sem dispositivos adicionados no perfil de provisionamento. Resultados em um novo IPA assinado com uma conta corporativa e um perfil de provisionamento móvel para implantação interna (o perfil de provisionamento móvel é incorporado ao IPA).

Solução:

Descompacte o IPA

unzip Application.ipa

Remover CodeSignature antigo

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

Substituir perfil de provisionamento móvel incorporado

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

Demitir-se

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

Reembalar

zip -qr "Application.resigned.ipa" Payload

Edit: Removida a parte de Titularidade (veja o comentário dos becos, obrigado)

Erik
fonte
6
Uma coisa que nos causou problemas foi o arquivo de direitos, se você tiver um, deve corresponder ao ID do aplicativo fornecido pela Apple. Como estávamos alterando o ID do pacote, os direitos não corresponderam. O aplicativo seria executado, mas o chaveiro seria limpo após cada execução.
precisa saber é o seguinte
5
De acordo com oleb.net/blog/2011/06/code-signing-changes-in-xcode-4, o ID do aplicativo é incorporado no binário, portanto, você só pode renunciar usando o mesmo ID do aplicativo. Sei que não consegui me demitir com um ID de aplicativo diferente.
Michael Baltaks
7
@ValerioSantinelli Você precisará transferir direitos da assinatura de código anterior. As notificações por push do FWIW não funcionarão sem direitos. Após descompactar: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appEntão, durante o suplemento renunciar--entitlements entitlements.plist
Peter
11
o código de falha no Yosemite - Aviso: --resource-rules foi descontinuado no Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: não pode ler recursos
Jibeex
4
Aviso: --resource-rules foi descontinuado no Mac OS X> = 10.10! Carga útil / Application.app / ResourceRules.plist: não é possível ler os recursos. Está recebendo este erro?
megha
44

As respostas a esta pergunta estão um pouco desatualizadas e faltam etapas potencialmente importantes, portanto, este é um guia atualizado para instalar um aplicativo de um desenvolvedor externo.

----- Como renunciar a um aplicativo iOS -----

Digamos que você receba um aplicativo (por exemplo, MyApp.ipa) de outro desenvolvedor e deseje poder instalá-lo e executá-lo em seus dispositivos (usando o ideviceinstaller , por exemplo).

Preparar novos ativos de assinatura

A primeira etapa é obter um perfil de provisionamento que inclua todos os dispositivos que você deseja instalar e executar. Verifique se o perfil contém um certificado que você instalou no seu Keychain Access (por exemplo, iPhone Developer: Some Body (XXXXXXXXXX)). Faça o download do perfil (MyProfile.mobileprovision) para poder substituir o perfil incorporado no aplicativo.

Em seguida, prepararemos um arquivo de direitos para incluir na assinatura. Abra seu terminal e execute o seguinte.

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

Isso criará um arquivo xml descrevendo seu perfil de provisionamento . Em seguida, queremos extrair os direitos em um arquivo.

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

Substituir o perfil de provisionamento e renunciar ao aplicativo

Se você estiver trabalhando com um arquivo .ipa , primeiro descompacte o aplicativo (se você tiver um .app , poderá pular esta etapa).

$ unzip MyApp.ipa

Seu diretório de trabalho agora conterá Payload/e Payload/MyApp.app/. Em seguida, remova os arquivos antigos de assinatura de código.

$ rm -rf Payload/MyApp.app/_CodeSignature

Substitua o perfil de provisionamento existente (por exemplo, built.mobileprovision) pelo seu.

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

Agora assine o aplicativo com o certificado incluído no seu perfil de fornecimento e os entitlements.plist que você criou anteriormente.

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

IMPORTANTE: você também deve renunciar a todas as estruturas incluídas no aplicativo . Você os encontrará em Payload/MyApp.app/Frameworks. Se o aplicativo estiver escrito em Swift ou se incluir estruturas adicionais, elas deverão ser renunciadas ou o aplicativo será instalado, mas não será executado.

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

Agora você pode compactar novamente o aplicativo.

$ zip -qr MyApp-resigned.ipa Payload

Feito

Agora você pode remover o Payloaddiretório, pois possui seu aplicativo original (MyApp.ipa) e sua versão renunciada (MyApp-resigned.ipa). Agora você pode instalar o MyApp-resigned.ipa em qualquer dispositivo incluído no seu perfil de provisionamento.

InnisBrendan
fonte
Essa mesma abordagem será aplicada aos perfis de distribuição? IE: posso extrair os direitos e assinar novamente da minha distro.mobileprovision?
Perseguição Florell
@grez Isso também funcionará na distribuição de IPAs?
LearneriOS
I distribuição média de IPAs app 'empresa' bem @grez
LearneriOS
@LearneriOS Isso não funcionou para mim no Enterprise IPA Distribution. Estou usando o Sierra, Xcode 8, iOS 10. O aplicativo é instalado via iTunes, mas é excluído imediatamente após a instalação.
Bryan Bryce
@PhoenixFF não estou certo sobre a instalação com o iTunes, mas você pode tentar instalar a partir da linha de comando como este: $ ideviceinstaller -i myapp.ipa
InnisBrendan
11

Eu segui com sucesso essa resposta, mas como os direitos mudaram, simplesmente removi a --entitlements "Payload/Application.app/Entitlements.plist"parte da penúltima declaração e ela funcionou como um encanto.

tudo
fonte
Vou o segundo comentário anterior. Remova os direitos para fazer isso funcionar com o kit de ferramentas moderno.
precisa saber é o seguinte
2
Sem direitos meu aplicativo, na verdade, começou a trabalhar estranha, dando a este no log: SecItemCopyMatching: missing entitlement. Eu não tenho arquivo Entitlements.plist separado, de modo a preservar os direitos que eu usei @ comentário de LordT : primeiro criar um arquivo de direitos: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, em seguida, usá-lo no momento da assinatura: --entitlements temp/newEntitlements.
Bulat
5

Verificado com o Mac OS High Sierra e o Xcode 10

Você pode simplesmente implementar o mesmo usando o aplicativo iResign .

Dê o caminho de 1) .ipa

2) Novo perfil de provisão

3) Arquivo de direitos (opcional, adicione apenas se você tiver direitos)

4) ID do pacote

5) Certificado de Distribuição

Você pode ver o arquivo .ipa de saída salvo após a nova assinatura

Ferramenta simples e poderosa

Saranjith
fonte
4

Nenhuma dessas abordagens de demissão funcionava para mim, então tive que trabalhar em outra coisa.

No meu caso, eu tinha um IPA com um certificado expirado. Eu poderia ter reconstruído o aplicativo, mas como queríamos garantir a distribuição exata da mesma versão (apenas com um novo certificado), não queríamos reconstruí-lo.

Em vez das formas de renúncia mencionadas nas outras respostas, eu me virei para o método do Xcode de criar um IPA, que começa com um .xcarchive de uma compilação.

  1. Dupliquei um .xcarchive existente e comecei a substituir o conteúdo. (Ignorei o arquivo .dSYM.)

  2. Extrai o aplicativo antigo do arquivo IPA antigo (via descompactação; o aplicativo é a única coisa na pasta Payload)

  3. Mudei este aplicativo para o novo .xcarchive, Products/Applicationssubstituindo o aplicativo que estava lá.

  4. Eu editei Info.plist, editando

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Mudei o .xcarchive para a pasta de arquivos do Xcode, normalmente /Users/xxxx/Library/Developer/Xcode/Archives.

  6. No Xcode, abri a janela do Organizer, peguei esse novo arquivo e fiz uma exportação regular (neste caso, Enterprise).

O resultado foi um bom IPA que funciona.

Gary Makin
fonte
1
Esta é uma solução genial que ainda funciona a partir do Xcode 9.2. No meu caso, apenas copiei o arquivo .app antigo no arquivo .xcarchive existente. Não mudei o Info.plist e, portanto, a versão do aplicativo permaneceu como a versão antiga, mas foi assinada com o novo certificado corporativo.
Dodgy_coder 12/0318
3

Eu acho que o mais fácil é usar o 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"
Marián Černý
fonte
Eu tentei de várias maneiras, mas sem sorte. Esta solução funcionou para mim obrigado.
Omid Kia
1

Com a opção de demissão do Fastlane suspiro, você pode fazer isso com muita facilidade.

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

Você pode fazer o download do perfil usando o suspiro também, pouco antes do comando.

Vineeth
fonte
0

Obrigado, Erik, por postar isso. Isso funcionou para mim. Gostaria de adicionar uma nota sobre uma etapa extra que eu precisava. Em "Payload / Application.app /", havia um diretório chamado " CACertChains " que continha um arquivo chamado " cacert.pem ". Eu tive que remover o diretório e o .pem para concluir essas etapas. Obrigado novamente! -

William Power
fonte
-1

Se você possui um aplicativo com extensões e / ou um aplicativo de monitoramento e possui vários perfis de provisionamento para cada aplicativo de extensão / monitoramento, use este script para assinar novamente o arquivo ipa.

Assinando novamente o script no Github

Aqui está um exemplo de como usar este 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

Você também pode incluir outros perfis de provisionamento de extensões, adicionando-o com outra opção -p.

Para mim - todos os perfis de provisionamento foram assinados pelo mesmo certificado / identidade de assinatura.

RPM
fonte
Seu link está quebrado ... encontre essa alternativa consultando o github do autor. github.com/fastlane/fastlane/blob/…
jugutier
esta é uma resposta antiga e provavelmente deve ser excluída, pois não funciona mais, mas não há como excluí-la no StackOverflow
RPM
1
Isso funcionou para nós, basta atualizar o link para isso: github.com/fastlane/fastlane/blob/…
jugutier
ok é bom saber que ainda funciona. Editar Cant a resposta original mais que as pessoas vão ter que ler os comentários :)
RPM
Use em 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>.mobileprovisionvez disso.
green0range