简单介绍WKWebview

WKWebView相对于UIWebView强大了很多,内存的消耗相对少了,所提供的接口也丰富了。

现在谈一谈WKWebView的基本使用

1. navigationDelegate

[objc]view plaincopyprint?

- (void)webView:(WKWebView*)webViewdidStartProvisionalNavigation:(WKNavigation*)navigation {// 类似UIWebView的 -webViewDidStartLoad:

NSLog(@"didStartProvisionalNavigation");

[UIApplicationsharedApplication].networkActivityIndicatorVisible=YES;

}

- (void)webView:(WKWebView*)webViewdidCommitNavigation:(WKNavigation*)navigation {

NSLog(@"didCommitNavigation");

}

- (void)webView:(WKWebView*)webViewdidFinishNavigation:(WKNavigation*)navigation {// 类似 UIWebView 的 -webViewDidFinishLoad:

NSLog(@"didFinishNavigation");

[selfresetControl];

if(webView.title.length>0) {

self.title= webView.title;

}

}

- (void)webView:(WKWebView*)webViewdidFailProvisionalNavigation:(WKNavigation*)navigationwithError:(NSError*)error {

// 类似 UIWebView 的- webView:didFailLoadWithError:

NSLog(@"didFailProvisionalNavigation");

}

- (void)webView:(WKWebView*)webViewdecidePolicyForNavigationResponse:(WKNavigationResponse*)navigationResponsedecisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler {

decisionHandler(WKNavigationResponsePolicyAllow);

}

- (void)webView:(WKWebView*)webViewdecidePolicyForNavigationAction:(WKNavigationAction*)navigationActiondecisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler {

// 类似 UIWebView 的 -webView: shouldStartLoadWithRequest: navigationType:

NSLog(@"4.%@",navigationAction.request);

NSString*url = [navigationAction.request.URL.absoluteStringstringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

decisionHandler(WKNavigationActionPolicyAllow);

}

- (void)webView:(WKWebView*)webViewdidReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challengecompletionHandler:(void(^)(NSURLSessionAuthChallengeDisposition,NSURLCredential*))completionHandler {

}

2 UIDelegate

[objc]view plaincopyprint?

- (WKWebView*)webView:(WKWebView*)webViewcreateWebViewWithConfiguration:(WKWebViewConfiguration*)configurationforNavigationAction:(WKNavigationAction*)navigationActionwindowFeatures:(WKWindowFeatures*)windowFeatures {

// 接口的作用是打开新窗口委托

[selfcreateNewWebViewWithURL:webView.URL.absoluteStringconfig:configuration];

returncurrentSubView.webView;

}

- (void)webView:(WKWebView*)webViewrunJavaScriptAlertPanelWithMessage:(NSString*)messageinitiatedByFrame:(WKFrameInfo*)framecompletionHandler:(void(^)())completionHandler

{// js 里面的alert实现,如果不实现,网页的alert函数无效

UIAlertController*alertController = [UIAlertControlleralertControllerWithTitle:message

message:nil

preferredStyle:UIAlertControllerStyleAlert];

[alertControlleraddAction:[UIAlertActionactionWithTitle:@"确定"

style:UIAlertActionStyleCancel

handler:^(UIAlertAction*action) {

completionHandler();

}]];

[selfpresentViewController:alertControlleranimated:YEScompletion:^{}];

}

- (void)webView:(WKWebView*)webViewrunJavaScriptConfirmPanelWithMessage:(NSString*)messageinitiatedByFrame:(WKFrameInfo*)framecompletionHandler:(void(^)(BOOL))completionHandler {

//  js 里面的alert实现,如果不实现,网页的alert函数无效  ,

UIAlertController*alertController = [UIAlertControlleralertControllerWithTitle:message

message:nil

preferredStyle:UIAlertControllerStyleAlert];

[alertControlleraddAction:[UIAlertActionactionWithTitle:@"确定"

style:UIAlertActionStyleDefault

handler:^(UIAlertAction*action) {

completionHandler(YES);

}]];

[alertControlleraddAction:[UIAlertActionactionWithTitle:@"取消"

style:UIAlertActionStyleCancel

handler:^(UIAlertAction*action){

completionHandler(NO);

}]];

[selfpresentViewController:alertControlleranimated:YEScompletion:^{}];

}

- (void)webView:(WKWebView*)webViewrunJavaScriptTextInputPanelWithPrompt:(NSString*)promptdefaultText:(NSString*)defaultTextinitiatedByFrame:(WKFrameInfo*)framecompletionHandler:(void(^)(NSString*))completionHandler {

completionHandler(@"Client Not handler");

}

3. WKWebView 执行脚本方法

[objc]view plaincopyprint?

- (void)evaluateJavaScript:(NSString*)javaScriptStringcompletionHandler:(void(^)(id,NSError*))completionHandler;

[objc]view plaincopyprint?

completionHandler 拥有两个参数,一个是返回错误,一个可以返回执行脚本后的返回值

4. WKWebView 的Cookie问题

UIWebView 中会自动保存Cookie,如果登录了一次,下次再次进入的时候,会记住登录状态

而在WKWebView中,并不会这样,WKWebView在初始化的时候有一个方法

[objc]view plaincopyprint?

- (instancetype)initWithFrame:(CGRect)frameconfiguration:(WKWebViewConfiguration*)configuration

通过这个方法,设置 configuration 让WKWebView知道登录状态,configuration 可以通过已有的Cookie进行设置,也可以通过保存上一次的configuration进行设置

参考 stackoverflow上回答:http://stackoverflow.com/questions/26573137/can-i-set-the-cookies-to-be-used-by-a-wkwebview/26577303#26577303

[objc]view plaincopyprint?

WKWebView* webView =/*set up your webView*/

NSMutableURLRequest* request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:@"http://example.com/index.html"]];

[requestaddValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;"forHTTPHeaderField:@"Cookie"];

// use stringWithFormat: in the above line to inject your values programmatically

[webViewloadRequest:request];

[objc]view plaincopyprint?

WKUserContentController* userContentController = WKUserContentController.new;

WKUserScript* cookieScript = [[WKUserScriptalloc]

initWithSource:@"document.cookie = 'TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';"

injectionTime:WKUserScriptInjectionTimeAtDocumentStartforMainFrameOnly:NO];

// again, use stringWithFormat: in the above line to inject your values programmatically

[userContentControlleraddUserScript:cookieScript];

WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;

webViewConfig.userContentController= userContentController;

WKWebView* webView = [[WKWebViewalloc]initWithFrame:CGRectMake(/*set your values*/)configuration:webViewConfig];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341

推荐阅读更多精彩内容

  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    CoderLF阅读 8,940评论 2 12
  • 前言: web页面和app的直接的交互是很常见的东西,在ios8之前,用的是uiwebview,但是在ios8之后...
    qingchen91阅读 2,943评论 6 25
  • 公司开始让做一个新iOS项目,由于苹果的更新需要每次发版本审核,没法像服务器一样实时更新,技术部就讨论出原生+HT...
    奶茶007阅读 1,770评论 16 9
  • WkWebView是IOS8中引入的新组件,苹果将UIWebViewDelegate 与 UIWebView 重构...
    陈宏伟阅读 2,923评论 1 12
  • 1、加载网页 WKWebView *webView = [[WKWebView alloc] initWithFr...
    LearningCoding阅读 3,089评论 0 2