WKWebView做OC與JS交互

在apple API reference中指出在運(yùn)行iOS 8之后的程序時(shí)纺且,使用WKWebView而不是UIWebView添坊。
WebKit框架概覽(Mindnote):

創(chuàng)建

WebKit (WKWebView):
see it in WKWebView API Reference

WKWebView * WK;
WKWebViewConfiguration * config = [[WKWebViewConfiguration alloc]init];
WK = [[WKWebView alloc]initWithFrame:[UIScreen mainScreen].bounds configuration:config];
[WK loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
使用WKWebViewConfiguration來(lái)進(jìn)行配置:

// 1. 設(shè)置線程池
WKProcessPool *pool = [[WKProcessPool alloc]init];
config.processPool = pool;
// WKProcessPool類中沒有暴露任何屬性和方法屉符,配置為同一個(gè)進(jìn)程池的WebView會(huì)共享數(shù)據(jù),例如Cookie、用戶憑證等偿乖,開發(fā)者可以通過(guò)編寫管理類來(lái)分配不同維度的WebView在不同進(jìn)程池中。

// 2. 進(jìn)行偏好設(shè)置
WKPreferences * preference = [[WKPreferences alloc]init];
//最小字體大小 當(dāng)將javaScriptEnabled屬性設(shè)置為NO時(shí)哲嘲,可以看到明顯的效果
preference.minimumFontSize = 0;
//設(shè)置是否支持javaScript 默認(rèn)是支持的
preference.javaScriptEnabled = YES;
//設(shè)置是否允許不經(jīng)過(guò)用戶交互由javaScript自動(dòng)打開窗口
preference.javaScriptCanOpenWindowsAutomatically = YES;
config.preferences = preference;

// 3. **設(shè)置內(nèi)容交互控制器 用于處理JavaScript與native交互**
WKUserContentController * userController = [[WKUserContentController alloc]init];
//設(shè)置處理代理并且注冊(cè)要被JS調(diào)用的方法名稱
[userController addScriptMessageHandler:self name:@"name"];
//JS注入贪薪,注入一個(gè)測(cè)試方法。
NSString *javaScriptSource = @"function userFunc(){window.webkit.messageHandlers.name.postMessage( {/"name/":/"HS/"})}";
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:javaScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];// forMainFrameOnly:NO(全局窗口)眠副,yes(只限主窗口)
[userController addUserScript:userScript];
config.userContentController = userController;
OC和JS交互example
1. 執(zhí)行html 已經(jīng)存在的JS方法
- (IBAction)exeFuncTouched:(id)sender {
    [self.myWebView evaluateJavaScript:@"showAlert('hahahha')"  completionHandler:^(id item, NSError * _Nullable error) {
        
    }];
}
2. JS調(diào)用OC
 function callOC(func,param){
        var url= "func=" + func;
        for(var i in param)
        {
         url = url + "&" + i + "=" + param[i];
        }
        window.webkit.messageHandlers.Native.postMessage(url);
 }
// JavaScript調(diào)用
<input type="button" value="打個(gè)招呼" onclick="callOC('alert',{'message':'你好么'})" />

Objective-C實(shí)現(xiàn)(WKUserContentController對(duì)象提供的JavaScript來(lái)發(fā)布消息和注入用戶腳本網(wǎng)頁(yè)視圖方式)

// 通過(guò)
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = [[WKUserContentController alloc] init];
// 注入JS對(duì)象Native画切,
// 聲明WKScriptMessageHandler 協(xié)議
[config.userContentController addScriptMessageHandler:self name:@"Native"];
 
self.myWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
self.myWebView.UIDelegate = self;
[self.view addSubview:self.myWebView]

#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController
      didReceiveScriptMessage:(WKScriptMessage *)message {
    if ([message.name isEqualToString:@"Native"]) {
        NSLog(@"message.body:%@", message.body);
        //如果是自己定義的協(xié)議, 再截取協(xié)議中的方法和參數(shù), 判斷無(wú)誤后在這里手動(dòng)調(diào)用oc方法
        NSMutableDictionary *param = [self queryStringToDictionary:message.body];
        NSLog(@"get param:%@",[param description]);
        
        NSString *func = [param objectForKey:@"func"];
        
        //調(diào)用本地函數(shù)
        if([func isEqualToString:@"alert"])
        {
            [self showMessage:@"來(lái)自網(wǎng)頁(yè)的提示" message:[param objectForKey:@"message"]];
        }
     
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市囱怕,隨后出現(xiàn)的幾起案子霍弹,更是在濱河造成了極大的恐慌毫别,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件典格,死亡現(xiàn)場(chǎng)離奇詭異岛宦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耍缴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門砾肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人防嗡,你說(shuō)我怎么就攤上這事变汪。” “怎么了蚁趁?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵裙盾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我他嫡,道長(zhǎng)番官,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任涮瞻,我火速辦了婚禮鲤拿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘署咽。我一直安慰自己近顷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布宁否。 她就那樣靜靜地躺著窒升,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慕匠。 梳的紋絲不亂的頭發(fā)上饱须,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音台谊,去河邊找鬼蓉媳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锅铅,可吹牛的內(nèi)容都是我干的酪呻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼盐须,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼玩荠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阶冈,失蹤者是張志新(化名)和其女友劉穎闷尿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體女坑,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡填具,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堂飞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灌旧。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绰筛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情描融,我是刑警寧澤铝噩,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站窿克,受9級(jí)特大地震影響骏庸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜年叮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一具被、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧只损,春花似錦一姿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至爆存,卻和暖如春蛉顽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背先较。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工携冤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闲勺。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓曾棕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親霉翔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睁蕾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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