Volver a firmar IPA (iPhone)

Resuelto Erik asked hace 13 años • 12 respuestas

Actualmente construyo todas mis aplicaciones con Hudson usando xcodebuild seguido de xcrun sin ningún problema.

Recibí un par de archivos IPA de diferentes personas que me gustaría volver a firmar con una cuenta empresarial en lugar de la cuenta corporativa (para la tienda de aplicaciones o, a veces, distribuida ad hoc).

Mi problema es que cuando intento cerrar la aplicación, no se instala en mi dispositivo (y debería hacerlo, ya que es una versión Enterprise). El mensaje de error está en el dispositivo (no en iTunes) y simplemente me dice que no se pudo instalar la aplicación. No se da más información.

Encontré información ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- subir/ )

Y esto podría ser posible. El problema al que me enfrento es que no parece incrustar el perfil de aprovisionamiento móvil como lo hago con mis compilaciones normales (usando xcrun). ¿Es esto posible controlarlo con la herramienta de diseño de código o es posible volver a firmar con xcrun? ?

Con mi guión de renuncia que hago actualmente

  • descomprimir aplicación.ipa
  • nombre de la aplicación=$(ls carga útil)
  • xcrun -sdk iphoneos PackageApplication -s "$provisioning_profile" "$project_dir/Payload/$appname" -o "$project_dir/app-resigned.ipa" --sign "$provisioning_profile" --embed "$mobileprovision"

Miré el archivo ipa resultante y parece ser muy similar a la aplicación original. ¿Qué archivos realmente deberían cambiar aquí? Inicialmente pensé que _CodeSignature/CodeResources cambiaría, pero el contenido se ve prácticamente igual.

Se agradecen mucho los consejos.

Erik avatar Aug 01 '11 15:08 Erik
Aceptado

¡Finalmente esto funcionó!

Probado con una IPA firmada con cert1 para el envío a la tienda de aplicaciones sin dispositivos agregados en el perfil de aprovisionamiento. Da como resultado una nueva IPA firmada con una cuenta empresarial y un perfil de aprovisionamiento móvil para implementación interna (el perfil de aprovisionamiento móvil se integra en la IPA).

Solución:

Descomprima la API

unzip Application.ipa

Eliminar la antigua firma de código

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

Reemplazar el perfil de aprovisionamiento móvil integrado

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

Renunciar

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

Reempaquetar

zip -qr "Application.resigned.ipa" Payload

Editar: se eliminó la parte de Derechos (ver comentario de callejones, gracias)

Erik avatar Aug 03 '2011 04:08 Erik

Las respuestas a esta pregunta están un poco desactualizadas y faltan pasos potencialmente claves, por lo que esta es una guía actualizada para instalar una aplicación de un desarrollador externo.

----- Cómo renunciar a una aplicación de iOS -----

Supongamos que recibe una aplicación (por ejemplo, MyApp.ipa) de otro desarrollador y desea poder instalarla y ejecutarla en sus dispositivos (utilizando ideviceinstaller , por ejemplo).

Preparar nuevos activos de firma

El primer paso es obtener un perfil de aprovisionamiento que incluya todos los dispositivos que desea instalar y ejecutar. Asegúrese de que el perfil contenga un certificado que haya instalado en su Acceso a Llaveros (por ejemplo, Desarrollador de iPhone: Some Body (XXXXXXXXXX)). Descargue el perfil (MyProfile.mobileprovision) para poder reemplazar el perfil incrustado en la aplicación.

A continuación, vamos a preparar un archivo de derechos para incluirlo en la firma. Abre tu terminal y ejecuta lo siguiente.

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

Esto creará un archivo xml que describe su perfil de aprovisionamiento . A continuación, queremos extraer los derechos en un archivo.

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

Reemplace el perfil de aprovisionamiento y renuncie a la aplicación

Si está trabajando con un archivo .ipa , primero descomprima la aplicación (si tiene un archivo .app , puede omitir este paso).

$ unzip MyApp.ipa

Su directorio de trabajo ahora contendrá Payload/y Payload/MyApp.app/. A continuación, elimine los archivos de firma de código antiguos.

$ rm -rf Payload/MyApp.app/_CodeSignature

Reemplace el perfil de aprovisionamiento existente (es decir, embeded.mobileprovision) por el suyo propio.

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

IMPORTANTE: También debes renunciar a todos los frameworks incluidos en la aplicación . Los encontrarás en Payload/MyApp.app/Frameworks. Si la aplicación está escrita en Swift o si incluye marcos adicionales, estos deben cancelarse o la aplicación se instalará pero no se ejecutará.

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

Ahora firme la aplicación con el certificado incluido en su perfil de aprovisionamiento y el archivo entitlements.plist que creó anteriormente.

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

Ahora puedes volver a comprimir la aplicación.

$ zip -qr MyApp-resigned.ipa Payload

Hecho

Ahora puede eliminar el Payloaddirectorio ya que tiene su aplicación original (MyApp.ipa) y su versión resignada (MyApp-resigned.ipa). Ahora puede instalar MyApp-resigned.ipa en cualquier dispositivo incluido en su perfil de aprovisionamiento.

InnisBrendan avatar May 11 '2016 20:05 InnisBrendan

Creo que lo más sencillo es utilizar Fastlane:

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "Apple Distribution: Company Name" -p "my.mobileprovision"
Marián Černý avatar Jun 03 '2019 11:06 Marián Černý

Seguí con éxito esta respuesta, pero como los derechos cambiaron, simplemente eliminé la --entitlements "Payload/Application.app/Entitlements.plist"parte de la penúltima declaración y funcionó de maravilla.

alleus avatar Apr 02 '2012 14:04 alleus