Una semana más proponemos una solución a algunos de los problemas que nos hemos ido encontrando a lo largo del desarrollo de los diferentes proyectos que hemos llevado a cabo.
En los siguientes post’s vamos a hablar de las notificaciones push para iPhone y iPad, ya que son muy útiles y no parece una tarea muy sencilla de realizar. Sin embargo, una vez se comprende el procedecimiento que nos exige Apple, serán muy fáciles de implementar.
Para poder realizarlas es necesario registrar el token o identificador asociado a nuestro móvil en un servidor, para ello vamos a dar dos opciones:
- Petición al servidor mediante GET
- Petición al servidor mediante POST
En este post, las vamos a describir detalladamente, evidentemente tienen muchisimas más utilidades. En definitiva se utilizan para solicitar datos a un servidor o enviarle datos.
Para facilitar su entendimiento vamos a crear 2 proyectos independientes.
Para empezar creamos un nuevo proyecto en xCode como «Empty Application» y lo llamaré «PeticionesGET»
Añadimos un StoryBoard al proyecto con el «UIViewController» principal desde el cual se realizarán las peticiones.
Creamos el controlador que realizará las peticiones y se lo asignamos al «UIViewController» del Storyboard
Las peticiones al servidor se realizan de forma asincrona, por que nuestra aplicación podrá seguir ejecutandose sin problema. Cuando todos los datos se hayan recibido completamente, se ejecutará un método que indicará el fin de la recepción de los datos.
Para poder realizar las peticiones y recibir los datos del servidor hemos de indicar que el controlador es el delegado que los procesará. Para ello, utilizamos «NSURLConnectionDelegate» y «NSURLConnectionDataDelegate»
@interface PeticionesGETViewController : UIViewController<NSURLConnectionDelegate, NSURLConnectionDataDelegate>
@end
Para poder recibir los datos hemos de implementar los métodos de «NSURLConnectionDelegate»
#pragma methods NSURLConecciont delegate
-(void) connection:(NSURLConnection *) connection didReceiveData: (NSData *) datos
Va recibiendo los datos y los almacena en una variable
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
Fin de la recepción de datos
-(void) connection:(NSURLConnection *) connection didFailWithError: (NSError *)error
En caso de producirse un error se ejecutaría este método
También necesitaremos las siguientes variables:
NSURLRequest *request => Objeto request
NSURLConnection *connectionInProgress => Objeto para la conexion
NSMutableData *data => Objeto para almacenar lo datos
A continuación, se realiza la petición:
A la url se le podrían pasar los parámetros que se quisiese por get, por ejemplo:
www.miurl.com/?token=9089786tyfgjhbknjliuoy675&usuario=1
// Se construye la url a la cual se va a realizar la conexión
NSURL *url = [NSURL URLWithString:@»https://www.appandweb.es»];
// Se crea el objeto request indicado el tiempo de espera (segundos). En caso de superarlo, daría error
request = [NSURLRequest requestWithURL: url cachePolicy: NSURLRequestReloadIgnoringCacheDatatimeoutInterval: 30];
// Se comprueba si hay una conexión anterior y se cancela en caso de haberla. Para evitar duplicidad de peticiones
if (connectionInProgress) {
[connectionInProgress cancel];
}
// Se crea la instanca que guardará los datos
data = [[NSMutableData alloc] init];
// Se crea e inicia la conexión
connectionInProgress = [[NSURLConnection alloc] initWithRequest: requestdelegate: self
startImmediately:YES];
Conforme se van recibiendo los datos se ejecuta el primer método que los va insertando en la variable data
-(void) connection:(NSURLConnection *) connection didReceiveData:
(NSData *) datos{
[data appendData:datos];
}
Una vez que se hayan recibido todos los datos se ejecutara la siguiente función:
-(void) connectionDidFinishLoading:(NSURLConnection *) connection{
// La conexión ha finalizado. Ya se pueden realizar las acciones deseadas
NSString *xmlCheck = [[NSString alloc] initWithData: data encoding: NSISOLatin1StringEncoding];
if (xmlCheck != NULL && ![xmlCheck isEqual: @»»]) {
// Mostraría el código de la pagina
NSLog(@»%@», xmlCheck);
}
}
En caso de producirse un error, se ejecuta el método de error:
-(void) connection:(NSURLConnection *) connection didFailWithError:
(NSError *) error{
connectionInProgress = nil;
data = nil;
NSString *errorString = [NSStringstringWithFormat:@»Conexión fallida: %@»,
[error localizedDescription]];
NSLog(@»%@», errorString);
}
Para realizar la petición post vamos a crear otro proyecto que se llame «peticionesPOST» que contendrá los mismos métodos y variables que el anterior.
Cambiará la forma en que se crea la petición al servidor. Para empezar se crea un diccionario de pares valor-clave que contendrá los datos que se quieren enviar al servidor.
NSDictionary *params = [[NSDictionaryalloc] initWithObjectsAndKeys:
@»valor», @»clave»,
@»valor», @»clave»,
@»valor», @»clave»,nil];
NSURL *url = [NSURL URLWithString:@»url-peticion»];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[self connectionPOST:urlRequest withParams:params];
Se crea que genera la petición:
– (BOOL)connectionPOST: (NSURLRequest *)aRequest withParams:
(NSDictionary *)aDictionary {
// Se comprueba si el diccionario esta vacío
if ([aDictionary count] > 0) {
// Se crea la petición y se indica que es de tipo POST
requestPOST = [[NSMutableURLRequest alloc] initWithURL:[aRequest URL]];
[requestPOST setHTTPMethod:@»POST»];
// Necesitamos un string para añadir las claves y los valores
NSMutableString *postString = [[NSMutableString alloc] init];
// Se extraen las claves
NSArray *allKeys = [aDictionary allKeys];
for (int i = 0; i < [allKeys count]; i++) {
NSString *key = [allKeys objectAtIndex: i];
NSString *value = [aDictionary objectForKey: key];
// Se añade al String los pares de clave valor
[postString appendFormat:( (i == 0) ? @»%@=%@» : @»&%@=%@» ),
key, value];
}
// Se añade los datos a la petición
[requestPOST setHTTPBody: [postString dataUsingEncoding: NSUTF8StringEncoding]];
data = [[NSMutableData alloc] init];
if (connectionInProgress) {
[connectionInProgress cancel];
}
connectionInProgress = [[NSURLConnection alloc] initWithRequest: requestPOST
delegate: self startImmediately:YES];
postString = nil;
request = nil;
return YES;
} else {
return NO;
}
}
Además hemos de implementar las mismas funciones delegadas de «NSURLConnectionDelegate»:
#pragma methods NSURLConecciont delegate
-(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) datos
Va recibiendo los datos y los almacena en una variable
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
Fin de la recepción de datos
-(void) connection:(NSURLConnection *) connection didFailWithError: (NSError *)error
En caso de producirse un error se ejecutaría este método
Con esto ya tendriamos la petición POST realizada.
Puedes encontrar los códigos en los siguientes enlaces petición GET y petición POST
0 comentarios