天天看点

iphone UIWEBVIEW JS回调交互

1. 一般调用

将本地数据,封装,直接作为JS的返回值。如:获取软件的APPCode

//获取APPCode

 NSArray *_plist_paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

 NSString *_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=item;

   break;

  }

 }

 NSLog(@"current appcode:%@",_appcode);

//注入到js中

 NSMutableString *_getApkCode=[[NSMutableString alloc]init];

 [_getApkCode appendFormat:@" function  _getApkCode(){"];

 [_getApkCode appendFormat:@"return '%@';",_appcode];

 [_getApkCode appendString:@" }"];

 [self.webView stringByEvaluatingJavaScriptFromString:_getApkCode];

 [_getApkCode release];

2.需要跟平台进行交互调用

思路:

1.制造含有一定含义的请求如:(location.href="download" target="_blank" rel="external nofollow" );

2.在方法:-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType中,拦截:

//testMall:http://192.168.1.20:8083本地测试页面地址

NSString *pre_download=[NSString stringWithFormat:@"%@downLoad",testMall];

 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接口

示例:

html

function addDownload()

{

url='www.XXX.XXX.zip';

download(url);//调用iphone提供的js接口

addDownloadTask_ret();//获取iphone下载接口执行的下载结果,此处调的是本地的一个延迟方法

}

//获取iphone下载接口执行的下载结果

function addDownloadTask_ret()

{

var obj=getDownloadTaskResult();//此处为iphone提供的接口,负责返回当前下载执行情况的结果

if(''!=obj||undefined!=obj)

{

//调用本地的一些后续处理方法。

}

else

{

setTimeout("addDownloadTask_ret2();",1000);

}

}