专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

iOS H5容器的一些探究:UIWebView和WKWebView的比较和选择

Cocoa开发者社区  · 公众号  · ios  · 2016-09-07 08:07

正文

请到「今天看啥」查看全文


sayHello()";

[_webView stringByEvaluatingJavaScriptFromString:jsString];

NSString *jsString = @" var p = document.createElement('p'); \

p.innerText = 'New Line';            \

document.body.appendChild(p);        \

";

[_webView stringByEvaluatingJavaScriptFromString:jsString];


2.4、JS中调用Naitve的方法


具体让js通知native进行方法调用,我们可以让js产生一个特殊的请求。可以让Native代码可以拦截到,而且不然用户察觉。业界一般的实现方案是在网页中加载一个隐藏的iframe来实现该功能。通过将iframe的src指定为一个特殊的URL,实现在- (BOOL)webView:(UIWebView )webView shouldStartLoadWithRequest:(NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType;方案中进行拦截处理。对应的js调用代码如下:


function loadURL(url) {

var iFrame;

iFrame = document.createElement("iframe");

iFrame.setAttribute("src", url);

iFrame.setAttribute("style", "display:none;");

iFrame.setAttribute("height", "0px");

iFrame.setAttribute("width", "0px");

iFrame.setAttribute("frameborder", "0");

document.body.appendChild(iFrame);

// 发起请求后这个iFrame就没用了,所以把它从dom上移除掉

iFrame.parentNode.removeChild(iFrame);

iFrame = null;

}


比如我们在js代码中,调用一下两个js方法:


function iOS_alert() {//调用自定义对话框

loadURL("alert://abc");

}

function call() {//  js中进行拨打电话处理

loadURL("tel://17715022071");

}


当你触发以上方法的时候,就会进入webview的代理方法中进行拦截。


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

NSURL * url = [request URL];

if ([[url scheme] isEqualToString:@"alert"]) {//拦截请求,弹出自定义对话框

UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"test" message:[url host] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

[alertView show];

return NO;

}else if([[url scheme] isEqualToString:@"tel"]){//拦截拨打电话请求

BOOL result = [[UIApplication sharedApplication] openURL:url];

if (!result) {

NSLog(@"您的设备不支持打电话");

} else {

NSLog(@"电话打了");

}

return NO;

}

return YES;

}


这样我们就可以让js进行native的调用。


三、WKWebView的基本用法


3.1、加载网页


WKWebView *webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];

NSURL *url = [NSURL URLWithString:@"http://www.taobao.com"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

[webView loadRequest:request];

[self.view addSubview:webView];


3.2、几个常用的代理方法


/**

*  根据webView、navigationAction相关信息决定这次跳转是否可以继续进行,这些信息包含HTTP发送请求,如头部包含User-Agent,Accept,refer

*  在发送请求之前,决定是否跳转的代理

*  @param webView

*  @param navigationAction

*  @param decisionHandler

*/

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

decisionHandler(WKNavigationActionPolicyAllow);

}

/**

*  这个代理方法表示当客户端收到服务器的响应头,根据response相关信息,可以决定这次跳转是否可以继续进行。







请到「今天看啥」查看全文