淺談WKWebView

由于項(xiàng)目經(jīng)常性會(huì)使用到WKWebView极颓,于是在這里記錄下一下關(guān)于蘋(píng)果WKWebView的要點(diǎn)與遇到的問(wèn)題


基本配置

使用WKWebView之前需要先導(dǎo)入 #import <WebKit/WebKit.h>

//配置WKWebViewConfiguration
    注意加上WKScriptMessageHandler

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    //WKUserContentController 主要用于與JS交互
    config.userContentController = [[WKUserContentController alloc] init];
    [config.userContentController addScriptMessageHandler:self name:@"xxx"];

// 創(chuàng)建WKPreferences
        WKPreferences *preference = [[WKPreferences alloc]init];
        //最小字體大小 當(dāng)將javaScriptEnabled屬性設(shè)置為NO時(shí),可以看到明顯的效果
        preference.minimumFontSize = 0;
        //設(shè)置是否支持javaScript 默認(rèn)是支持的
        preference.javaScriptEnabled = YES;
        // 在iOS上默認(rèn)為NO涝缝,表示是否允許不經(jīng)過(guò)用戶(hù)交互由javaScript自動(dòng)打開(kāi)窗口
        preference.javaScriptCanOpenWindowsAutomatically = YES;
        config.preferences = preference;
  
//創(chuàng)建WKWebView
    注意寫(xiě)上WKUIDelegate,WKNavigationDelegate
    _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) configuration:config];
    //不顯示滾動(dòng)條
    _webView.scrollView.showsVerticalScrollIndicator = NO;
    _webView.scrollView.showsHorizontalScrollIndicator = NO;
    //設(shè)置代理
    _webView.navigationDelegate = self;
    _webView.UIDelegate = self;

核心代理方法

webview最主要是使用下面的方法與js進(jìn)行交互

JS端
<script>
let body = {
  method1 = "hello world"
}
window.webkit.messageHandlers.xxx.postMessage(body)
</script>
//其中xxx為JS與iOS雙方規(guī)定的相同字符串,body為傳入iOS端的參數(shù)

iOS端
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
  if ([message.name isEqualToString:@"xxx"]) {
      if [(message.body["method1"] isEqualToString:@"hello world"]) {
            //進(jìn)行邏輯處理
      }
  }
}

關(guān)于webView傳參給JS

WKWebView傳參給JS主要靠evaluateJavaScript方法,由于接觸JS比較少譬重,傳參也著實(shí)費(fèi)了一番功夫才弄明白

1.傳入String類(lèi)型

這個(gè)類(lèi)型是最簡(jiǎn)單的

[webView evaluateJavaScript:[NSString stringWithFormat:@"JSCallBack('%@')",str] completionHandler:^(id _Nullable object, NSError * _Nullable error) { }
];

2.傳入Array類(lèi)型

[webView evaluateJavaScript:[NSString stringWithFormat:@"JSCallBack(%@)",array] completionHandler:^(id _Nullable object, NSError * _Nullable error) { }
];

3.傳入Dictionary類(lèi)型

字典類(lèi)型的需要轉(zhuǎn)換為json字符串再傳拒逮,并且去掉空格跟換行符
    NSData *data1 = [NSJSONSerialization dataWithJSONObject:dic 
                  options:NSJSONWritingPrettyPrinted error:nil];
     NSString *jsonStr = [[NSString alloc] initWithData:data1 
                      encoding:NSUTF8StringEncoding];
    jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@" " withString:@""];
    jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    [webView evaluateJavaScript:[NSString stringWithFormat:@"JSCallBack('%@')",jsonStr] completionHandler:^(id _Nullable object, NSError * _Nullable error) {

   }];

關(guān)于使用Masonry時(shí)webview顯示不完全的問(wèn)題

有時(shí)候webview加載出來(lái)的頁(yè)面會(huì)跟預(yù)期的有偏差,比如位置變了臀规,大小變了滩援,這些時(shí)候只能在loadRequest之前使用Masonry,將webview約束好

    [_webView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.mas_equalTo(UIEdgeInsetsZero);
    }];

    [_webView loadRequest:request];

關(guān)于userAgent

有時(shí)候應(yīng)服務(wù)端要求塔嬉,需要給webView自定義userAgent玩徊,這里涉及到了html端與后端的獲取,正常獲取邏輯是這樣的

 [_webView evaluateJavaScript:"navigator.userAgent" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
 NSString *cusUserAgent = [NSString stringWithFormat:@"%@ %@",result,@"customMethod"];
_webView.customUserAgent = cusUserAgent;
  }];

這樣子看起來(lái)似乎沒(méi)什么問(wèn)題谨究,后端可以獲取的到恩袱,但是html端并不可以獲取到已經(jīng)修改后的userAgent,具體原因小生也找不出來(lái)胶哲。畔塔。。

解決辦法

我解決的辦法是鸯屿,創(chuàng)建兩個(gè)webView俩檬,利用其中一個(gè)獲取userAgent,另外一個(gè)在第一個(gè)獲取到的時(shí)候碾盟,使用第一個(gè)的UserAgent,利用第二個(gè)webview進(jìn)行之后的邏輯操作

    //注意技竟,這兩個(gè)webview都已經(jīng)初始化冰肴,網(wǎng)上有一些說(shuō)初始化之前調(diào)用,是不可以的。
    [_webView1 evaluateJavaScript:@"navigator.userAgent" completionHandler:
    ^(id _Nullable result, NSError * _Nullable error) {
        NSString *cusAgent = [result stringByAppendingString:@"customMethod"];
        _webView2.customUserAgent = cusAgent;
    }];

    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                  customAgent, @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    [[NSUserDefaults standardUserDefaults] synchronize];

其他

這里記錄一下一些可能會(huì)用到的方法

刪除緩存

- (void)deleteWebCache {
    //allWebsiteDataTypes清除所有緩存
    NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
    
    NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
    
    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
        
    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熙尉,一起剝皮案震驚了整個(gè)濱河市联逻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌检痰,老刑警劉巖包归,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铅歼,居然都是意外死亡公壤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)椎椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厦幅,“玉大人,你說(shuō)我怎么就攤上這事慨飘∪泛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瓤的,是天一觀(guān)的道長(zhǎng)休弃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)圈膏,這世上最難降的妖魔是什么塔猾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮本辐,結(jié)果婚禮上桥帆,老公的妹妹穿的比我還像新娘。我一直安慰自己慎皱,他們只是感情好老虫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茫多,像睡著了一般祈匙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上天揖,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天夺欲,我揣著相機(jī)與錄音,去河邊找鬼今膊。 笑死些阅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斑唬。 我是一名探鬼主播市埋,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黎泣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缤谎?” 一聲冷哼從身側(cè)響起抒倚,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坷澡,沒(méi)想到半個(gè)月后托呕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡频敛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年项郊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻政。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呆抑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汁展,到底是詐尸還是另有隱情鹊碍,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布食绿,位于F島的核電站侈咕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏器紧。R本人自食惡果不足惜耀销,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铲汪。 院中可真熱鬧熊尉,春花似錦、人聲如沸掌腰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)齿梁。三九已至催植,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勺择,已是汗流浹背创南。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留省核,地道東北人稿辙。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像气忠,于是被迫代替她去往敵國(guó)和親邻储。 傳聞我的和親對(duì)象是個(gè)殘疾皇子未桥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355