iOS WKWebView與js交互

WKWebView在執(zhí)行內(nèi)存上圓圓高于UIWebView

不多說(shuō)直接上代碼

不管是移除網(wǎng)頁(yè)內(nèi)容,還是給圖片慈鸠,按鈕添加點(diǎn)擊青团,都是一個(gè)套套路芦昔,找節(jié)點(diǎn)烟零,如果不會(huì)找節(jié)點(diǎn)锨阿,Web開發(fā)會(huì)

#import "ViewController.h"
#import <WebKit/WebKit.h>

@interface ViewController ()<WKNavigationDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    WKWebView *webView = [[WKWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    webView.navigationDelegate = self;
    [self.view addSubview:webView];
    NSURL *url = [NSURL URLWithString:@"http://m.dianping.com/tuan/deal/5501525"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];
}


/*
 *
 *  頁(yè)面加載完成時(shí)候調(diào)用   JS注入
 */
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    
    NSMutableString *MString = [NSMutableString string];
    
    // 刪除網(wǎng)頁(yè)內(nèi)不需要的內(nèi)容
    
    //1. 頂部的返回 --> 起名字 結(jié)尾要加;
    [MString appendFormat:@"var headerTag = document.getElementsByTagName('header')[0];"];
    //刪除時(shí)需要找到父標(biāo)簽 --> 自己干掉自己, 下不去手
    //parentNode:父標(biāo)簽
    //removeChild:移除子標(biāo)簽內(nèi)容
    [MString appendFormat:@"header.parentNode.removeChild(header);"];
    [MString appendFormat:@"var buy  = document.getElementsByClassName('buy-now ')[0];"];
    [MString appendFormat:@"buy.parentNode.removeChild(buy);"];
    
    //給image添加點(diǎn)擊事件
    [MString appendString:@"var imgTag = document.getElenmentsByTagName('figure')[0].children[0];imgTag.onclick=function imgClick(){window.location.];
    
    
    [webView evaluateJavaScript:MString completionHandler:nil];
}
/*
 *
 *  網(wǎng)頁(yè)即將開始時(shí)候調(diào)用桐智,攔截標(biāo)簽點(diǎn)擊發(fā)送的請(qǐng)求
 */
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

    NSString *urlString = navigationAction.request.URL.absoluteString;
    NSLog(@"%@",urlString);
    
    if ([urlString isEqualToString:@"https://www.baidu.com"]) {
        
        //fuck come fuck go
    }
    
    decisionHandler(WKNavigationActionPolicyAllow);
}

@end

!!!!!!!以上是oc調(diào)用js.下面來(lái)js調(diào)用oc!!!!!!

#import "ViewController.h"
#import <WebKit/WebKit.h>
#import <XLPhotoBrowser+CoderXL/XLPhotoBrowser.h>

#define ScreenWidth [UIScreen mainScreen].bounds.size.width
#define ScreenHeight [UIScreen mainScreen].bounds.size.height

@interface ViewController ()<WKUIDelegate,WKScriptMessageHandler>

@property (strong, nonatomic)   WKWebView                   *webView;
@property (strong, nonatomic)   UIProgressView              *progressView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title = @"圖片下載測(cè)試";
    
    //初始話WKWebView
    [self initWKWebView];
    
    //初始化進(jìn)度條
    [self initProgressView];
    //
    //添加進(jìn)度條監(jiān)聽
    [self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    
}

- (void)initWKWebView{
    
    //進(jìn)行配置控制器
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init];
    //實(shí)例化對(duì)象
    configuration.userContentController = [WKUserContentController new];
    
    [configuration.userContentController addScriptMessageHandler:self name:@"imgClick"];
    
    WKPreferences *preferences = [WKPreferences new];
    preferences.javaScriptCanOpenWindowsAutomatically = YES;
    preferences.minimumFontSize = 40.0;
    configuration.preferences = preferences;
    
    self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
    
    NSString *urlStr = [[NSBundle mainBundle] pathForResource:@"saner.html" ofType:nil];
    NSURL *fileURL = [NSURL fileURLWithPath:urlStr];
    [self.webView loadFileURL:fileURL allowingReadAccessToURL:fileURL];
    
    self.webView.UIDelegate = self;
    [self.view addSubview:self.webView];
    
}


- (void)initProgressView{
    
    CGFloat kScreenWidth = [[UIScreen mainScreen] bounds].size.width;
    UIProgressView *progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 2)];
    progressView.tintColor = [UIColor redColor];
    progressView.trackTintColor = [UIColor lightGrayColor];
    [self.view addSubview:progressView];
    self.progressView = progressView;
}


