iOS学习笔记77-ios开发,javascript直接调用oc代码而非通过改变url回调方式
2016-05-08 11:01
756 查看
之前一个ios项目中,需要通过UIWebview来打开一个静态页面,并在静态页面中调用相关object-c代码。
关于如何使用javascript调用object-c中的函数和方法,我搜索了好久网上所有的方法,基本都指明了一个方向,那就是在UIWebview中载入的js代码中通过改变document.locations=“”,然后回调UIWebview的-(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType函数,在上面这个函数中,通过截取NSURLRequest解析js中传递过来的参数,再根据参数来选择早已定义好的方法。有没有别的方法呢?我找了几个月,没找到!但是有一个转机。我偶然知道了javascriptCore.framework这个库于是事情有了转机。二、在js中直接调用oc的方法废话不多说,现在看看如何在UIWebView的javascript中调用oc的方法首先在建立一个UIWebView,代码如下:
//
//webview.m
//login
//
//Createdbywangdanon15-3-19.
//Copyright(c)2015年wangdan.Allrightsreserved.
//
#import"webview.h"
#import
@implementationwebview
-(id)initWithFrame:(CGRect)frame
{
self=[superinitWithFrame:frame];
if(self){
self.webview=[[UIWebViewalloc]initWithFrame:CGRectMake(0,310,self.bounds.size.width,300)];
self.webview.backgroundColor=[UIColorlightGrayColor];
NSString*htmlPath=[[NSBundlemainBundle]resourcePath];
htmlPath=[htmlPathstringByAppendingPathComponent:@"html/index.html"];
NSURL*localURL=[[NSURLalloc]initFileURLWithPath:htmlPath];
[self.webviewloadRequest:[NSURLRequestrequestWithURL:localURL]];
[selfaddSubview:self.webview];
JSContext*context=[self.webviewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"log"]=^(){
NSLog(@"+++++++BeginLog+++++++");
NSArray*args=[JSContextcurrentArguments];
for(JSValue*jsValinargs){
NSLog(@"%@",jsVal);
}
JSValue*this=[JSContextcurrentThis];
NSLog(@"this:%@",this);
NSLog(@"-------EndLog-------");
};
//[contextevaluateScript:@"log('ider',[7,21],{hello:'world',js:100});"];
}
returnself;
}
@end(1)在上述代码中,使用javascriptCore.framework,首先使用UIWebview加载一个静态网页,并使用JSContext*context=[self.webviewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];获取该UIWebview的javascript执行环境。(2)在该javascript执行环境中,定义一个js函数,注意关键点来了这个函数的执行体完全是objective-c代码写的,也就是下面:
context[@"jakilllog"]=^(){
NSLog(@"BeginLog");
NSArray*args=[JSContextcurrentArguments];
for(JSValue*jsValinargs){
NSLog(@"%@",jsVal);
}
JSValue*this=[JSContextcurrentThis];
NSLog(@"-------EndLog-------");
};
(3)试想一下,在定义的webview中,如果使用js执行log这个函数,那么会不会调用上面oc中block段代码呢,答案是肯定的!下面看看UIWebView中所加载的html及其js代码是如何写的(4)index.html代码
<scripttype="text/javascript"src="index.js"></script>
点击button
上面html定义了一个button,然后引用index.js,点击button的响应函数为buttonClick()
该函数在index.js中定义,如下
functionbuttonClick()
{
jakilllog("helloworld");
}
意思是点击这个button,就调用jakilllog()函数,jakilllog()函数显然是我们在oc中实现的一个block段,就是上述绿色部分的block段。点击button会执行么?答案是肯定的。下面上图下图是执行的结果点击html中的button,能够执行oc中的代码说明直接从js调用oc的意图达到。
一、以前使用js调用object-c的方法
关于如何使用javascript调用object-c中的函数和方法,我搜索了好久网上所有的方法,基本都指明了一个方向,那就是在UIWebview中载入的js代码中通过改变document.locations=“”,然后回调UIWebview的-(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType函数,在上面这个函数中,通过截取NSURLRequest解析js中传递过来的参数,再根据参数来选择早已定义好的方法。有没有别的方法呢?我找了几个月,没找到!但是有一个转机。我偶然知道了javascriptCore.framework这个库于是事情有了转机。二、在js中直接调用oc的方法废话不多说,现在看看如何在UIWebView的javascript中调用oc的方法首先在建立一个UIWebView,代码如下:<scripttype="text/javascript"src="index.js"></script>
点击button
{
jakilllog("helloworld");
}
相关文章推荐
- iOS Runloop详解
- iOS图片的自动适配(通过类别实现)
- IOS开发学习-基础环境搭建-1
- iOS三种多线程编程的技术介绍
- iOS开发多线程篇—多线程的的相关概念(1)
- iOS多线程篇:NSThread
- ios中URL中出现字典参数的处理问题
- IOS 模仿TableView封装
- iOS 返回时tableview内容上移
- iOS label根据内容自适应宽度
- IOS博客项目搭建-13-发微博弹窗
- iOS开发Touch ID的简单使用
- iOS开发--TableView详细解释
- IOS CoreAnimation
- iOS开发者必看的全球100个最佳博客
- iOS开发中的错误整理,启动图片设置了没有效果;单独创建xib需要注意的事项;图片取消系统渲染的快捷方式
- ios 绘图
- iOS 指纹识别
- IOS9中联系人对象的使用及增删改查操作的函数封装
- iOS8.0以后的相册