iOS开发 之 WKWebView

本文探讨了iOS开发中的WKWebView,对比了WKWebView与UIWebView的方法,并介绍了WKWebView如何实现与JavaScript的交互,包括JS调用OC和OC调用JS的示例代码。虽然与Android的交互方式相似,但WKWebView的实现机制有所不同,需要遵守WKScriptMessageHandler代理协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用时首先导入WebKit.framework

2.常用UIWebView与WKWebView方法比较如下:

UIWebView:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
url的获得方法:NSString *url = [[request URL] absoluteString];
WKWebView:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
url的获得方法:NSString *url = [navigationAction.request.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
通过decisionHandler(WKNavigationActionPolicyCancel);decisionHandler(WKNavigationActionPolicyAllow)
决定是否允许跳转
- (void)webViewDidFinishLoad:(UIWebView *)webView
对应
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
在这个方法里通常的操作是OC调JS的操作,使用
[webView evaluateJavaScript: completionHandler:^(id object, NSError * _Nullable error) {

}];
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
对应
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error

以上三个方法,可以完成WKWebView与UIWebView的等价替换,暂时完成了异步与同步的交换。

众所周知,同样是与JS交互,Android就容易的多了,与安卓类似的是WKWebView在“形式”上,也像这种交互方式靠拢。

来看看WK仿的是不是有些可笑:

 WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    WKUserContentController *userContent = [[WKUserContentController alloc] init];
    [userContent addScriptMessageHandler:self name:@"JSInterface"];
    config.userContentController = userContent;

um…看到这里是不是看到了希望,写一个类给JS调用,瞬间感觉高大上啊。别急,这里self是要遵守代理协议WKScriptMessageHandler的,那么本质区别来了,JS调用OC的实质是在这个代理方法中进行的:

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

是不是大跌眼镜呢。。。。。

来看看与JS交互的代码吧:
1、JS调OC

window.webkit.messageHandlers.JSInterface.postMessage("2");
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    NSLog(@"%@",message.name);//注册的名称
    NSLog(@"%@",message.body);//传值,此处为2   支持字典、数组等的传值。
}
}

2、OC调JS

[webView evaluateJavaScript: completionHandler:^(id object, NSError * _Nullable error) {

}];

官方文档:https://developer.apple.com/reference/webkit

方法调用的先后顺序

//根据请求信息决定是否条转,在这个方法里可以立即调用block执行跳转,也可以保留block,之后异步调用。
1、- (void)webView:(WKWebView *)webView 
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction 
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
//在webView中刚开始加载网页内容时调用
2、- (void)webView:(WKWebView *)webView 
didStartProvisionalNavigation:(WKNavigation *)navigation;
//根据相应信息决定是否跳转
3、webView:decidePolicyForNavigationResponse:decisionHandler:
//开始接收网页内容时调用
4、- (void)webView:(WKWebView *)webView 
didCommitNavigation:(WKNavigation *)navigation;
//导航加载完成时调用
5、- (void)webView:(WKWebView *)webView 
didFinishNavigation:(WKNavigation *)navigation;

未完待续。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值