UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容。其中就要用到javascript的知识,而UIWebView与javascript交互的方法就是stringByEvaluatingJavaScriptFromString:

有了这个方法我们可以通过objc调用javascript,可以注入javascript。

首先我们来看一下,如何调用javascript:

  1. [webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];

这儿myFunction()就是我们的javascript方法。

再来看看入何注入javascript,我们先写一个需要注入的javascript:

  1. function showAlert() {
  2. alert('in show alert');
  3. }

保存为test.js,然后拖到xcode 的resource分组下。再用代码在初始化的时候注入这个js(如在viewDidLoad方法里)。

  1. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"js"];
  2. NSString *jsString = [[NSString alloc] initWithContentsOfFile:filePath];
  3. [webView stringByEvaluatingJavaScriptFromString:jsString];

这样就注入了上面的js,那么我们可以随时调用js的方法,如何调用,上面有介绍。

那么我们能不能通过js来调用objc的方法呢。 当然可以,原理就是利用UIWebView重定向请求,传一些命令到我们的UIWebView,在UIWebView的delegate的方法中接收这些命令,并根据命令执行相应的objc方法。这样就相当于在javascript中调用objc的方法。说起来有点抽象,看看代码一下就明白。

首先我们写一个javascript 方法如下:

  1. function sendCommand(cmd,param){
  2. var url="testapp:"+cmd+":"+param;
  3. document.location = url;
  4. }
  5. function clickLink(){
  6. sendCommand("alert","你好吗?");
  7. }

然后在你的html里调用这个js方法 如:

  1. <input type="button" value="Click me!" onclick="clickLink()" /><br/>

最后我们在UIWebVew中截获这个重定向请求:

  1. #pragma mark --
  2. #pragma mark UIWebViewDelegate
  3. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  4. NSString *requestString = [[request URL] absoluteString];
  5. NSArray *components = [requestString componentsSeparatedByString:@":"];
  6. if ([components count] > 1 && [(NSString *)[components objectAtIndex:0] isEqualToString:@"testapp"]) {
  7. if([(NSString *)[components objectAtIndex:1] isEqualToString:@"alert"])
  8. {
  9. UIAlertView *alert = [[UIAlertView alloc]
  10. initWithTitle:@"Alert from Cocoa Touch" message:[components objectAtIndex:2]
  11. delegate:self cancelButtonTitle:nil
  12. otherButtonTitles:@"OK", nil];
  13. [alert show];
  14. }
  15. return NO;
  16. }
  17. return YES;
  18. }

看了代码是不是清楚得不能再清楚了呀?  我想phonegap可能与是这样实现的,没去研究过。 不过有一个开源工程大家可以看看,它允许javascript调用objective_c的方法。叫jsbridge-to-cocoa

http://code.google.com/p/jsbridge-to-cocoa/

还有两个相关工程

WebViewJavascriptBridge 与 GAJavaScript 值得大家慢慢研究。

最新文章

  1. CSS 3学习——animation动画
  2. Retrofit2.0起步篇
  3. jsp九大内置对象
  4. C#图片加水印实例与代码
  5. Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗、嗅探、dns欺骗、session劫持
  6. shellKali Linux Web 渗透测试— 初级教程(第三课)
  7. MySQL_数据分页查询(limit用法)
  8. memcache command
  9. DAY1--JAVA
  10. 第一次C语言作业
  11. 浅谈机器人控制与仿真设计----RDS和ROS
  12. 改造断路器集群监控Hystrix Turbine实现自动注册消费者、实时监控多个服务
  13. HDU1846 Brave Game
  14. poj-1386(欧拉回路)
  15. SQL开发测试使用基础
  16. 笔记 : CSS3实现背景渐变过渡
  17. U3D框架—单例框架
  18. webscan v0.01
  19. 用js 实现代码获取下拉框的value值
  20. 在Centos 7 上面 安装MySQL 5.7 简录

热门文章

  1. C#第一节课
  2. LINQ Enumerable 续 II
  3. YII框架路由和URL生成
  4. ORACLE安装过程中检查步骤出现的错误和解决方法【转】
  5. cocoapods出现Diff: /../Podfile.lock: No such file or directory错误
  6. iOS UI_APPEARANCE_SELECTOR
  7. Php 基本语法
  8. Java实现断点下载Demo
  9. a标签增加onclick事件提示未定义function
  10. CSS3+HTML5学习笔记(1)