Vuelva a firmar IPA (iPhone)

129

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

He recibido 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 en ocasiones distribuida ad-hoc).

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

He encontrado alguna 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 posible controlarlo con la herramienta de firma de código o es posible volver a firmar con xcrun? ?

Con mi guión de renuncia actualmente lo hago

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

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

Los punteros son muy apreciados.

Erik
fuente

Respuestas:

212

¡Finalmente lo conseguí!

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

Solución:

Descomprima la IPA

unzip Application.ipa

Eliminar código antiguo Firma

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

Reemplazar el perfil de aprovisionamiento móvil incorporado

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"

Re-paquete

zip -qr "Application.resigned.ipa" Payload

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

Erik
fuente
66
Una cosa que nos causó problemas fue que el archivo de Derechos, si tiene uno, debe coincidir con la identificación de la aplicación proporcionada por Apple. Como estábamos cambiando la identificación del paquete, los derechos no coincidían. La aplicación se ejecutaría, pero el llavero se borraría después de cada ejecución.
tjg184
55
Según oleb.net/blog/2011/06/code-signing-changes-in-xcode-4, la ID de la aplicación está integrada en el binario, por lo que solo puede renunciar utilizando la misma ID de la aplicación. Sé que no pude renunciar con una ID de aplicación diferente.
Michael Baltaks
77
@ValerioSantinelli Deberá transferir los derechos de la firma de código anterior. Las notificaciones push de FWIW no funcionarán sin derechos. Después de descomprimir: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appLuego, durante el anuncio de dimisión--entitlements entitlements.plist
Peter
11
el código de código falla en Yosemite - Advertencia: --resource-rules ha quedado en desuso en Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: no se pueden leer recursos
Jibeex
44
Advertencia: --resource-rules ha quedado en desuso en Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: no puede leer recursos. Obteniendo este error?
megha
44

Las respuestas a esta pregunta están un poco desactualizadas y faltan pasos potencialmente clave, 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 (mediante el uso de 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: Algún cuerpo (XXXXXXXXXX)). Descargue el perfil (MyProfile.mobileprovision) para que pueda reemplazar el perfil incrustado en la aplicación.

A continuación, vamos a preparar un archivo de derechos para incluir 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

Reemplazar el perfil de aprovisionamiento y la aplicación de renuncia

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

$ unzip MyApp.ipa

Su directorio de trabajo ahora contendrá Payload/y Payload/MyApp.app/. Luego, elimine los viejos archivos de firma de código.

$ rm -rf Payload/MyApp.app/_CodeSignature

Reemplace el perfil de aprovisionamiento existente (es decir, embedded.mobileprovision) con el suyo.

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

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

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

IMPORTANTE: también debe renunciar a todos los marcos 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 se deben renunciar 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 puede 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 renunciada (MyApp-resigned.ipa). Ahora puede instalar MyApp-resigned.ipa en cualquier dispositivo incluido en su perfil de aprovisionamiento.

InnisBrendan
fuente
¿Se aplicará este mismo enfoque a los perfiles de distribución? IE: ¿puedo extraer los derechos y volver a firmar desde mi distro.mobileprovision?
Chase Florell
@grez ¿Funcionará esto también para la distribución de IPA?
LearneriOS
Me refiero a la distribución de IPA de aplicaciones 'empresariales' también @grez
LearneriOS
@LearneriOS Esto no funcionó para mí para Enterprise IPA Distribution. Estoy usando Sierra, Xcode 8, iOS 10. La aplicación se instala a través de iTunes pero luego se elimina inmediatamente después de la instalación.
Bryan Bryce
@PhoenixFF No estoy seguro acerca de la instalación con iTunes, pero puedo intentar instalar desde la línea de comandos de la siguiente manera: $ ideviceinstaller -i myapp.ipa
InnisBrendan
11

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

alleus
fuente
Voy a segundo el comentario anterior. Elimine los derechos para que esto funcione con el kit de herramientas moderno.
Bruno Bronosky
2
Sin derechos de mi aplicación en realidad comenzó a trabajar raro, dando a este registro en: SecItemCopyMatching: missing entitlement. No tengo Entitlements.plist archivo separado, de manera de preservar los derechos que utilicé @ comentario de lordt : en primer lugar crear un archivo de derechos: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, entonces utilizar para la firma: --entitlements temp/newEntitlements.
Bulat
5

