因为在iOS中没有WebKit.Framework这个库的,所以也就没有
windowScriptObject对象方法了。要是有这个的方法的话
就方便多了,(ps:MacOS中有貌似)
现在我们利用其他方法去达到js与objective-c的交互效果。
首先是objective-c调用js中的代码,可以用uiwebview中的一个方法
stringByEvaluatingJavaScriptFromString:后面接的是js中的方法名。这个函数的返回值就是所调用js方法
的返回值。
而在js调用objective-c的方法就没那么简单了,
在js中的代码应该这么做:
function testFunc(cmd,parameter1)
{
alert(1);
document.write(Date());
document.location="objc://"+cmd+":/"+parameter1;
//cmd代表objective-
c中的的方法名,parameter1自然就是参数了
}
而在objective-c中,也是利用uiwebview的一个方法,
- (BOOL)webView:(UIWebView*)webView
shouldStartLoadWithRequest:
(NSURLRequest*)request
navigationType:
(UIWebViewNavigationType)navigationType
//这个方法是网页
中的每一个请求都会被触发的
{
NSString *urlString = [[request URL]
absoluteString];
NSArray *urlComps = [urlString
componentsSeparatedByString:@"://"];
if([urlComps count] && [[urlComps
objectAtIndex:0]
isEqualToString:@"objc"])
{
NSArray *arrFucnameAndParameter =
[(NSString*)[urlComps
objectAtIndex:1]
componentsSeparatedByString:@":/"];
NSString *funcStr = [arrFucnameAndParameter
objectAtIndex:0];
if (1 == [arrFucnameAndParameter count])
{
// 没有参数
if([funcStr isEqualToString:@"doFunc1"])
{
/*调用本地函数1*/
NSLog(@"doFunc1");
}
}
else if(2 == [arrFucnameAndParameter
count])
{
//有参数的
if([funcStr isEqualToString:@"doFunc1"]
&&
[arrFucnameAndParameter objectAtIndex:1])
{
/*调用本地函数1*/
NSLog(@"doFunc1:parameter");
}
}
return NO;
};
return YES;
}
这个方法是可以达到js调用本地objective-c的方法,可惜没办法把返回值返回给js,所以还是要绕过
stringByEvaluatingJavaScriptFromString:这个弯,用
stringByEvaluatingJavaScriptFromString:函数去掉js的方法,把返回值当做js方法中的参数形式传回去给
js。