WKWebView实现简单的轻应用WKWebViewWKWebView与js交互

WKWebView

WKWebView是现代 WebKit API 在 iOS 8 和 OS X Yosemite 应用中的核心部分。它代替了 UIKit 中的UIWebView和 AppKit 中的WebView,提供了统一的跨双平台 API。如果你的app只需要支持iOS8.0之后的版本,那么非常建议你使用WKWebView来替代UIWbeView,性能不止提升了一个档次。

WKWebView与js交互

所谓轻应用,简单的来说就是原生应用集成了html页面入口,还能通过js与native实现交互,例如:通过js调用native封装好的viewController实现扫描与对应反馈功能。WKWebView初始化:

 - (void)viewDidLoad {

 [superviewDidLoad];
 WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc]init];
 [config.userContentControlleraddScriptMessageHandler:self.jsBridgename:@"observe"];
 self.webView= [[WKWebViewalloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height)configuration:config];
 [self.viewaddSubview:self.webView];
 self.jsBridge= [JSBridgeManagerjsBridgeWithDelegate:self];
 self.webView.UIDelegate=self.jsBridge;
 self.webView.navigationDelegate=self.jsBridge;
 NSString*url = [self.pathstringByReplacingOccurrencesOfString:@" "withString:@""];
 ICLog(@"webView: %@", url);
 [self.webViewloadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:url]]];
 }
 

在JSBridgeManager类里进行代理设置

简单的wkwebview的代理<WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler>

#pragma mark - WKNavigationDelegate

页面开始加载时调用

 - (void)webView:(WKWebView*)webView didStartProvisionalNavigation:(WKNavigation*)navigation {
 NSLog(@"%s -- %@",__FUNCTION__, webView.URL);
 }
 

当内容开始返回时调用

 - (void)webView:(WKWebView*)webView didCommitNavigation:(WKNavigation*)navigation {
 NSLog(@"%s",__FUNCTION__);
 }
 

页面加载完成之后调用

 - (void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation {
 NSLog(@"%s",__FUNCTION__);
 }
 

加载失败时调用

 - (void)webView:(WKWebView*)webView didFailProvisionalNavigation:(WKNavigation*)navigation withError:(NSError*)error {
 NSLog(@"%s",__FUNCTION__);
 }
 

接收到服务器跳转请求之后调用

 - (void)webView:(WKWebView*)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation {
 NSLog(@"%s",__FUNCTION__);
 }
 

在收到响应后,决定是否跳转

 - (void)webView:(WKWebView*)webView decidePolicyForNavigationResponse:(WKNavigationResponse*)navigationResponse decisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler {
 //允许跳转
 decisionHandler(WKNavigationResponsePolicyAllow);
 return;
 }
 

在发送请求之前,决定是否跳转<处理js与native交互代码>

 - (void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler {
 NSLog(@"%@", navigationAction.request.URL);
 NSURL*url = navigationAction.request.URL;
 if([[[urlscheme]lowercaseString]isEqualToString:kTGJSBridgeProtocolScheme]) {
 [selfdispatchNotification:[urlhost]fromWebView:webView];
 }else{
 //forward
 }
 decisionHandler(WKNavigationActionPolicyAllow);

 }

 

处理js发送的请求,如果以某个jsbridge为scheme的则为交互信息

 - (void)dispatchNotification:(NSString*)notificationString

 fromWebView:(WKWebView*)webView
 {
 if([notificationStringhasPrefix:kTGJSBridgePostNotificationWithId]) {
 NSDictionary*responseDict = [selffetchNotificationWithStr:notificationStringfromWebView:webView];
 if([self.delegaterespondsToSelector:@selector(jsBridge:didReceivedNotificationDictionary:fromWebView:)]) {
 [self.delegatejsBridge:selfdidReceivedNotificationDictionary:responseDictfromWebView:webView];
 }
 }else{

 }

 }

 

decidePolicyForNavigationAction能读取到由js发起的请求,native截取对应的url,读取与web端定义的协议规则,可进行简单的通讯。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏雨尘分享

iOS 和 H5 交互那些事 (UIWebView、WKWebView 总结篇)

4775
来自专栏iOS开发随笔

WKWebView不显示JS的Alert,Confirm,TextInput弹框解决方法

1223
来自专栏编程语言

iOS 无弹框换图标,直接用就可以了

        对于iOS,是开发了API可以换图标,但是有规定的,就是你要换的图标是要在APP里面内置的,也就是说你要换的APPicon,是提前放在APP 包...

641
来自专栏移动端开发

WKWebView的使用与JS交互详细解读

前言:     WKWebView 这是在iOS8.0之后增加的一个比UIWebView更加完善和强大的控件!看网上关于它的博客也是有许多的了,从各个方面总结一...

2857
来自专栏hrscy

使用 Unity 来实现 iOS 原生弹框

如果你有这些疑虑,那么现在你来对地方了。在这篇博客中,我将使用 Unity 创建 iOS 原生弹框。

1233
来自专栏一“技”之长

iOS获取通讯录联系人信息 原

随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权。权限申请代码示例如下:

673
来自专栏移动端周边技术扩展

解决H5微信支付返回跳转问题

1463
来自专栏腾讯Bugly的专栏

WKWebView 那些坑

导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用、内存泄漏的 UIWebView。...

56211
来自专栏移动端周边技术扩展

WKWebView实现简单的轻应用

1847
来自专栏QQ空间开发团队的专栏

WKWebView 那些坑

WKWebView 是苹果在 WWDC 2014上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用,本文主要讲述适配 WKWebView 过...

2K1

扫码关注云+社区