Re-assinar o IPA (iPhone)

Eu atualmente construo todas as minhas aplicações com hudson usando xcodebuild seguido por um xcrun sem problemas

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

Meu problema é que, quando tento renunciar ao aplicativo, ele não é instalado no meu dispositivo (e deve ser, já que é uma versão corporativa). A mensagem de erro está no dispositivo (não no iTunes) e me diz simplesmente que não foi possível instalar o aplicativo. Nenhuma informação é dada.

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 eu faço com minhas compilações normais (usando xcrun) isso é possível controlar com a ferramenta codesign, ou é possível assinar novamente com xcrun ?

Com o meu script de renúncia que atualmente faço

  • descompactar app.ipa
  • nome do aplicativo = $ (ls Payload)
  • xcrun -sdk iphoneos PackageApplication -s “$ provisioning_profile” “$ project_dir / Payload / $ nome do aplicativo” -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 devem realmente mudar aqui? Eu inicialmente pensei que o _CodeSignature / CodeResources iria mudar, mas o conteúdo parece exatamente o mesmo.

Ponteiros são muito apreciados.

Finalmente consegui este trabalho!

Testado com um IPA assinado com cert1 para envio da loja de aplicativos sem dispositivos adicionados no perfil de provisionamento. Resulta em um novo IPA assinado com uma conta corporativa e um perfil de fornecimento móvel para implementação interna (o perfil de fornecimento 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 fornecimento 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 

Editar: Removida a parte de Autorização (veja o comentário de becos, obrigado)

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

—– Como renunciar um aplicativo iOS —–

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

Prepare novos ativos de assinatura

O primeiro passo é obter um perfil de provisionamento que inclua todos os dispositivos que você deseja instalar e executar. Assegure-se de que o perfil contenha um certificado que você instalou em seu Acesso de Keychain (por exemplo, iPhone Developer: Some Body (XXXXXXXXXX)). Faça o download do perfil (MyProfile.mobileprovision) para poder replace o perfil incorporado no aplicativo.

Em seguida, vamos preparar um arquivo de direitos para include na assinatura. Abra o 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 o aplicativo

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

 $ unzip MyApp.ipa 

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

 $ rm -rf Payload/MyApp.app/_CodeSignature 

Substitua o perfil de aprovisionamento existente (por exemplo, embedded.mobileprovision) pelo seu próprio.

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

Agora assine o aplicativo com o certificado incluído no seu perfil de provisionamento 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 for escrito no Swift ou include quaisquer estruturas adicionais, elas deverão ser renunciadas ou o aplicativo será instalado, mas não executado.

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

Agora você pode rezipar o aplicativo.

 $ zip -qr MyApp-resigned.ipa Payload 

Feito

Agora você pode remover o diretório Payload desde que você tenha seu aplicativo original (MyApp.ipa) e sua versão resignada (MyApp-resigned.ipa). Agora você pode instalar o MyApp-resigned.ipa em qualquer dispositivo incluído no seu perfil de aprovisionamento.

Eu segui essa resposta com sucesso, mas como os direitos mudaram, eu simplesmente removi a --entitlements "Payload/Application.app/Entitlements.plist" do --entitlements "Payload/Application.app/Entitlements.plist" do segundo para o último --entitlements "Payload/Application.app/Entitlements.plist" , e funcionou como um encanto.

Nenhuma dessas abordagens de resignação estava funcionando para mim, então eu 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 que estávamos distribuindo exatamente a mesma versão (apenas com um novo certificado), não quisemos recriá-lo.

Em vez das formas de resignação mencionadas nas outras respostas, recorri ao método do Xcode de criar um IPA, que começa com um .xcarchive de uma compilation.

  1. Eu dupliquei um .xcarchive existente e comecei a replace o conteúdo. (Eu ignorei o arquivo .dSYM.)

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

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

  4. Eu editei o Info.plist , editando

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

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

O resultado foi um bom IPA que funciona.

Verificado com Mac OS High Sierra e Xcode 9.2

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

Dar caminho de 1) .ipa

2) Novo perfil de provisão

3) Arquivo de direitos (Opcional, adicione somente se você tiver direito)

4) ID do pacote

5) Certificado de Distribuição

Você pode ver o arquivo .ipa de saída salvo após o novo sinal

Ferramenta simples e poderosa

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

 sigh resign -p  -i  

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

Obrigado, Erik, por postar isso. Isso funcionou para mim. Eu gostaria de adicionar uma nota sobre um passo extra que eu precisava. Dentro de “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! –

Se você tiver um aplicativo com extensões e / ou um aplicativo de observação e tiver vários perfis de aprovisionamento para cada aplicativo de extensão / relógio, use esse 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 .mobileprovision -p .mobileprovision -p .mobileprovision -p .mobileprovision resignedYourApp.ipa 

Você também pode include outros perfis de aprovisionamento de extensão adicionando-o a outra opção -p.

Para mim, todos os perfis de provisionamento foram assinados pela mesma identidade de certificado / assinatura.