iOS的ios jsbridge是什么怎么做

【iOS开发】UIWebView与JavaScript(JS)&回调交互
-------------------------------------------------
很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一样,
本文提供了一个很好解决UIWebView内js和objc
交互的思路。
自然,从oc到js,可以使用
stringByEvaluatingJavaScriptFromString: 来实现。
从js到oc,采用比较巧妙的设计,UIWebView浏览器拦截
url请求,自定义url的方式拦截交互请。
-------------------------------------------------
-------------------------------------------------
UIWebView是IOS
SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容。其中就要用到javascript的知识,而UIWebView与javascript交互的方法就是stringByEvaluatingJavaScriptFromString:
有了这个方法我们可以通过objc调用javascript,可以注入javascript。
首先我们来看一下,如何调用javascript:
这儿myFunction()就是我们的javascript方法。
再来看看入何注入javascript,我们先写一个需要注入的javascript:
保存为test.js,然后拖到xcode
的resource分组下。再用代码在初始化的时候注入这个js(如在viewDidLoad方法里)。
这样就注入了上面的js,那么我们可以随时调用js的方法,如何调用,上面有介绍。
那么我们能不能通过js来调用objc的方法呢。
当然可以,原理就是利用UIWebView重定向请求,传一些命令到我们的UIWebView,在UIWebView的delegate的方法中接收这些命令,并根据命令执行相应的objc方法。这样就相当于在javascript中调用objc的方法。说起来有点抽象,看看代码一下就明白。
首先我们写一个javascript 方法如下:
[javascript]&
然后在你的html里调用这个js方法
[javascript]&
最后我们在UIWebVew中截获这个重定向请求:
&不过有一个开源工程大家可以看看,它允许javascript调用objective_c的方法。叫
&/p/jsbridge-to-cocoa/
还有两个相关工程
&与&&值得大家慢慢研究。
插入js代码
上面的功能我们可以封装到一个js函数中,将这个函数插入到页面上执行,代码如下:
([title compare: @"Google"]==NSOrderedSame )
[webView stringByEvaluatingJavaScriptFromString:@"var script =
document_createElement_x_x('script');"&
"script.type = 'text/javascript';"&
"script.text = "function myFunction() { "&
"var field =
document.getElementsByName('q')[0];"&
"field.value='朱祁林';"&
"document.forms[0].submit();"&
"document.getElementsByTagName_r('head')[0].a(script);"];&
stringByEvaluatingJavaScriptFromString:@"myFunction();"];&
看上面的代码:
a、首先通过js创建一个script的标签,type为'text/javascript'。
b、然后在这个标签中插入一段字符串,这段字符串就是一个函数:myFunction,这个函数实现google自动搜索关键字的功能。
c、然后使用stringByEvaluatingJavaScriptFromString执行myFunction函数。
1.&一般调用
将本地数据,封装,直接作为JS的返回值。如:获取软件的APPCode
//获取APPCode
*_plist_paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
*_plist_paths_path=[_plist_paths&objectAtIndex:0];
&NSArray *_plist_array= [_plist_paths_path
componentsSeparatedByString:@"/"];
&NSString *_appcode=[[NSString alloc]init];
&for (NSString *item in _plist_array) {
&&if ([item length]==36) {
&&&_appcode=
&NSLog(@"current appcode:%@",_appcode);
//注入到js中
&NSMutableString *_getApkCode=[[NSMutableString
alloc]init];
&[_getApkCode appendFormat:@"
function& _getApkCode(){"];
&[_getApkCode
appendFormat:@"return&];
&[_getApkCode appendString:@" }"];
&[self.webView
stringByEvaluatingJavaScriptFromString:_getApkCode];
&[_getApkCode release];
2.需要跟平台进行交互调用
1.制造含有一定含义的请求如:(location.href="download");
2.在方法:-(BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType中,拦截:
//testMall:http://192.168.1.20:8083本地测试页面地址
*pre_download=[NSString stringWithFormat:@"];
&if([url hasPrefix:pre_download])
//下载代码。。。。
3. 注意事项
a.存在Iframe嵌套的页面,js注入
页面注入JS是注入到,浏览器的html中,对于内部嵌套iframe框架的页面,则无法调用到js。此时相当于调用父页面的JS。
可以通过parent+方法名,来调用你注入的JS。parent.parent的使用个数,可以是多个,不影响js的执行,如果少用parent,可能会导致,调不到你注入的JS
b.存在交互的处理方法。推荐使用方法,iphone只负责提供js接口,不调用html内部或其他的js接口
addDownload()
url='www.XXX.XXX.zip';
download(url);//调用iphone提供的js接口
addDownloadTask_ret();//获取iphone下载接口执行的下载结果,此处调的是本地的一个延迟方法
//获取iphone下载接口执行的下载结果
addDownloadTask_ret()
obj=getDownloadTaskResult();//此处为iphone提供的接口,负责返回当前下载执行情况的结果if(''!=obj||undefined!=obj)
//调用本地的一些后续处理方法。
setTimeout("addDownloadTask_ret2();",1000);
-------------------------------------------------
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。移动端开发(3)
很不错的参考:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:93737次
积分:2690
积分:2690
排名:第11914名
原创:172篇
转载:52篇
(2)(11)(14)(1)(1)(2)(2)(1)(3)(6)(3)(3)(10)(3)(5)(4)(3)(2)(6)(2)(4)(3)(8)(6)(2)(2)(1)(13)(9)(13)(16)(22)(4)(1)(5)(6)(17)(1)(6)(1)(1)

我要回帖

更多关于 ios jsbridge 的文章

 

随机推荐