viernes, 28 de junio de 2013

Clases sin ARC en un proyecto ARC.

No hace mucho tiempo, en el desarrollo para iOS, los desarrolladores debíamos tener el control de la memoria de los objetos creados. Pese al rechazo inicial de algunos desarrolladores (yo me incluía) la experiencia me ha demostrado que pese a conseguir dominar la gestión de la memoria en mis Apps, desde que migré a ARC, mis preocupaciones han disminuido. Aún así, hay una gran cantidad de clases y códigos que ya tenía creados y por cualquier motivo no me interesaba migrar a ARC. Si quisiera incluir esos códigos en un proyecto ARC y los ejecutase me aparecerían los siguientes errores.



Para solucionar este problema, basta con añadir la instrucción -fno-objc-arc, en el archivo de implementación que deseemos que no compile con ARC, como muestro en la siguiente imagen.


Ahora nuestro código se ejecutará sin ningún problema.


jueves, 27 de junio de 2013

Icono sin efecto de brillo.

Sólo hay que echar un vistazo a la pantalla de nuestro dispositivo iOS para ver como algunos iconos de aplicaciones aparecen con un efecto de brillo y otros no. Este efecto lo añade Apple por defecto y para eliminarlo tenemos que seguir los siguientes pasos:

1. Seleccionamos el target de nuestro proyecto, y pulsamos sobre la pestaña de info. Añadimos al plist que nos aparece una fila.


2. Esta fila será de tipo booleano con la key Icon already includes gloss effects y el value YES.



3. Y si volvemos a ejecutar el proyecto podremos ver el icono de nuestra App sin el brillo por defecto.

Icono con brillo
Icono con efecto brillo

Icono sin efecto brillo


NOTA: es recomendable eliminar la App si ya está instalada antes de ejecutar para asegurarnos de que pinta correctamente el icono.

miércoles, 26 de junio de 2013

Controladores nativos de Facebook y Twitter en iOS 6.x. Social framework segunda parte.

La integración de este controlador  ha sido muy sencilla (ver primera parte). Pero tanto facebook como Twitter nos ofrecen otra serie de funciones como seguir, compartir, etc. Para ello necesitaremos acceder a los datos de nuestra cuenta desde nuestras aplicaciones nativas sociales. Seguiremos los siguientes pasos:

1. Adjuntamos el framework Accounts a nuestro proyecto.



2. Importamos las cabeceras a nuestro archivo de cabecera.

#import <Accounts/Accounts.h>

3. Añadimos el siguiente código en el método donde queramos implementar la función (en este caso se toma como ejemplo el "follow" de Twitter).

if([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
    {
        ACAccountStore *accountStore = [[ACAccountStore alloc] init];
        ACAccountType *twitterAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
        [accountStore requestAccessToAccountsWithType:twitterAccountType options:nil completion:^(BOOL granted, NSError *error)
        {
            if(granted)
            {
                NSArray *accountsArray = [accountStore accountsWithAccountType:twitterAccountType];
                
                // En caso de tener más de una cuenta, aquí se debería integrar el código
                if ([accountsArray count] > 0)
                {
                    ACAccount *twitterAccount = [accountsArray objectAtIndex:0];
                    
                    NSMutableDictionary *twitterApiDictionary = [[NSMutableDictionary alloc] init];
                    [twitterApiDictionary setValue:@"OhMyAppss" forKey:@"screen_name"];
                    [twitterApiDictionary setValue:@"true" forKey:@"follow"];
                    
                    SLRequest *twitterRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"http://api.twitter.com/1/friendships/create.json"] parameters:twitterApiDictionary];
                         
                    [twitterRequest setAccount:twitterAccount];
                         
                    [twitterRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
                    {
                        NSLog(@"%@",[NSString stringWithFormat:@"HTTP response status: %i", [urlResponse statusCode]]);

                 //Aquí se deben estudiar los posibles casos de error

                    }];
                }
            }
        }];
    }

Para conocer todas las funciones que nos ofrecen Twitter y Facebook deberemos consultar su documentación: 



martes, 25 de junio de 2013

Controladores nativos de Facebook y Twitter en iOS 6.x. Social framework primera parte.

  Una de las novedades que trajo consigo iOS 6.0 fue el Social framework. Con él, podemos incluir el controlador nativo de redes sociales, de una manera muy sencilla. Aquellos que nos tuvimos que pelear con los SDKs de Facebook y Twitter, estaremos eternamente agradecidos. Los pasos para dicha integración son los siguientes:

1.  Añadir la librería Social.framework a nuestro proyecto. No olvidéis marcarlo como "optional" si la aplicación está habilitada para dispositivos anteriores a iOS 6.0.



2. Importamos las cabeceras del framework a nuestro archivo de cabecera.

#import <Social/Social.h>
3. Añadimos el siguiente código al método que ejecute la acción de social media deseada:


if([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
    {
        SLComposeViewController *twitterVC = [SLComposeViewController  composeViewControllerForServiceType:SLServiceTypeTwitter];
    
        [twitterVC setInitialText:NSLocalizedString(@"App creada por Oh My Apps!", nil)];
        [twitterVC setTitle:@"Oh My Apps!"];
        [twitterVC addImage:[UIImage imageNamed:@"oma_icon"]];
        [twitterVC addURL:[NSURL URLWithString:@"http://www.ohmyapps.es"]];
    
        [self presentViewController:twitterVC animated:YES completion:nil];
    }


Podremos utilizar el controlador para Twitter con el tipo SLServiceTypeTwitter, para facebook con el tipo SLServiceTypeFacebook y para la red social china Seibo con el tipo SLServiceTypeSinaWeibo.

Al ejecutar nos deberá aparecer el controlador nativo.