Professional Documents
Culture Documents
ndice
Soporte disponible para acceder a servicios Web.
Descarga sencilla de datos con peticiones HTTP GET.
NSData(contentsOfURL:)
Codificacin y Escapado.
NSData, URL Legales, Base-64
Serializacin JSON.
Manejo de peticiones HTTP con NSURLSession.
Bajada y subida de datos, ficheros.
Mtodos GET, PUT, DELETE, POST,
Cabeceras HTTP.
Otros: Seguridad, Caches,
Santiago Pavn - UPM-DIT
Qu Soporte Tenemos?
Disponemos de clases para:
Manejar URLs, Peticiones y Respuestas HTTP
NSURL, NSURLRequest, NSHTTPURLResponse
NSData.dataWithContentsOfURL:
NSURLSession y clases relacionadas. (introducido en iOS 7)
NSURLConnection (se usaba antes de que apareciera NSURLSession)
Codificaciones
Escapado de URL con cdigos %, conversin base64, codificacin y decodificacin a NSData, . . .
XML:
Xcode no ofrece soporte para construir documentos XML.
Para parsear documentos XML disponemos de la clase NSXMLParser.
...
Santiago Pavn - UPM-DIT
NSData(contentsOfURL:)
Para crear un NSData con los datos del sitio especificado en
una URL puede usarse:
let data: NSData? = NSData(contentsOfURL: url)
Si no puede obtener los datos, devuelve nil.
Si es necesario conocer las razones de los posibles fallos, usar:
// Actualizar el GUI
self.imageView.image = img
} else {
println("Error construyendo la imagen")
}
} else {
println("Error descargando")
}
// Ocultar indicador de actividad de red
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
Santiago Pavn - UPM-DIT
})
} else { println("Error construyendo la imagen") }
} else { println("Error descargando") }
})
})
Santiago Pavn - UPM-DIT
Codificacin y Escapado
Codificacin y Escapado
Por motivos de interoperabilidad, al manejar URLs y el protocolo HTTP,
debemos codificar y escapar algunos caracteres.
Las RFCs 1808, 1738, 2732 y 3986 especifica cmo son las URLs.
- Hay una serie de reglas para su codificacin:
Solo pueden usarse unos cuantos caracteres ASCII (letras, nmeros y algunos
signos) en una URL, y los caracteres conflictivos debe escaparse.
Los caracteres ($&+,/::=?@) que tienen un significado especial en la sintaxis de
la URL deben escaparse cuando se usan con otro significado.
- Los caracteres de la URL se codifican en UTF-8, y los bytes que no son letras o
nmeros ASCII, o tienen un significado conflictivo, se sustituyen por un % seguido
de dos dgitos hexadecimales (su cdigo ASCII).
Ejemplo: El Camin -> El%20Cami%C3%B3n
Los valores de algunas cabeceras de las peticiones y respuestas HTTP, tambin se
codifican en UTF-8, Base-64,
String <>NSData
Ya sabemos que:
El valor de un String es una secuencia de caracteres Unicode.
El valor de un NSData es una secuencia de bytes.
- La secuencia de bytes puede ser un string, una imagen, un audio, etc..
Este tipo de conversiones tambin puede hacerse con otros tipos de datos.
Santiago Pavn - UPM-DIT
10
11
12
Base 64
Codificar en Base-64:
Crear un String codificado en Base-64 desde un NSData:
func base64EncodedStringWithOptions(
_ options: NSDataBase64EncodingOptions) -> String
Crear un NSData codificado en Base-64 y UTF-8 desde un NSData:
func base64EncodedDataWithOptions(
_ options: NSDataBase64EncodingOptions) -> NSData
Decodificar en Base-64:
Construir un NSData desde un NSData codificado en Base-64 y UTF-8:
13
14
Serializacin de JSON
15
JSON
La clase NSJSONSerialization que permite:
Convertir JSON en objetos Foundation.
Convertir objetos Foundation en JSON.
16
17
// Un diccionario:
let person = ["nombre": "Juan", "edad": 28]
// Crear JSON
var error: NSError?
if let data = NSJSONSerialization.dataWithJSONObject(person,
options: .allZeros, error: &error) {
// Ver el buffer de bytes:
println(data) // <7b226e6f 6d627265 223a224a 6164223a 32387d>
// Ver el NSData como un String
let str = NSString(data: data, encoding: NSUTF8StringEncoding)
println(str!) // {"nombre":"Juan","edad":28}
// Reconstruir el objeto
if let person2 = NSJSONSerialization.JSONObjectWithData(data,
options: .allZeros,
error: &error)
as? [String:AnyObject] {
// Ver el diccionario
println(person2) // [nombre: Juan, edad: 28]
}
}
Santiago Pavn - UPM-DIT
18
NSURLSession
19
Introduccin
Historia:
Con iOS 6 (y anteriores) se usaba la clase NSURLConnection para realizar
comunicaciones HTTP.
En iOS 7 se introduce NSURLSession como la forma preferida de realizar
este tipo de comunicaciones.
20
NSURLSession
Se usa para realizar transferencia de datos usando HTTP.
Las apps pueden crear varias sesiones
Cada sesin coordinar varias tareas de transferencia de datos relacionadas.
En cada sesin se realizar una configuracin que se aplicar sobre todas las tareas de la
sesin.
Existen tres tipos de configuraciones para las sesiones:
- default: Usar las caches, credenciales y cookies globales.
- ephemeral: Para sesiones que no almacenan nada de forma persistente (sesiones privadas).
- background: Continuar transfiriendo datos aunque se suspenda, termine o se muera la app.
21
Clases
NSURLSessionConfiguration
- Crear un objeto para configurar inicialmente una sesin.
NSURLSession
- Crear los objetos que representan una sesin.
NSURLSessionTask
- Clase base de los distintos tipo de tareas.
NSURLSessionDataTask
-
NSURLSessionUploadTask
-
NSURLSessionDownloadTask
-
22
Protocolos
Hay cuatro protocolos que pueden usarse para tener un control ms
fino sobre las sesiones y las tareas.
NSURLSessionDelegate
- Define mtodos para manejar eventos a nivel de sesin.
NSURLSessionTaskDelegate
- Define mtodos para manejar eventos a nivel de tarea.
Se definen los mtodos que son comunes para todo tipo de tareas.
NSURLSessionDataDelegate
- Define mtodos para manejar eventos a nivel de tarea.
Se definen los mtodos que son especficos de las tareas Data y Upload.
NSURLSessionDownloadDelegate
- Define mtodos para manejar eventos a nivel de tarea.
Se definen los mtodos que son especficos de las tareas Download.
Santiago Pavn - UPM-DIT
23
24
// Crear sesion
let session = NSURLSession.sharedSession()
// Mostrar indicador de actividad de red
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
// Construir un NSURL
let imgUrl = "http://www.etsit.upm.es/images/portada/logoetsitupm.png"
let escUrl = imgUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let url = NSURL(string: escUrl)!
// Crear la Data Task
let task = session.dataTaskWithURL(url, completionHandler: { (data: NSData!,
res: NSURLResponse!, error: NSError!) in
if error == nil && (res as NSHTTPURLResponse).statusCode == 200 {
// Construir una imagen con los datos bajados
if let img = UIImage(data: data) {
dispatch_async(dispatch_get_main_queue(), {
self.imageView.image = img
})
} else { println("Error construyendo la imagen") }
} else { println("Error descargando") }
dispatch_async(dispatch_get_main_queue(), {
// Ocultar indicador de actividad de red
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
})
})
// Arrancar la tarea
task.resume()
Santiago Pavn - UPM-DIT
25
Crear tareas, . . .
26
27
// Construir un NSURL
let imgUrl = "http://www.etsit.upm.es/images/portada/logoetsitupm.png"
let escUrl = imgUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let url = NSURL(string: escUrl)!
})
}
task.resume() // Arrancar la tarea
Santiago Pavn - UPM-DIT
28
29
30
// Construir un NSURL
let imgUrl = "http://www.etsit.upm.es/images/portada/logoetsitupm.png"
let escUrl = imgUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let url = NSURL(string: escUrl)!
31
32
33
34