Cuando desarrollamos un juego en Cocos2d-x, tenemos que tener en cuenta que hay particularidades entre dispositivos iOS y Android.

Por defecto iOS tiene multitouch desactivado. En cambio en Android, el multitouch está habilitado.

Si queremos habilitar multitouch en iOS, sólo tenemos que habilitarlo en AppController.mm:

- application:application didFinishLaunchingWithOptions:launchOptions {
    // Override point for customization after application launch.
    // Add the view controller’s view to the window and display.
    window = initWithFrame: bounds]]; EAGLView *glView = [EAGLView viewWithFrame: [window bounds] pixelFormat: kEAGLColorFormatRGBA8
        depthFormat: GL_DEPTH_COMPONENT16_OES
        preserveBackbuffer: NO
        sharegroup: nil
        multiSampling: NO
        numberOfSamples: 0 ];
    [_glView setMultipleTouchEnabled:YES];
    // enable multi-touch here!
    return YES;
}

Por el contrario, si queremos deshabilitar el multitouch en Android, la opción más sencilla es ir a la clase Cocos2dxGLSurfaceView.java y en el método onTouchEvent comentar el case de MotionEvent.ACTION_POINTER_DOWN:

    //            case MotionEvent.ACTION_POINTER_DOWN:
    //                final int indexPointerDown = pMotionEvent.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT;
    //                final int idPointerDown = pMotionEvent.getPointerId(indexPointerDown);
    //                final float xPointerDown = pMotionEvent.getX(indexPointerDown);
    //                final float yPointerDown = pMotionEvent.getY(indexPointerDown);
    //
    //                this.queueEvent(new Runnable() {
    //                    @Override
    //                    public void run() {
    // Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionDown(idPointerDown, xPointerDown, yPointerDown);
    //                    }
    //                });
    //                break;


El proceso de creación y distribución de binarios en iOS de forma manual es lento y repetitivo. Sería fantástico poder automatizarlo y poderlo integrar con nuestro servidor de integración continua. Hoy vamos a ver cómo podemos hacer esto de forma sencilla utilizando shenzhen y deliver.

Shenzhen es una utilidad que nos permite generar IPAs desde la línea de comandos. Por otra parte, deliver nos permite distribuir aplicaciones a iTunes Connect para revisión de Apple o para distribuir internamente a nuestros testers via Testflight.

Primero de todo, vamos a instalar shenzhen (asumiendo que tenemos Ruby on Rails instalado en nuestro sistema):

sudo gem install shenzhen
Shenzhen es una herramienta que nos permite compilar nuestra aplicación y generar el correspondiente ipa desde línea de comandos. Para ello, nos posicionamos en el directorio que tiene nuestro proyecto y ejecutamos:
ipa build 
Shenzhen nos permite distribuir nuestra aplicación usando RivieraBuild, HockeyApp, Crashlytics, Deploygate, fir.im, Pgyer, Amazon S3 y TestFairy. También nos permite distribuirlo por FTP y a iTunes Connect para revisión.

Sin embargo, no nos permite subirlo a Testflight para distribución interna. Utilizaremos otra herramienta llamada deliver:
sudo gem install deliver
Nos aseguramos que tengamos xcode command line instalado:
xcode-select --install
Inicializamos deliver en nuestro proyecto:
deliver init
Este proceso descarga la utilidad, descarga la información de AppStore/iTunes Connect si la aplicación ya está distribuida.

Editamos el fichero Deliverfile con nuestro editor de texto favorito y ponemos la versión correcta.

Y ya podemos distribuir nuestra aplicación:
deliver testflight
Para hacerlo más sencillo de recordar, crearemos un fichero shell script que realice estos dos pasos en uno solo:
echo "ipa build && deliver testflight" > deploy.sh
chmod +x deploy.sh
Y ya podemos compilar y distribuir nuestra aplicación en un paso:
./deploy.sh
Aquí podemos ver más documentación de shenzhen y de deliver:

https://github.com/nomad/shenzhen

https://github.com/KrauseFx/deliver

Errores frecuentes

Si observáis el siguiente Warning al ejecutar el comando de deliver:

[Transporter Warning Output]: WARNING ITMS-90191: "Missing beta entitlement. Your app does not include the beta-reports-active entitlement. If you intend to distribute this build via TestFlight for beta testing, please re-build this app with a newly generated provisioning profile."

Es porque al generar el IPA habéis utilizado un provisioning profile de tipo Ad Hoc en vez de utilizar el de AppStore. El provisioning profile de AppStore contiene el entitlement de beta-reports-active activado.

Para ello, nos aseguramos de seleccionar el provisioning profile correcto en el Build Settings de nuestro target:


Blogger news

Blogroll