WKWebView 的使用简介
1. navigationDelegate
- - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { // 类似UIWebView的 -webViewDidStartLoad:
- NSLog(@"didStartProvisionalNavigation");
- [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
- }
- - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
- NSLog(@"didCommitNavigation");
- }
- - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { // 类似 UIWebView 的 -webViewDidFinishLoad:
- NSLog(@"didFinishNavigation");
- [self resetControl];
- if (webView.title.length > 0) {
- self.title = webView.title;
- }
- }
- - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
- // 类似 UIWebView 的- webView:didFailLoadWithError:
- NSLog(@"didFailProvisionalNavigation");
- }
- - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
- decisionHandler(WKNavigationResponsePolicyAllow);
- }
- - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
- // 类似 UIWebView 的 -webView: shouldStartLoadWithRequest: navigationType:
- NSLog(@"4.%@",navigationAction.request);
- NSString *url = [navigationAction.request.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- decisionHandler(WKNavigationActionPolicyAllow);
- }
- - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler {
- }
2 UIDelegate
- - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
- // 接口的作用是打开新窗口委托
- [self createNewWebViewWithURL:webView.URL.absoluteString config:configuration];
- return currentSubView.webView;
- }
- - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler
- { // js 里面的alert实现,如果不实现,网页的alert函数无效
- UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message
- message:nil
- preferredStyle:UIAlertControllerStyleAlert];
- [alertController addAction:[UIAlertAction actionWithTitle:@"确定"
- style:UIAlertActionStyleCancel
- handler:^(UIAlertAction *action) {
- completionHandler();
- }]];
- [self presentViewController:alertController animated:YES completion:^{}];
- }
- - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
- // js 里面的alert实现,如果不实现,网页的alert函数无效 ,
- UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message
- message:nil
- preferredStyle:UIAlertControllerStyleAlert];
- [alertController addAction:[UIAlertAction actionWithTitle:@"确定"
- style:UIAlertActionStyleDefault
- handler:^(UIAlertAction *action) {
- completionHandler(YES);
- }]];
- [alertController addAction:[UIAlertAction actionWithTitle:@"取消"
- style:UIAlertActionStyleCancel
- handler:^(UIAlertAction *action){
- completionHandler(NO);
- }]];
- [self presentViewController:alertController animated:YES completion:^{}];
- }
- - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler {
- completionHandler(@"Client Not handler");
- }
3. WKWebView 执行脚本方法
- - (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler;
- completionHandler 拥有两个参数,一个是返回错误,一个可以返回执行脚本后的返回值
4. WKWebView 的Cookie问题
UIWebView 中会自动保存Cookie,如果登录了一次,下次再次进入的时候,会记住登录状态
而在WKWebView中,并不会这样,WKWebView在初始化的时候有一个方法
- - (instancetype)initWithFrame:(CGRect)frame configuration:(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
- WKWebView * webView = /*set up your webView*/
- NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/index.html"]];
- [request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"];
- // use stringWithFormat: in the above line to inject your values programmatically
- [webView loadRequest:request];
print?
- WKUserContentController* userContentController = WKUserContentController.new;
- WKUserScript * cookieScript = [[WKUserScript alloc]
- initWithSource: @"document.cookie = 'TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';"
- injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
- // again, use stringWithFormat: in the above line to inject your values programmatically
- [userContentController addUserScript:cookieScript];
- WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;
- webViewConfig.userContentController = userContentController;
- WKWebView * webView = [[WKWebView alloc] initWithFrame:CGRectMake(/*set your values*/) configuration:webViewConfig];
WKWebView 的使用简介相关推荐
- iOS 端容器之 WKWebView 那些事
简介: 本文主要是关于在端容器设计开发过程中,WKWebView 使用上遇到的一些问题和解决办法. 作者 | 驽良 来源 | 阿里技术公众号 一 背景 熟悉 iOS\macOS Hybrid 混合开 ...
- iOS WKWebView的使用以及遇到的问题
iOS WKWebView的使用以及遇到的问题 一.WKWebView简介 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebVi ...
- 微信小程序开发教程||微信小程序 小程序简介||微信小程序 开始||微信小程序 小程序代码构成
微信小程序 小程序简介 小程序简介 小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序技术发展史 小程序并非凭空冒出来的一个概念.当微信中的 ...
- 小程序学习 - 01小程序简介+微信小程序基础
小程序简介 小程序是一个全新的.轻量级的移动端应用. 起源 在小程序出现之前的移动端开发的解决方案有: Android iOS Windows Phone - 后来退出历史舞台 移动端开发发展了一段时 ...
- Hybrid技术简介
Hybrid技术简介 H5+原生混合开发 混合开发技术点 总结 H5+原生混合开发 这类框架主要原理就是将APP的一部分需要动态变动的内容通过H5来实现,通过原生的网页加载控件WebView (And ...
- etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理
1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...
- Docker学习(一)-----Docker简介与安装
一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- TensorRT简介
TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...
最新文章
- android adb root方法
- 找找 Spring Event 源码中各种设计模式的使用
- malloc的内存分配原理
- span标签style的优先级_css样式引入优先级?
- grep命令---Linux学习笔记
- java 实现excel 导出功能
- 微软学术搜索项目 10个版本的历程
- 计算机水平考试改革,浅析全国计算机等级考试改革及应对策略
- LeetCode#70 Climbing Stairs
- sql设为简单模式sql_SQL模式演练
- python慢的原因_为什么 Python 这么慢?
- apk一键脱壳工具_一键新机!强大的抹机王来了!
- Java计算两点间的距离
- PHP连接数据库——身份验证问题
- 直播app开发公司手把手搭建一套简单的直播系统
- Little_Women2.txt
- 荣耀v40pro+参数配置 荣耀v40pro+价格
- matlab中unifrnd函数用法,概率和统计的MATLAB指令
- github(desktop)使用教程(三) 【保姆级】{desktop tutorial repository,创建分支,编辑文件,保存修改,commit,publish to github}
- 单片机如何发出类似和弦的声音
热门文章
- C++11中= delete;的使用
- Google Protocol Buffers介绍
- cs架构嵌入bs_CS与BS架构区别、比较、及现状与趋势分析
- js 等待某个函数执行完_JS 函数的执行时机
- integer比较_傻傻分不清?Integer、new Integer() 和 int 的面试题
- 16 导出pcb各网络的布线长度_设计PCB流程
- 职校中的计算机学的是什么,职校计算机专业主要学什么课
- Java项目:前台预定+后台管理酒店管理系统(java+SSM+jsp+mysql+maven)
- 云职教课堂计算机文化基础,2020智慧职教云课堂计算机文化基础答案最新最全单元测试答案...
- python缩进在程序中长度统一且强制使用_Python习题纠错1