JS和Native交互
WKWebView 通過 WKWebViewConfiguration 配合 WKNavigationDelegate 與JS進(jìn)行調(diào)用鞭呕。
js調(diào)用原生
native
- (WKWebViewConfiguration *)webConfig
{
if (!_webConfig) {
_webConfig = [WKWebViewConfiguration new];
WKUserContentController *userController = [WKUserContentController new];
[userController addScriptMessageHandler:self name:@"openInfo"];
_webConfig.userContentController = userController;
}
return _webConfig;
}
- (WKWebView *)webView
{
if (!_webView) {
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:self.webConfig];
_webView.navigationDelegate = self;
}
return _webView;
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
//js調(diào)用原生
if ([message.name isEqualToString:@"openInfo"]) {
id jsToNativeData = message.body;
//js調(diào)用土榴,拿到對應(yīng)的參數(shù)做處理
}
}
html
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<button style="width: 200px;height: 100px" onclick="openInfo()">點我</button>
</head>
<body>
<script type="text/javascript">
function openInfo() {
if (navigator.platform.match(/iPhone|iPod|iPad/) {
window.webkit.messageHandlers.openInfo.postMessage("Hello WebKit!");
//關(guān)鍵是這里window.webkit.messageHandlers.[調(diào)用的名字].postMessage("調(diào)用的參數(shù)");
}
}
</script>
</body>
</html>
注入JS
- (WKWebViewConfiguration *)webConfig
{
if (!_webConfig) {
_webConfig = [WKWebViewConfiguration new];
WKUserContentController *userController = [WKUserContentController new];
//js 代碼
NSString *js = @"js代碼";
//WKUserScriptInjectionTimeAtDocumentEnd 加載完注入
//WKUserScriptInjectionTimeAtDocumentStart 加載開始注入
WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
[userController addUserScript:script];
//js調(diào)用原生
[userController addScriptMessageHandler:self name:@"openInfo"];
_webConfig.userContentController = userController;
}
return _webConfig;
}
WKWebView的Title
UIWebView 獲取document.title
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
WKWebView 獲取document.title
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
{
NSString *title = webView.title;
}
WKWebView 禁止縮放方法
第一種
- (WKWebView *)webView
{
if (!_webView) {
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:self.webConfig];
_webView.navigationDelegate = self;
//設(shè)置scrollView.delegate = self;
_webView.scrollView.delegate = self;
}
return _webView;
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return nil;
}
第二種
在html網(wǎng)頁端禁止縮放,加入user-scalable=no别威,此處采用注入js的方法更改meta
- (WKWebViewConfiguration *)webConfig
{
if (!_webConfig) {
_webConfig = [WKWebViewConfiguration new];
WKUserContentController *userController = [WKUserContentController new];
NSString *js = @" $('meta[name=description]').remove(); $('head').append( '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,user-scalable=no\">' );";
WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
[userController addUserScript:script];
[userController addScriptMessageHandler:self name:@"openInfo"];
_webConfig.userContentController = userController;
}
return _webConfig;
}
WKWebView 不自動打開 target=“_blank”的鏈接
解決辦法,參考http://stackoverflow.com/
Add yourself as the WKNavigationDelegate
_webView.navigationDelegate = self;
and implement following code in the delegate callback decidePolicyForNavigationAction:decisionHandler:
應(yīng)用外部打開鏈接
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
if (!navigationAction.targetFrame) {
NSURL *url = navigationAction.request.URL;
UIApplication *app = [UIApplication sharedApplication];
if ([app canOpenURL:url]) {
[app openURL:url];
}
}
decisionHandler(WKNavigationActionPolicyAllow);
}
應(yīng)用內(nèi)部打開鏈接
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
if (!navigationAction.targetFrame) {
[webView loadRequest:navigationAction.request];
}
decisionHandler(WKNavigationActionPolicyAllow);
}