Después de estas instrucciones (véase también Documentación para desarrolladores de Apple y la respuesta de BoltClock a Probar la aplicación iOS en el dispositivo sin el programa de desarrolladores de apple o Jailbreak ), pude compilar una aplicación iOS (en este caso procedencia (una aplicación emuladora de consolas de videojuegos que no cumple con las directrices de Apple y nunca será permitida en la App Store de Apple) en Xcode 7, firmarla con mi cuenta personal de iCloud, cargarla lateralmente en mi iPhone (conectándola a mi Mac por USB, y seleccionando mi iPhone en el menú de xcode -> Producto -> Destino), y permitir que mi teléfono la ejecute "confiando" en las aplicaciones con esta firma en Ajustes -> General -> Perfil, que instala el certificado asociado a mi cuenta de icloud en el dispositivo.
Me gustaría replicar estos pasos con una descarga aérea. ¿Puedo hacer que Xcode produzca un ejecutable que pueda compartir con mi hermano, que tiene un iPhone, pero no tiene acceso a un Mac con Xcode?
La red StackExchange logró algo así aparentemente para su programa beta de aplicaciones iOS, utilizando la distribución empresarial de Apple a través de Mobile Device Management, como se menciona en esta pregunta . También está el BuildStore ( http://builds.io/ ), que por 10 dólares al año también permite esta funcionalidad, aparentemente añadiendo usuarios a un "equipo de desarrolladores" asociado a una cuenta de pago del Programa de Desarrolladores de Apple (ver Documentos de desarrollo de Apple ). Con Xcode 7, ¿es posible hacer algo así sin una cuenta de desarrollador empresarial o incluso de pago?
actualizar: Gracias a la ayuda de Stacksza, he hecho algunos progresos, que voy a resumir aquí.
- XCode creará un archivo (Producto -> Archivo), pero no permite exportar un archivo a un fichero .ipa para su distribución ad hoc sin suscribirse al nivel de cuenta ADP de pago.
- Sin embargo, no hay problema, porque la herramienta de línea de comandos xcode hace crear un ejecutable .ipa, incluso sin una cuenta ADP de pago. Utilice un comando como
xcodebuild -exportArchive -archivePath Provenance-Release\ 11-20-15\,\ 22.24.xcarchive/ -exportOptionsPlist ~/manifest.plist -exportPath ~/Provenance
(véase la respuesta de Khawar en ¿Cómo crear ipa en xcode 6 sin cuenta de desarrollador de Apple? ) - Pero este comando requiere que se especifique un archivo de manifiesto .plist. La respuesta de Razvan en ¿Distribución de archivos IPA de iOS por aire (OTA) para el público? contiene un manifest.plist de ejemplo, así como instrucciones para el formato de hipervínculo necesario para proporcionar un enlace de descarga, que debe estar alojado en una página web SSL. Puede ser que la URL SSL deba matematizar el ID del paquete de la aplicación, no estoy seguro.
- Pero lo anterior sólo funciona si la aplicación está aprovisionada para el dispositivo que la descarga, y el dispositivo ya ha instalado el certificado de desarrollador. Así que, por ejemplo, un dispositivo que se ha conectado previamente a través de USB a mi Xcode ahora puede descargar la aplicación a través del aire, lo cual es genial. Esto es un progreso. Pero para los dispositivos limpios, obtengo el error
Could not install embedded profile: 0xe8008012 (This provisioning profile cannot be installed on this device.)
(como se ve en la consola del dispositivo, que se puede ver en Xcode -> Ventana -> Dispositivos, o bien en la aplicación Apple Configurator). - Para que una aplicación se aprovisione para un dispositivo, tiene que contener el UDID del dispositivo en el
embedded.mobileprovision
archivo, véase Cómo incrustar un perfil de aprovisionamiento en una aplicación iOS , ¿Cómo automatizar la comprobación de un campo en el embedded.mobileprovision de una ipa? , ¿Cómo averiguar qué perfil se ha utilizado para crear el archivo *.ipa? y ¿Hay alguna forma de ver qué UDID se incluyen en una compilación? . Sin embargo, no se puede simplemente editar este archivo para añadir el UDID, porque entonces la CODESIGNATURA de la aplicación no coincide, y el dispositivo informará del errorFailed to verify code signature of /private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.7jBjpk/extracted/Payload/Provenance.app : 0xe8008017 (A signed resource has been added, modified, or deleted.)}
- Ok, entonces tenemos que renunciar a la aplicación. Xcode proporciona una herramienta de línea de comandos llamada
codesign
que puede hacer esto. Las instrucciones se encuentran en ¿Cómo volver a firmar el archivo ipa? y Volver a firmar IPA (iPhone) y Renuncie a una aplicación de iPhone, inserte un nuevo ID de paquete y envíelo a Xcode Organizer para cargarlo y Cómo volver a firmar manualmente un IPA con un nuevo perfil de aprovisionamiento . Tuve que especificar mi certificado de desarrollador, cuyo nombre exacto se encuentra en Keychain Access, en la pestaña Certificados, y tiene el aspecto de "iPhone Developer: username@mac.com (ABCDEFGHIJ)". Entonces el comando es comocodesign -f -s "iPhone Developer: username@mac.com (ABCDEFGHIJ)" Payload/Provenance.app
. Los comandos de ejemplo en las instrucciones anteriores incluían una bandera llamada--resource-rules
pero no encontré tal archivo en mi aplicación compilada, así que eliminé esa bandera. Me pregunto qué hace y si es necesario. Editar: El excelente artículo del blog Firma de código interior de Thomas Kollbach explica que el--resource-rules
solía utilizarse para indicar qué partes de una aplicación debían estar firmadas, pero desde iOS8 está obsoleta, y toda la aplicación debe estar firmada. - Ahora que la aplicación tiene el UDID añadido y está firmada, al descargarla en el dispositivo nuevo aparecen los errores
Could not install embedded profile: 0xe8008003 (This provisioning profile is malformed
yA valid provisioning profile for this executable was not found
. Supongo que el problema ahora es que el dispositivo todavía no ha instalado el certificado de desarrollador. Cuando se realiza la carga lateral a través de Xcode, antes de que la aplicación se ejecute, tienes que encontrar el certificado instalado en Ajustes -> General -> Perfil, seleccionar tu certificado y tocar "confiar". Sin embargo, esta opción no aparece después de la descarga por aire de la aplicación ad hoc, por lo que no estoy seguro de cómo proceder. Creo que necesito alguna forma de instalar el certificado de desarrollador en el dispositivo. Según Instalación del perfil de aprovisionamiento en iOS 8.0.2 Antes era posible simplemente enviando el certificado por correo electrónico al dispositivo, pero eso ya no funciona a partir de iOS 8. No he intentado confirmarlo. ¿Cómo puedo instalar mi certificado de desarrollador en un dispositivo iOS de forma remota? - Intenté exportar mi certificado de desarrollador del iPhone desde Keychain Access y enviarlo por correo electrónico al dispositivo. El dispositivo pudo instalar el certificado, pero mostró una advertencia roja de que no estaba firmado, mientras que cuando el certificado se instaló a través de Xcode/USB no tenía esa advertencia. Según Rhythmic Fistman en ¿es posible volver a cifrar un archivo embedded.mobileprovision? El perfil debe estar firmado por Apple para que funcione. Este puede ser el punto conflictivo. Apple sólo firmará tu certificado si tienes una cuenta ADP de pago.
-
Esta entrada del blog sobre aprovisionamiento de Sean Heber fue muy esclarecedor sobre la teoría general de los certificados de desarrollador y los perfiles de aprovisionamiento (junto con Kollbach's ambos deberían ser de lectura obligatoria). Contiene este párrafo:
La razón por la que todo esto funciona y es seguro es que Apple genera los perfiles de aprovisionamiento en el portal y luego los firma con sus propias claves privadas antes de entregártelos. La firma de los perfiles de aprovisionamiento es algo que sólo puede hacer Apple. Por lo tanto, el archivo que se descarga no puede ser manipulado sin que sea inválido. Un perfil de aprovisionamiento inválido no será aceptado por iOS y, por lo tanto, Apple puede controlar exactamente lo que puede y no puede ser aprovisionado por un desarrollador simplemente restringiendo el acceso a la firma del perfil de aprovisionamiento a las cosas que el portal del desarrollador le da permiso para configurar en primer lugar - a pesar de que los perfiles de aprovisionamiento pueden soportar cualquier número de otras opciones impresionantes que no se puede utilizar sin jailbreak. Esta es la razón por la que tienes que registrar los dispositivos de prueba en el portal, añadir tus certificados al portal, etc - sólo las cosas en el portal (y por lo tanto los números de los cuales pueden ser controlados y limitados arbitrariamente por Apple) pueden ser incluidos en un perfil de aprovisionamiento generado y debidamente firmado. El portal es donde se aplican realmente las políticas y limitaciones de aprovisionamiento de Apple.
Esto parece responder definitivamente a mi pregunta (¿puedo conseguir que la aplicación se ejecute sin una cuenta ADP de pago) con un "no". Aunque este artículo es anterior a Xcode 7. Aparentemente Xcode 7 enviará el UDID de un dispositivo al portal de Apple, y recibirá como respuesta un perfil de aprovisionamiento firmado por Apple, que contiene ese UDID. Xcode 7 sólo hace esto cuando el dispositivo está conectado por USB y es reconocido por Xcode, pero uno se pregunta si una solicitud manual de Xcode a Apple podría ser elaborada. Eso se adentra más en la ingeniería inversa de las cosas de Apple de lo que me siento cómodo, y probablemente viola ToS o lo que sea, así que creo que estoy satisfecho con la respuesta "no".
Según la página de BuildStore En la actualidad, gestionan algo similar a través del correo electrónico, por lo que puede ser posible.
Xcode "Build and Archive" desde la línea de comandos es bastante antiguo (alrededor de xcode 3), pero sugiere utilizar xcrun
en lugar de xcodebuild
que he estado usando.