webview是ios中显示远程数据的网页控件,webview能显示的内容很多,MP4、文本、pdf等等;
关于js和oc代码的互相调用
1:oc中调用js代码;
>>oc中调用js代码很简单,一个方法:stringByEvaluatingJavaScriptFromString:@“”;
>>要执行的js代码方法到字符串中就可以了;
2:js中执行oc的某段代码;
>>js中执行oc的代码要通过一个桥梁:
者桥梁就是webview的一个代理方法:(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
这个方法会在webview发送某个请求时调用,并且把request传了进来;返回YES, 可以加载这个请求, 返回NO, 代表禁止加载这个请求;
>>代码实现案例:在webview中通过js代码来打开手机的照相机
js代码:
function openCamera() { window.location.href = 'iOS://openCamera'; // 这段代码想要调用oc中的openCamera这个方法来打开相机 // window.location.href这个方法会重新发送请求 这个请求会通过webview的代理方法传给oc // iOS:// 是定义的协议头,oc拿到请求的字符串后,看到这个协议头就拦截,执行后边的方法,这个协议头是自己指定的; }
oc的webview代理方法代码:
/** 当webView发送一个请求之前都会调用这个方法, 返回YES, 可以加载这个请求, 返回NO, 代表禁止加载这个请求 */ - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *url = request.URL.absoluteString; NSRange range = [url rangeOfString:@"ios://"]; if (range.length != 0) { // 截取方法名 NSString *method = [url substringFromIndex:range.location + range.length]; // 将方法名(字符串)转为SEL类型执行 SEL selector = NSSelectorFromString(method); [self performSelector:selector withObject:nil]; } return YES; }
总结:js中执行oc的代码的重要桥梁:webview的代理方法,也就是上边的方法;执行的方法在字符串中,oc拿到请求的字符串通过截取协议头后边的字符串得到要执行的方法的方法名;最后把截取得到的字符串转为方法执行;