#pragma mark - KVO
// 計(jì)算wkWebView進(jìn)度條
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (object == self.webView && [keyPath isEqualToString:@"estimatedProgress"]) {
        CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
        if (newprogress == 1) {
            [self.progressView setProgress:1.0 animated:YES];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.7 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                self.progressView.hidden = YES;
                [self.progressView setProgress:0 animated:NO];
            });
            
        }else {
            self.progressView.hidden = NO;
            [self.progressView setProgress:newprogress animated:YES];
        }
    }
}

//當(dāng)把JS返回給控制器,然后彈窗就是這樣設(shè)計(jì)的
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
{
    NSLog(@"%@",message);
    completionHandler();
}

#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    //    message.body  --  Allowed types are NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull.
    if ([message.name isEqualToString:@"imgClick"]) {
        [self downImage:message.body[@"url"]];
    }
}

-(void)downImage:(NSString *)url{
    
    NSArray *images = @[url];
    [XLPhotoBrowser showPhotoBrowserWithImages:images currentImageIndex:0];
    
}

html




<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf8">
            <script language="javascript">
            
            function imgClick() {
                window.webkit.messageHandlers.imgClick.postMessage({title:'張健標(biāo)題',content:'張健內(nèi)容',url:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1520591158463&di=31dc24992c2a5f6385c69e0b901604bd&imgtype=0&src=http%3A%2F%2Fh.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F55e736d12f2eb938e41eb7d7d9628535e5dd6fa0.jpg'});
            }


                </script>
            </head>
    
    <body>
        <input type="button" value="掃一掃" onclick="imgClick()" />

    </body>
</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市躲惰,隨后出現(xiàn)的幾起案子氮块,更是在濱河造成了極大的恐慌滔蝉,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立肘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡融蹂,警方通過(guò)查閱死者的電腦和手機(jī)超燃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門约素,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圣猎,“玉大人送悔,你說(shuō)我怎么就攤上這事鳍怨⌒” “怎么了侦香?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵污朽,是天一觀的道長(zhǎng)矾睦。 經(jīng)常有香客問(wèn)我缓溅,道長(zhǎng)坛怪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任沉帮,我火速辦了婚禮,結(jié)果婚禮上其屏,老公的妹妹穿的比我還像新娘喇勋。我一直安慰自己,他們只是感情好偎行,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布川背。 她就那樣靜靜地躺著,像睡著了一般蛤袒。 火紅的嫁衣襯著肌膚如雪熄云。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天妙真,我揣著相機(jī)與錄音缴允,去河邊找鬼。 笑死珍德,一個(gè)胖子當(dāng)著我的面吹牛练般,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锈候,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼薄料,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泵琳?” 一聲冷哼從身側(cè)響起摄职,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤誊役,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谷市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體势木,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年歌懒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯壶。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡及皂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出且改,到底是詐尸還是另有隱情验烧,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布又跛,位于F島的核電站碍拆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慨蓝。R本人自食惡果不足惜感混,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礼烈。 院中可真熱鬧弧满,春花似錦、人聲如沸此熬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)犀忱。三九已至募谎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阴汇,已是汗流浹背数冬。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲫寄,地道東北人吉执。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像地来,于是被迫代替她去往敵國(guó)和親戳玫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)未斑、插件咕宿、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 前言 關(guān)于UIWebView的介紹,相信看過(guò)上文的小伙伴們,已經(jīng)大概清楚了吧府阀,如果有問(wèn)題缆镣,歡迎提問(wèn)。 本文是本系列...
    CoderLF閱讀 8,953評(píng)論 2 12
  • 前言 在前面的文章中钠糊,我們介紹了UIWebView、WKWebView一些使用壹哺,與JS的交互和一些坑抄伍,相信看過(guò)的小...
    Dark_Angel閱讀 13,710評(píng)論 42 188
  • 在之前寫的一篇《產(chǎn)品經(jīng)理第二節(jié)課截珍,干貨來(lái)了》中,我很認(rèn)真的將筆記整理出來(lái)箩朴,然后把95%左右的內(nèi)容都分享了出來(lái)岗喉,可是...
    Blackmax閱讀 412評(píng)論 6 8
  • 今天是平安夜沈堡,據(jù)說(shuō),平安夜的晚上要吃一個(gè)蘋果以保平安燕雁。我不知道一定要吃蘋果的原因是什么诞丽,或許只是單純的“平”字諧音...
    堅(jiān)持的考拉閱讀 252評(píng)論 0 0