UIWebView & javascript
http://blog.163.com/m_note/blog/static/208197045201293015844274/
UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容。其中就要用到javascript的知识,而UIWebView与javascript交互的方法就是stringByEvaluatingJavaScriptFromString:
有了这个方法我们可以通过objc调用javascript,可以注入javascript。
首先我们来看一下,如何调用javascript:
- [webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
这儿myFunction()就是我们的javascript方法。
再来看看入何注入javascript,我们先写一个需要注入的javascript:
- function showAlert() {
- alert('in show alert');
- }
保存为test.js,然后拖到xcode 的resource分组下。再用代码在初始化的时候注入这个js(如在viewDidLoad方法里)。
- NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"js"];
- NSString *jsString = [[NSString alloc] initWithContentsOfFile:filePath];
- [webView stringByEvaluatingJavaScriptFromString:jsString];
这样就注入了上面的js,那么我们可以随时调用js的方法,如何调用,上面有介绍。
那么我们能不能通过js来调用objc的方法呢。 当然可以,原理就是利用UIWebView重定向请求,传一些命令到我们的UIWebView,在UIWebView的delegate的方法中接收这些命令,并根据命令执行相应的objc方法。这样就相当于在javascript中调用objc的方法。说起来有点抽象,看看代码一下就明白。
首先我们写一个javascript 方法如下:
- function sendCommand(cmd,param){
- var url="testapp:"+cmd+":"+param;
- document.location = url;
- }
- function clickLink(){
- sendCommand("alert","你好吗?");
- }
然后在你的html里调用这个js方法 如:
- <input type="button" value="Click me!" onclick="clickLink()" /><br/>
最后我们在UIWebVew中截获这个重定向请求:
- #pragma mark --
- #pragma mark UIWebViewDelegate
- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
- NSString *requestString = [[request URL] absoluteString];
- NSArray *components = [requestString componentsSeparatedByString:@":"];
- if ([components count] > 1 && [(NSString *)[components objectAtIndex:0] isEqualToString:@"testapp"]) {
- if([(NSString *)[components objectAtIndex:1] isEqualToString:@"alert"])
- {
- UIAlertView *alert = [[UIAlertView alloc]
- initWithTitle:@"Alert from Cocoa Touch" message:[components objectAtIndex:2]
- delegate:self cancelButtonTitle:nil
- otherButtonTitles:@"OK", nil];
- [alert show];
- }
- return NO;
- }
- return YES;
- }
看了代码是不是清楚得不能再清楚了呀? 我想phonegap可能与是这样实现的,没去研究过。 不过有一个开源工程大家可以看看,它允许javascript调用objective_c的方法。叫jsbridge-to-cocoa
http://code.google.com/p/jsbridge-to-cocoa/
还有两个相关工程
WebViewJavascriptBridge 与 GAJavaScript 值得大家慢慢研究。
UIWebView & javascript的更多相关文章
- iOS开发 UIWebView+JavaScript 交互总结
算是个人项目经验的,印象比较深的Web+JS交互的使用 iOS原生应用与Web页面元素交互方式有很多,JavaScriptCore.拦截协议.第三方框架WebViewJavaScriptBridge. ...
- 【iOS】UIWebView HTML5 扩展
对于不少iOS开发人员来说,HTML5的内容比較陌生. 尤其是UIWebView类的 stringByEvaluatingJavaScriptFromString 方法 让非常多人认为又得学一种新的语 ...
- How to load a local .CSS file & JavaScript resources using iPhone UIWebView Class
This post will cover the basic setup and creation of an application with web content for iPhone that ...
- iOS开发——网络篇——UIWebview基本使用,NSInvocation(封装类),NSMethodSignature(签名),JavaScript,抛异常,消除警告
一.UIWebView简介 1.UIWebView什么是UIWebViewUIWebView是iOS内置的浏览器控件系统自带的Safari浏览器就是通过UIWebView实现的 UIWebView不但 ...
- iOS中UIWebView与其中网页的javascript的交互
首发:个人博客,更新&纠错&回复 1.本地语言调js的方式与android中的方式类似,也是向WebView控件发送要调用的js语句 2. 但js调本地语言,则不是像android那样 ...
- iOS UIWebView中javascript与Objective-C交互、获取摄像头
UIWebView是iOS开发中常用的一个视图控件,多数情况下,它被用来显示HTML格式的内容. 支持的文档格式 除了HTML以外,UIWebView还支持iWork, Office等文档格式: Ex ...
- 【iOS开发】UIWebView与JavaScript(JS) 回调交互
------------------------------------------------- 很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一 ...
- iOS 使用UIWebView把oc代码和javascript相关联
首先请参看一篇文章,作者写的很明白,请参看原地址 http://blog.163.com/m_note/blog/static/208197045201293015844274/. 其实,oc和js的 ...
- UIWebView 与 JS 交互(1):Objective-C 调用 Javascript
众所周知,随着硬件水平的发展,HTML5 与原生 APP 性能差距不断缩小,正在互联网科技领域扮演者越来越重要的角色.作为一种能很大程度上节约成本的技术方案,通过 HTML5 及 JS 实现的跨平台技 ...
随机推荐
- storm配置
配置 Storm 有大量配置项用于调整 nimbus.supervisors 和拓扑的行为.有些配置项是系统级的配置项,在拓扑中不能修改,另外一些配置项则是可以在拓扑中修改的. 每一个配置项都在 St ...
- 洛谷-哥德巴赫猜想(升级版)-BOSS战-入门综合练习1
题目背景 Background 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和 ...
- SharePoint2013 Excel导出好的代码
C#Excel操作类ExcelHelper.cs 来源:http://www.hellocsharp.com/article/67.aspx C#源码世界 发布于: 2014-09-12 使用本类之前 ...
- Developing a Custom Membership Provider from the scratch, and using it in the FBA (Form Based Authentication) in SharePoint 2010
//http://blog.sharedove.com/adisjugo/index.php/2011/01/05/writing-a-custom-membership-provider-and-u ...
- iOS 加载本地的html文件
方法1: self.webView = [[UIWebView alloc]initWithFrame:self.view.bounds]; NSString *path = [[NSBundle ...
- js 禁止重复提交
/*分享按钮*/ var flag = true; $(".recommed a").click(function() { if (flag == true) { getServe ...
- 第19讲 不带参数功能FC的编程与应用
- 查看Android下生成的.db数据库
1.在cmd中找到sdk中的platform-tools文件夹. 2.输入adb shell命令. 3.再输入sqlite3 /data/data/com.svs.db/databases/svs.d ...
- Ant 删除目录 vs 清空目录
Apache Ant 可以用下面的命令来删除目录 <delete dir="${lucene.dir}"/> 但是这会删除整个目录,而我现在只想清空目录内的所有文件和子 ...
- ASP.NET ValidationGroup 属性和CssClass 属性
定义和用法 获取或设置在 Button 控件回发到服务器时要进行验证的控件组. 通常在表单中存在多个按钮时使用该属性. 语法 <asp:Button ValidationGroup=" ...