以前用得不多,先開一篇,以後有遇到再補充。 1、JS 調用 OC 1-1)、添加 和 JS 約定的消息名 1-2)、得到 JS 消息 1-3)、移除 補充:這步最為重要,如果不移除,將得不到釋放,比如H5的音樂在退出該VC(dealloc) 還會一直響。 附:JS代碼 ...
以前用得不多,先開一篇,以後有遇到再補充。
1、返回
2、JS 調用 OC
3、獲取、修改、添加網頁信息
1、返回
if (self.mWebView.canGoBack == YES) { [self.mWebView goBack]; }else{ //提示 };
2、JS 調用 OC
2-1)、添加 和 JS 約定的消息名
[self.userContentController addScriptMessageHandler:self name:@"約定的消息名"];
2-2)、得到 JS 消息
#pragma mark - WKScriptMessageHandler - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:@"約定的消息名"]) { NSLog(@"傳過來的value為:%@", message.body[@"約定的key"]); } }
2-3)、移除
- (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.userContentController removeScriptMessageHandlerForName:@"約定的消息名"]; }
補充:這步最為重要,如果不移除,將得不到釋放,比如H5的音樂在退出該VC(dealloc) 還會一直響。
附:JS代碼
function isAndroid(argument) { var u = navigator.userAgent; var flag = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android終端 return flag; } function isIOS(argument) { var u = navigator.userAgent; var flag = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端 return flag; } function share(要傳的value) { if(isAndroid()){ } else if(isIOS()) { window.webkit.messageHandlers.約定的消息名.postMessage({ "約定的key": 要傳的value }); } }
3、獲取、修改、添加網頁信息
3-1)、獲取
3-1-1)、獲取網頁數據
[webView evaluateJavaScript:@"document.body.outerHTML" completionHandler:^(id _Nullable htmlStr, NSError * _Nullable error) { NSLog(@"htmlStr = %@",htmlStr); }];
3-1-2)、獲取網頁高度,看需更新高度(如高度固定,網頁內部能滑動,如更改高度為當前高度,網頁不能滑動)
[webView evaluateJavaScript:@"document.body.scrollHeight" completionHandler:^(id result, NSError *_Nullable error) { }];
補充:如計算出來的高度偏大、字體、圖片偏小,可能是沒自適應,需要對其修改。
參照 “3、獲取、修改、添加網頁信息” -> “3-3)、添加” -> “3-3-1)、自適應圖片” 和 “3-3-2)、自適應文字”
3-2)、修改
3-2-1)、修改背景、文字顏色
[webView evaluateJavaScript:@"document.body.style.backgroundColor=\"#72ADFC \"" completionHandler:nil]; [webView evaluateJavaScript:@"document.body.style.webkitTextFillColor= '#FFFFFF'"completionHandler:nil];
3-2-2)、修改網頁內容
[webView evaluateJavaScript:@"document.getElementsByClassName('logo')[0].src='http://www.測試測試.com/測試測試.jpg'" completionHandler:^(id _Nullable htmlStr, NSError * _Nullable error) { // 延時再顯示(否則之前的logo會刷顯示出來,再刷新當前logo,一閃而過) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 顯示 self.mainWebView.hidden = NO; }); }];
3-3)、添加
3-3-1)、自適應圖片。比如 @"document.body.scrollHeight" 算出來感覺偏大,圖片偏小。需要在在html字元串增加數據
flexHtmlString = [NSString stringWithFormat:@"<html><head><meta content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\" name=\"viewport\"><style type=\"text/css\">img{display: inline-block;max-width: 100%%}</style></head><body>\%@</body></html>",htmlString];
3-3-2)、自適應文字。比如 @"document.body.scrollHeight" 算出來感覺偏大,文字偏小。需要設置WKUserScript
NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"; WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES]; WKUserContentController *wkUController = [[WKUserContentController alloc] init]; [wkUController addUserScript:wkUScript];
3-3-3)、添加高度參數,源數據沒style。
[webView evaluateJavaScript:@"document.getElementsByClassName('logo')[0].style='width: 70px;height:auto !important;'" completionHandler:^(id _Nullable htmlStr, NSError * _Nullable error) { }];