UIWebView监听ajax请求

在nativeapp中,使用的Ajax,需要注意的是UIWebViewDelegate不会监测到Ajax的request,也就是再执行Ajax代码时,shouldStartLoadWithReuqest等方法并不会被调用。

有一种解决方案,需要Javascript和navtive code一起来做,其流程是在Javascript handler中每创建Ajax的请求时,需要将这段js存在ajax_handler.js放在app中

var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
    window.location='mpAjaxHandler://' + this.url;
};

XMLHttpRequest.prototype.open = function(a,b) {
  if (!a) var a='';
  if (!b) var b='';
  s_ajaxListener.tempOpen.apply(this, arguments);
  s_ajaxListener.method = a;  
  s_ajaxListener.url = b;
  if (a.toLowerCase() == 'get') {
    s_ajaxListener.data = b.split('?');
    s_ajaxListener.data = s_ajaxListener.data[1];
  }
}

XMLHttpRequest.prototype.send = function(a,b) {
  if (!a) var a='';
  if (!b) var b='';
  s_ajaxListener.tempSend.apply(this, arguments);
  if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
  s_ajaxListener.callback();
}

或者使用如下一段jq监听

$(document).ajaxSend(
		function(event,request,settings){
			alert("请求地址:"+settings.url); //输出请求地址
			alert("请求数据:"+settings.data); //输出请求参数
		        alert("请求类型:"+settings.type); //输出请求方式
		});

其中的"mpAjaxHandler"为自定义的Scheme,用于区别request是否是由Ajax发出的。

在App端植入js到当前加载的页面中,在载入页面后,执行这段js

- (void)webViewDidStartLoad:(UIWebView *)webView
{
    static NSString *JSHandler;
    JSHandler = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil];
    [webView stringByEvaluatingJavaScriptFromString:JSHandler];
    [webView stringByEvaluatingJavaScriptFromString:JSHandler];
}

拦截住Request,不让webview的URL做出改变

#define CocoaJSHandler          @"mpAjaxHandler"
// 如果返回NO,代表不允许加载这个请求
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[[request URL] scheme] isEqual:CocoaJSHandler])
    {
        NSString *requestedURLString = [[[request URL] absoluteString] substringFromIndex:[CocoaJSHandler length] + 3];
        NSLog(@"ajax request: %@", requestedURLString);
        return NO;
    }
    
    return YES;
}





你可能感兴趣的:(IOS开发)