Pregunta

He estado usando el método de URL de intercepción para pasar datos desde javascript objetivo C haciendo pasar los datos como parámetros de URL codificada y el uso de NSURLProtocol interceptar la solicitud sin embargo ahora estoy esperando para enviar grandes cantidades de datos, como por ejemplo 10.000 caracteres de largo cuerdas, pero esto no parece práctico hacerlo en una petición GET. ¿Verdad?

¿Hay una manera de c objetivo de interceptar datos POST enviados desde un UIWebView?
Si es así puedo seguir utilizando NSURLProtocol y cómo consigo los datos POST?
Si no hay alguna otra manera de que pueda pasar grandes cantidades de datos desde el UIWebView al objetivo c?

¿Fue útil?

Solución

Cuando se utiliza un código como:

@implementation AppProtocolHandler

+ (void)registerSpecialProtocol {
    static BOOL inited = NO;

    if (!inited) {
        inited = YES;
        [NSURLProtocol registerClass:[AppProtocolHandler class]];
    }
}

- (void)handleRequest {
    NSURLRequest *request = [self request];

    // null when via app:// but works when via http://
    NSLog(@"[request HTTPBody]: %@", [request HTTPBody]);
}

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    return YES;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

@end

Solicitudes a algunos protocolos (por ejemplo app://) resultará en [request HTTPBody] ser null. Pero si envía a través http:// entonces el [request HTTPBody] tendrá los datos de petición en un objeto NSData como se esperaba.

Así que su Javascript debe ser algo como:

$.post("http://test/hello/world", {'data':"foo bar"});

y no algo como:

$.post("app://test/hello/world", {'data':"foo bar"});

Otros consejos

Cualquier solicitud será recibido por el delegado para que pueda enviar cualquier solicitud POST Ajax, rellenarlo con los parámetros y los valores que desee y luego enviarlo. Todos los valores serán interceptados y usted puede utilizar de la misma manera que está haciendo hasta ahora. Una solicitud POST fácil podría ser enviado a través de jQuery, tan fácil como:

.

$ post ( "toobjc.html", { 'datos': "10k caracteres de longitud de cadena y más aquí ..."});

Más aquí: http://api.jquery.com/jQuery.post/

definitivamente debe utilizar un POST. Sólo tiene que configurar la solicitud de la misma. Es posible que tenga que asegurarse de que los datos se codifican y cuidar de un par de otros detalles:.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:myMimeType forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", requestData.length]       
         forHTTPHeaderField:@"Content-Length"];

[request setHTTPBody:requestData];

[self.playerView loadRequest: request];

Como alternativa, puede enviar un documento o formulario de valores de varias partes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top