需要 Javascript 与 ObjC 合作从而达到这个目标。

There are two parts to make this work: a JavaScript handler and UIWebView delegate methods. In JavaScript, we can modify prototype methods to trigger events when an AJAX request is created. With our UIWebView delegate, we can capture these events.

JavaScript Handler

We need to be notified when an AJAX request is made. I found the solution here.

In our case, to make the code work, I put the following JavaScript in a resource called ajax_handler.js which is bundled with my 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();
}

What this will actually do is change the location of the browser to some made up URL scheme (in this case,mpAjaxHandle) with info about the request made. Don't worry, our delegate with catch this and the location won't change.

UIWebView Delegate

First, we need to read our JavaScript file. I suggest doing storing it in a static variable. I'm in the habit of using +initialize.

static NSString *JSHandler;+ (void)initialize {JSHandler = [[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil] retain];
}

Next, we want to inject this JavaScript before a page is done loading so we can receive all events.

- (void)webViewDidStartLoad:(UIWebView *)webView {[webView stringByEvaluatingJavaScriptFromString:JSHandler];
}

Finally, we want to capture the event.

Since the URL Scheme is made up, we don't want to actually follow it. We return NO and all is well.

#define CocoaJSHandler          @"mpAjaxHandler"- (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;
}

I created a sample project with the solution but have nowhere to host it. You can message me if you can host it and I'll edit this post accordingly.

转载于:https://www.cnblogs.com/Proteas/archive/2013/01/07/2848932.html

[转]UIWebView 监控 XMLHttpRequest相关推荐

  1. UIWebView关于XMLHttpRequest的内存泄漏

    最近在应用中嵌入HTML页面时,导致应用常常崩溃,用insturmemt检测发现存在内存泄露.但不是所有的页面多存在这个问题,上网查了一下,发现是javascript代码导致内存泄露. 通常情况下,当 ...

  2. [NOTE] XMLHttpRequest

    [NOTE] XMLHttpRequest 前言 是对浏览器接口 XMLHttpRequest的学习笔记 主要是因为最近学习的些安全内容(CSRF等)都涉及到了这个 因此来简单学习下 很多Web应用认 ...

  3. XMLHttpRequest Level 2 使用指南

    http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html XMLHttpRequest是一个浏览器接口,使得Javascri ...

  4. XmlHttpRequest之fetch

    XmlHttpRequest对象的理解 XMLHttpRequest对象是基于XML的HTTP请求,是一个浏览器接口,用于与服务器交互,我们通过XMLHttpRequest 可以在不刷新页面的情况下请 ...

  5. XMLHttpRequest 详解

    目录 XMLHTTPRequest对象 1,HTTP请求的时限 2,FormData对象 3,上传文件 4,跨域资源共享(CORS) XMLHTTPRequest对象 XMLHTTPRequest对象 ...

  6. HTML上传文件的多种方式

    1. 传统方式 <form id="upload-form" action="upload.php" method="post" en ...

  7. Firebug高级用法 - Web开发的利器

    Firebug是一个Firefox插件,是Web开发的利器.从此处下载.工具用好了能大大提高开发效率.下面介绍一些用法: 查看编辑HTML和CSS,查看DOM 两个方法,一个是在新窗口中打开Fireb ...

  8. 浏览器中xhr选项是做什么用的呢_XHR和AJAX终于搞懂了!!

    XMLHttpRequest分析 之前分析面试常被问的跨域问题,另一个面试难题就是ajax原理相关的问题了,今天我们就来solve它. 开篇先来介绍一个之前看过的一篇文章,讲的是如何回答面试中的原理题 ...

  9. XSS 前端防火墙 —— 天衣无缝的防护

    到目前为止,我们防护的深度已经差不多,但广度还有所欠缺. 例如,我们的属性钩子只考虑了 setAttribute,却忽视还有类似的 setAttributeNode.尽管从来不用这方法,但并不意味人家 ...

最新文章

  1. 转 spring配置文件
  2. Nat. Commun. | 训练人工智能以发现与疾病相关的基因
  3. 软件项目管理 用户测试,1对软件研发过程中用户需求研发设计项目测试交付实施测试等流程监督管理.doc...
  4. python基础教程是什么语言-0编程基础,什么语言也没学过,请问学Python怎样入门?...
  5. 学习笔记Hive(四) —— Hive应用(2)—— Hive导入及导出数据
  6. 扩频技术matlab仿真,基于Simulink的扩频通信仿真
  7. P1129-[ZJOI2007]矩阵游戏【最大匹配】
  8. excel制作一个信息录入系统_制作Excel仓库入库单,一键完成数据录入、计算及保存操作...
  9. c#问题(按F1或F2键时触发事件)
  10. php中引入jquery文件_WP模板开发中,怎样给wordpress网站的文章,添加点赞功能?...
  11. 不能说服别人接受,只能是个烂设计
  12. 模板 | 年度财务分析报告财务工作汇报PPT
  13. latex 插入Python代码
  14. 猫途鹰:中国游客旅行花费低于全球平均水平,购物消费则远超全球
  15. JavaScript 资源大全中文版
  16. vue树形权限菜单_vue树形菜单
  17. 【Android】图形图像处理
  18. JSP/Servlet构建三层管理信息系统
  19. DNS劫持,HTTP劫持、HTTPS劫持【流量劫持】
  20. MySQL页面打捞工具使用方法

热门文章

  1. python变量类型之间转换_python学习笔记5—数据类型转换
  2. java 时间回退_java.time DateTimeFormatter使用灵活的回退值进行解析
  3. 使用GRUNT压缩和合并js文件
  4. merkle tree(hash tree)
  5. Hadoop系列之FieldSelectionMapReduce用法
  6. 【转】QDockWidget 停靠窗口和工具栏
  7. 吴恩达深度学习2.1练习_Improving Deep Neural Networks_initialization
  8. 怎样写一个具有异步交互的React组件的单元测试
  9. java多线程采集+线程同步-【多线程数据采集之四】
  10. MySQL -- 获取当前数据行号