Comprobado con Mac OS High Sierra y Xcode 10

Simplemente puede implementar lo mismo utilizando la aplicación iResign .

Dar ruta de 1) .ipa

2) Nuevo perfil de provisión

3) Archivo de titularidad (Opcional, agregue solo si tiene derecho)

4) ID del paquete

5) Certificado de distribución

Puede ver el archivo .ipa de salida guardado después de volver a firmar

Herramienta simple y potente

Saranjith
fuente
4

Ninguno de estos enfoques de renuncia funcionaba para mí, así que tuve que resolver algo más.

En mi caso, tenía una IPA con un certificado caducado. Podría haber reconstruido la aplicación, pero como queríamos asegurarnos de que estábamos distribuyendo exactamente la misma versión (solo con un nuevo certificado), no queríamos reconstruirla.

En lugar de las formas de renuncia mencionadas en las otras respuestas, recurrí al método de Xcode para crear una IPA, que comienza con un archivo .xcarchive de una compilación.

  1. Dupliqué un archivo .xcarchive existente y comencé a reemplazar el contenido. (Ignoré el archivo .dSYM).

  2. Extraje la aplicación anterior del archivo IPA anterior (mediante descompresión; la aplicación es lo único en la carpeta Payload)

  3. Moví esta aplicación al nuevo .xcarchive, Products/Applicationsreemplazando la aplicación que estaba allí.

  4. Edité Info.plist, editando

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Moví el archivo .xcarchive a la carpeta de archivo de Xcode, por lo general /Users/xxxx/Library/Developer/Xcode/Archives.

  6. En Xcode, abrí la ventana Organizador, elegí este nuevo archivo e hice una exportación regular (en este caso Enterprise).

El resultado fue una buena IPA que funciona.

Gary Makin
fuente
1
Esta es una solución genial que todavía funciona a partir de Xcode 9.2. En mi caso, acabo de copiar el viejo archivo .app bajo el .xcarchive existente. No cambié Info.plist, por lo que la versión de la aplicación permaneció como la versión anterior, pero se firmó con el nuevo certificado de empresa.
dodgy_coder
3

Creo que lo más fácil es usar 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ý
fuente
Lo intenté de muchas maneras pero no tuve suerte. Esta solución funcionó para mí, gracias.
Omid Kia
1

Con la opción de renuncia de Fastlane Sigh puedes hacer esto muy fácilmente.

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

Puede descargar el perfil usando suspiro también, justo antes del comando.

Vineeth
fuente
0

Gracias, Erik, por publicar esto. Esto funcionó para mí. Me gustaría agregar una nota sobre un paso adicional que necesitaba. Dentro de "Payload / Application.app /" había un directorio llamado " CACertChains " que contenía un archivo llamado " cacert.pem ". Tuve que eliminar el directorio y el .pem para completar estos pasos. ¡Gracias de nuevo! -

William Power
fuente
-1

Si tiene una aplicación con extensiones y / o una aplicación de observación y tiene múltiples perfiles de aprovisionamiento para cada aplicación de extensión / observación, entonces debe usar este script para volver a firmar el archivo ipa.

Re-firmando script en Github

Aquí hay un ejemplo de cómo 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

También puede incluir otros perfiles de aprovisionamiento de extensiones agregándolo con otra opción -p.

Para mí, todos los perfiles de aprovisionamiento fueron firmados por el mismo certificado / identidad de firma.

RPM
fuente
Su enlace está roto ... encontró esta alternativa mirando el github del autor. github.com/fastlane/fastlane/blob/…
jugutier
esta es una respuesta antigua y probablemente debería eliminarse ya que ya no funciona, pero no hay forma de eliminarla en StackOverflow
RPM el
1
Esto funcionó para nosotros, solo necesito actualizar el enlace a esto: github.com/fastlane/fastlane/blob/…
jugutier
Ok, es bueno saber que todavía funciona. Ya no puedo editar la respuesta original para que la gente tenga que leer los comentarios :)
RPM
Usar en su 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>.mobileprovisionlugar.
green0range