Cargar desde la aplicación al server en IOS

Sé que, convencionalmente, para que una aplicación interactúe con Internet, debe usar un service web para intercambiar información. Sin embargo, ¿cómo se uploadían los datos (fotos, text, grabaciones de audio, etc.etc.) De una aplicación a otra (que contiene datos para todas las counts de usuario)? Sé que algunas personas utilizan una táctica de correo electrónico a server de la investigación, pero incluso entonces suena ineficaz y lenta. ¿Cómo suben tan rápido las aplicaciones como Instagram? Estoy intentando replicar ese tipo de carga. Por favor, guíame en la dirección correcta.

¡Gracias por la ayuda!

Definitivamente deberías mirar AFNetworking. Aquí hay un ejemplo de mi carga de una image en un service web de php:

NSData *imageData = UIImagePNGRepresentation(pageImage); AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://www.SERVER.com"]]; //You can add POST parameteres here NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: author, @"author", title, @"title", nil]; NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"/PATH/TO/WEBSERVICE.php" parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { //This is the image [formData appendPartWithFileData: imageData name:@"cover_image" fileName:@"temp.png" mimeType:@"image/png"]; }]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; //Setup Upload block to return progress of file upload [operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { float progress = totalBytesWritten / (float)totalBytesExpectedToWrite; NSLog(@"Upload Percentage: %f %%", progress*100); }]; //Setup Completeion block to return successful or failure [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *response = [operation responseString]; NSLog(@"response: [%@]",response); //Code to run after webservice returns success response code } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error: %@", [operation error]); //Code to Run if Failed }]; [operation start]; 

Editar: También utilizo MBProgressHUD para mostrar al usuario la carga en cargas más largas.

Como sabrá, la velocidad de carga siempre está vinculada a la velocidad del tipo de connection que está utilizando. Incluso la mejor técnica de carga será lenta cuando la connection sea lenta (GPRS por ejemplo, o EDGE, incluso 3G puede ser lento si la cobertura de la networking no es buena).

Para cargar grandes sets de datos más rápido / mejor, una cosa que puede hacer es comprimir los datos que está enviando usando ZIP o cualquier otro formatting de compression de files que desee o incluso desarrollar su propio algorithm de compression (puede que no quiera hacerlo); )

Si desea networkingucir la sobrecarga de las conexiones HTTP / HTTPS, por ejemplo, puede escribir su propio protocolo para el intercambio de datos, implementarlo en el lado cliente / server y cargarlo más rápido. Esto será mucho trabajo ya que tiene que hacer todo el trabajo de implementación no solo para el protocolo en sí, ya que necesita agregar security, etc. Pero incluso si decide crear un protocolo, como se dijo al principio, será lento si la connection es lenta

Actualización: Una presentación de Mike Krieger (Cofundador de Instagram) donde cubre su pregunta que acaba de cruzar https://speakerdeck.com/u/mikeyk/p/secrets-to-lightning-fast-mobile-design?slide = 1

La razón por la que crees que es tan rápido es que están actualizando la interfaz de usuario antes de que la request (la Carga en este caso) incluso se complete. Esto es lo que Mike describe como "ser optimista". Si la request falla, aún puede notificar al usuario, pero mientras tanto, hágale sentir productivo y actúe como si la request se hubiera completado con éxito.

Esta es una pregunta bastante abierta pero aquí hay algunas cosas para mirar:

"Cargar rápido" depende de la connection del usuario y del ancho de banda del server, por lo que no entraré en eso.

Puede cargar fotos (y otros files) creando objects NSData y adjuntándolos a una request POST. Ya hay un montón de código de muestra para cargar NSData, pero para convertir un UIImage hará lo siguiente:

 NSData *imageData = UIImagePNGRepresentation(image); 

Puede hacerlo usando las classs incorporadas de cocoa (NSMutableURLRequest) y con classs de networkinges de terceros (como AFNetworking , solo desplácese hacia abajo para cargar files).

Cuando envío datos simples a mi server web, utilizo el siguiente enfoque: Utiliza el marco ASIHttpRequest para conectarte a tu server. Envíe los datos en el cuerpo del post HTTP, que es fácil de hacer en el marco ASIHttpRequest. Deseará convertir sus datos a XML o JSON (utilice el marco SBJson para esto) antes de enviarlos. Luego escribo scripts PHP que analizan json o xml y luego ingresan estos datos en mi database con scripts SQL personalizados. Puedo proporcionarle fragments de código si los necesita para cualquiera de estos procedimientos …

Me parece que, con su primera oración, básicamente ha respondido su propia pregunta.

Necesita algo en su server para recibir los files y luego escriba el código del cliente para que coincida. Podría ser tan simple como ftp o tan complejo como un protocolo personalizado, dependiendo de la security y el control que necesite.