最近因為項目催的緊悲靴,所以一些模塊是用web做的,里邊有一些和原生代碼的交互和互相調(diào)用偿凭,所以就研究了一下WKWebView的使用和與web的交互婶熬。這算是我研究完成后寫的記錄筆記吧,所以有些東西是人家的量窘,不是我的原創(chuàng)雇寇,望不要較真,我只是整理了一下蚌铜,加上一些自己的理解锨侯。好了,廢話不多說了冬殃,showTime!
iOS8之后,蘋果推出了新框架Wekkit缎脾,提供了替換UIWebView的組件WKWebView拔鹰。速度更快了,占用內(nèi)存更少了涣觉,而且和web交互也更方便了痴荐。
詳細的wkWebView的介紹,我就不多做贅述了官册。網(wǎng)上有橫多介紹的生兆。
一、創(chuàng)建WKWebView;
@property (nonatomic,retain)WKWebView *webView;創(chuàng)建為屬性
懶加載
-(WKWebView *)webView{
if (!_webView) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;
//為了與js交互膝宁,初始化 webview 的設置鸦难。
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內(nèi)容處理池
config.processPool = [[WKProcessPool alloc] init];
// 通過JS與webview內(nèi)容交互
config.userContentController = [[WKUserContentController alloc] init];
// 注入JS對象名稱AppModel,當JS通過AppModel來調(diào)用時明刷,
// 我們可以在WKScriptMessageHandler代理中接收到
[config.userContentController addScriptMessageHandler:self name:@"OpenPage"];
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, kScreenHeight*(70/736.0f), kScreenWidth, kScreenHeight-kScreenHeight*(70/746.0f)-aScaleH(58))
configuration:config];
_webView.backgroundColor = [UIColor clearColor];
_webView.scrollView.bounces = NO;
_webView.scrollView.showsVerticalScrollIndicator = NO;
_webView.scrollView.backgroundColor = [UIColor clearColor];
[self.view addSubview: _webView];
_webView.UIDelegate = self;
_webView.navigationDelegate = self;
}
return _webView;
}
// 我們可以在WKScriptMessageHandler代理中接收到(上面已包含)
[config.userContentController addScriptMessageHandler:self name:@"OpenPage"];
上面代碼中這一行是關鍵婴栽,其中“OpenPage”是注冊的關鍵詞,得和js中的統(tǒng)一辈末,這樣在下邊的代理中就可以識別關鍵詞愚争,實現(xiàn)js調(diào)用oc了
二、添加代理
<UIWebViewDelegate,WKScriptMessageHandler,WKUIDelegate,WKNavigationDelegate>
其中關鍵是WKScriptMessageHandler這個代理挤聘,其他的和交互聯(lián)系不大
三轰枝、實現(xiàn)代理
在代理中處理一些js對oc的操作
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"OpenPage"]) {
//其中body中為傳過來的內(nèi)容,在這里邊和實現(xiàn)一些oc的操作
NSLog(@"傳過來的值為===%@,%@", message,message.body);
}
}
在web中的JS代碼為
window.webkit.messageHandlers.OpenPage.postMessage(param);//param為傳的參數(shù)
四组去、oc調(diào)js的方法
其實這個最簡單
NSString *jsStr = (這里是js的方法名)
[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"%@----%@",result, error);
}];
到這里就完了鞍陨,這是整理版 ,也是精簡版从隆。希望能幫到你诚撵。