23 mayo 2010

Cómo ejecutar en un dispositivo iPhone sin pagar el programa de desarrolladores iPhone

Editado: Parece que hay que tener el teléfono con jailbreak e Installous debe de estar instalado.

Os voy a contar un truco que he encontrado por ahí y que me ha sido de gran utilidad.
Si alguna vez has pensado en programar para iPhone OS, uno de los mejores ejemplos para empezar sería éste. Es sencillo, te asienta varios conceptos importantísimos y está muy bien explicado. En el transcurso del tutorial vas ejecutando el ejemplo y lo vas probando para ver la evolución de lo que es tu primer programa de muchos más por llegar, espero. Lo bonito sería, cuando lo terminas, ejecutarlo en tu flamante iPhone para poder llevártelo por ahí y fardar con tus amigos de que "eres programador iPhone"... si es que estás dispuesto a pagar 79€ (99$).
Aunque hay una forma de saltarse esta restricción...

El Programa de Desarrollador iPhone de Apple no solo sirve para poder poner tus aplicaciones en la App Store, sino que también es necesario si quieres probar tus desarrollos en tu propio teléfono. Sinceramente es una cagada. Otro punto negativo para Apple (y ya van unos cuantos). Pero como decía en la entrada, buscando cómo solucionar este problema encontré un hilo donde una persona se curró una forma para poder ejecutar los desarrollos en el propio teléfono sin pasar por caja. Os cuento mi experiencia y los pasos para poder hacerlo también vosotros.
La configuración que he usado es XCode 3.2.2 con iPhone SDK 3.2, y el firmware de mi iPhone es un 3.1. Voy a explicarlo con el iPhone OS 3.1, si tenéis otra versión probad con la vuestra.

  1. Hacéis una copia de seguridad del fichero /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/SDKSettings.plist.
    sudo cp -p /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/SDKSettings.plist /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/SDKSettings.plist.bak

  2. Ahora lo editamos con vuestro editor favorito o con pico.
    sudo pico /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/SDKSettings.plist

  3. Buscad y cambiad las claves DefaultProperties/CODE_SIGNING_REQUIRED y ENTITLEMENTS_REQUIRED y ponedlas a NO.
  4. Cread un fichero llamado gen_entitlements.py con el siguiente contenido (personalmente lo he salvado en /Developer/Applications/):
    #!/usr/bin/env python

    import sys
    import struct

    if len(sys.argv) != 3:
    print "Usage: %s appname dest_file.xcent" % sys.argv[0]
    sys.exit(-1)

    APPNAME = sys.argv[1]
    DEST = sys.argv[2]

    if not DEST.endswith('.xml') and not DEST.endswith('.xcent'):
    print "Dest must be .xml (for ldid) or .xcent (for codesign)"
    sys.exit(-1)

    entitlements = """
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>application-identifier</key>
    <string>%s</string>
    <key>get-task-allow</key>
    <true/>
    </dict>
    </plist>
    """ % APPNAME

    f = open(DEST,'w')
    if DEST.endswith('.xcent'):
    f.write("\xfa\xde\x71\x71")
    f.write(struct.pack('>L', len(entitlements) + 8))
    f.write(entitlements)
    f.close()


  5. Cambiad los permisos del fichero para que se pueda ejecutar:
    chmod +x gen_entitlements.py



  6. Una vez tengáis vuestro proyecto terminado, vais a "Project -> Edit Project Settings". En la pestaña "Build" buscáis "Code Signing Identity" y donde no suele poner nada lo seleccionáis y lo dejáis en "iPhone Developer" y bajo ésta seleccionais "Device - iPhone OS 3.1" o "Any iPhone OS Device" y ponéis "Don't Code Sign".
  7. Ahora vais a "Project -> New Build Phase -> New Run Script Build Phase" y copiamos el siguiente código (aseguraos de poner correctamente la ruta al fichero gen_entitlements.py, y de que coincida el Bundle Identifier):
    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
    /Developer/Applications/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
    codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
    fi


  8. Ahora debemos crearnos un certificado con el nombre que hemos dado a "Code Signing Identity" en el paso 6: "iPhone Developer". Para ello abrimos el programa de "Acceso a Llaveros" localizado en /Aplicaciones/Utilidades.
  9. Seleccionadmos "Acceso a Llaveros -> Asistente para Certificados -> Crear un Certificado..."
  10. Nombramos al certificado "iPhone Developer", con tipo de identidad "Raíz autofirmada" y tipo de certificado "Firma en código". Chequeamos "Permitir ignorar los valores por omisión". Le damos a continuar.
  11. Le damos un número de serie distinto de cualquier otro certificado y un periodo de validez. Continuar.
  12. Rellenamos los datos de correo electrónico, empresa, etc...
  13. Dejamos todo lo demás con las opciones por defecto hasta llegar al final. Con esto tenemos todo preparado para poder ejecutar nuestra aplicación en un dispositivo.
  14. Abrimos el organizador, en XCode "Window -> Organizer" y preparamos nuestro dispositivo para usarlo en nuestros desarrollos.
  15. Una vez configurado el iPhone vamos a compilar y ejecutar nuestro programa. Seleccionamos como destino de la ejecución "Device - 3.1|Debug" y le damos a "Build and Run". Después de unos segundos tendrá que aparecer nuestra aplicación en nuestro iPhone.


¡Suerte con vuestros desarrollos!

Leer la pencada completa...