在新的iOS项目中使用WKWebView
在项目中主要用到的对象
WKWebViewConfiguration
主要包含一些属性,用来初始化 WKWebView
WKProcessPool
当一个 web 被初始化时 ,一个新的处理将产生针对一个特殊的池子 , 多个web可以共享一个
WKUserContentController
可以让js调用ios中特定的方法
1 Wkweb基本配制代码如入:
#pragma mark -- 懒加载WKWebView
-(WKWebView*)wkWebView{
if (!_wkWebView) {
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// 设置偏好设置
config.preferences = [[WKPreferences alloc] init];
// 默认为0
config.preferences.minimumFontSize = 10;
// 默认认为YES
config.preferences.javaScriptEnabled = YES;
// 在iOS上默认为NO,表示不能自动通过窗口打开
config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
// web内容处理池
config.processPool = [ProcessPool sharedProcessPool].wkProcessPool;
// 通过JS与webview内容交互
config.userContentController = [[WKUserContentController alloc] init];
// 注入JS对象名称AppModel,当JS通过AppModel来调用时,
// 我们可以在WKScriptMessageHandler代理中接收到
[config.userContentController addScriptMessageHandler:self name:@"webViewApp"];
self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0,0,kUIScreenWidth - BottomMenuButtonW,kUIScreenHeight)
configuration:config];
//禁止缩放
self.wkWebView.scrollView.scrollEnabled = NO;
self.wkWebView.scrollView.delegate = self;
[self.view addSubview:self.wkWebView];
// 导航代理
self.wkWebView.navigationDelegate = self;
// 与webview UI交互代理
self.wkWebView.UIDelegate = self;
[self.wkWebView addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:0 context:WkwebBrowserContext];
//开启手势触摸
_wkWebView.allowsBackForwardNavigationGestures = YES;
// 设置 可以前进 和 后退
//适应你设定的尺寸
[_wkWebView sizeToFit];
}
return _wkWebView;
}
2.WK中常用的代理方法使用如下
#pragma mark - WKScriptMessageHandler 接收window.webkit.messageHandlers.AppModel.postMessage({body: 'call js confirm in js'}) 注入的数据;
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
if ([message.nameisEqualToString:@"webViewApp"]) {
// 打印所传过来的参数,只支持NSNumber, NSString, NSDate, NSArray,
// NSDictionary, and NSNull类型
MyLog(@"%@", message.body);
}
}
#pragma mark - WKUIDelegate
-(void)webViewDidClose:(WKWebView *)webView {
MyLog(@"%s",__FUNCTION__);
}
//js调用 alert('Objective-C call js to show alert') 会执行此代理方法
-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
MyLog(@"%s",__FUNCTION__);
completionHandler();
MyLog(@"%@", message);
}
// js调用confirm('confirm', 'Objective-C call js to show confirm')会执行此代理方法
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler {
MyLog(@"%s",__FUNCTION__);
completionHandler(YES);
MyLog(@"%@", message);
}
// js调用 prompt('Hello', 'Please input your name:')会执行此代理方法
-(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullableNSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
MyLog(@"%s",__FUNCTION__);
completionHandler(defaultText);
}
#pragma mark --UIScrollViewDelegate 禁止缩放
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return nil;
}