精华内容
下载资源
问答
  • 首先来看下UIWebView的做法: UIWebView *webView = [[UIWebViewalloc]initWithFrame:CGRectMake(0,0,WIDTH,0)]; webView.delegate =self; [self.viewaddSubview:webView]; [webView ...

    首先来看下UIWebView的做法:

    UIWebView *webView = [[UIWebViewalloc]initWithFrame:CGRectMake(0,0,WIDTH,0)];

    webView.delegate =self;

    [self.viewaddSubview:webView];

    [webView loadHTMLString:html/*html内容*/ baseURL:nil];


    -(void)webViewDidFinishLoad:(UIWebView*) webView {


        //获取页面高度,并重置webview的frame

        CGFloat documentHeight = [[webViewstringByEvaluatingJavaScriptFromString:@"document.getElementById(\"content\").offsetHeight;"]floatValue];

        CGRect frame = webView.frame;

        frame.size.height = documentHeight;

        webView.frame = frame;

    }




    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

        

        NSString* strRequest = request.URL.absoluteString;

        

        if([strRequestisEqualToString:@"about:blank"]) {//主页面加载内容

            returnYES;//允许跳转

        } else {//截获页面里面的链接点击

            //do something you want

            returnNO;//不允许跳转

        }

    }

    在来对应看下WKWebView:

    WKWebView   *wkWebview = [[WKWebView allocinitWithFrame:CGRectMake(00WIDTH0)];

    wkWebview.navigationDelegate self;

    [self.view wkWebview];

    [wkWebview loadHTMLString:html/*html内容*/ baseURL:nil];


    - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecifiedWKNavigation *)navigation {

        [webView evaluateJavaScript:@"document.getElementById(\"content\").offsetHeight;"completionHandler:^(id_Nullableresult,NSError *_Nullable error) {

    //获取页面高度,并重置webview的frame

            CGFloat documentHeight = [resultdoubleValue];

            CGRect frame = webView.frame;

            frame.size.height = documentHeight;

            webView.frame = frame;

        }];

    }




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

    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

        

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

        if([strRequestisEqualToString:@"about:blank"]) {//主页面加载内容

            decisionHandler(WKNavigationActionPolicyAllow);//允许跳转

        } else {//截获页面里面的链接点击

            //do something you want

    decisionHandler(WKNavigationActionPolicyCancel);//不允许跳转

        }

    }



    展开全文
  • 对于最近新发布的新组件...wkwebviewUIwebview之间的一些函数的对比uiwebview的函数: - (void)webViewDidStartLoad:(UIWebView *)webView;  //开始加载的时候执行该方法。 - (void)webViewDidFini

          对于最近新发布的新组件wkwebview,网上的资料不多,我自己摸索了一下,有了一些心得。wkwebview与UIwebview之间的一些函数的对比;

    uiwebview的函数:

    - (void)webViewDidStartLoad:(UIWebView *)webView;

                //开始加载的时候执行该方法。

    - (void)webViewDidFinishLoad:(UIWebView *)webView; 

               //加载完成的时候执行该方法。

    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

              //加载页面出错时

    而对于新组件wkwebview的这些函数则是:

    wkwebview的函数:

    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;

            //开始加载的时候执行该方法。

    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;

           //加载完成的时候执行该方法。

    - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error;

           //加载页面出错时



    我做了一个比较,一个是用uiwebview做的简单浏览器,一个是用wkwebview做的简单浏览器

    具体的需要用XCODE进行编译,理解;这是链接:http://pan.baidu.com/s/1c0q4Sl6

    展开全文
  • WKWebView替换UIWebView

    2017-08-16 19:17:03
    先使用WKWebView基本方法写个例子,加载baidu页面,写法跟UIWebView类似- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. WKWebViewConfigu

    1.引入头文件

    #import <WebKit/WebKit.h>

    2.先使用WKWebView基本方法写个例子,加载baidu页面,写法跟UIWebView类似

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    
        _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.width, self.view.height) configuration:config];
        [self.view addSubview:_webView];
    
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];
        [_webView loadRequest:request];
    }

    用同样的方法,用UIWebView也写了一个页面做对比,发现差距好大,WKWebView内存是**25**M,而UIWebView是**98**M。之前没发现UIWebView内存会占如何之大,WKWebView看来很值!!!

    3.监听加载的进度,因为没有“加载进度”相关的delegate回调

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.webView addObserver:self
                       forKeyPath:@"loading"
                          options:NSKeyValueObservingOptionNew
                          context:nil];
        [self.webView addObserver:self
                       forKeyPath:@"title"
                          options:NSKeyValueObservingOptionNew
                          context:nil];
        [self.webView addObserver:self
                       forKeyPath:@"estimatedProgress"
                          options:NSKeyValueObservingOptionNew
                          context:nil];
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
        if ([keyPath isEqualToString:@"loading"]) {
            NSLog(@"loading--%d", _webView.loading);
        } else if ([keyPath isEqualToString:@"title"]) {
            NSLog(@"title--%@", _webView.title);
        } else if ([keyPath isEqualToString:@"estimatedProgress"]) {
            NSLog(@"progress--%lf", _webView.estimatedProgress);
        }
    }
    
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        [_webView removeObserver:self forKeyPath:@"loading"];
        [_webView removeObserver:self forKeyPath:@"title"];
        [_webView removeObserver:self forKeyPath:@"estimatedProgress"];
    }

    记得最后移除KVO

    日志如下:

    2017-08-16 16:35:33.833 TestSSSSS[22084:917889] progress--0.300000
    2017-08-16 16:35:33.845 TestSSSSS[22084:917889] title--百度一下
    2017-08-16 16:35:34.165 TestSSSSS[22084:917889] progress--0.409694
    2017-08-16 16:35:34.454 TestSSSSS[22084:917889] progress--0.845262
    2017-08-16 16:35:34.472 TestSSSSS[22084:917889] progress--1.000000
    2017-08-16 16:35:34.473 TestSSSSS[22084:917889] loading--0

    在加载结束前取得title,最后结束时progress为1,loading为NO

    4.为了方便测试,我自己写了一个html文件,页面上有个按钮,然后点击按钮弹出alert,代码如下

    <html>
    <head>
    <script>
    function postMsg() {
        alert("hehe");
    }
    </script>
    </head>
    <body>
    
    <input type='button' value='method1' onclick='postMsg()'/>
    </body>
    </html>

    但是奇怪的是alert怎么也弹不出来,听说WKWebView坑很多,要慎入,现在终于碰到第一个了,
    解决方法如下:
    - 1.实现两个代理

    _webView.UIDelegate = self;
    _webView.navigationDelegate = self;
    • 2.具体实现三个方法
    - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
        [alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            completionHandler();
        }])];
        [self presentViewController:alertController animated:YES completion:nil];
    
    }
    
    - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
        //    DLOG(@"msg = %@ frmae = %@",message,frame);
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
        [alertController addAction:([UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            completionHandler(NO);
        }])];
        [alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            completionHandler(YES);
        }])];
        [self presentViewController:alertController animated:YES completion:nil];
    }
    - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];
        [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
            textField.text = defaultText;
        }];
        [alertController addAction:([UIAlertAction actionWithTitle:@"完成" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            completionHandler(alertController.textFields[0].text?:@"");
        }])];
    
        [self presentViewController:alertController animated:YES completion:nil];
    }

    5.OC与JS交互 重点哦!

    • js里调用方法

      window.webkit.messageHandlers.message.postMessage("hahahaha");
    • oc使用方法, config里的userContentController专门处理js的调用

      WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
      config.userContentController = [[WKUserContentController alloc] init];
      [config.userContentController addScriptMessageHandler:self name:@"message"];
    • 接收js事件用法

      - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
      if ([message.name isEqualToString:@"message"]) {
          NSLog(@"body--%@", message.body);
          //处理js事件...
      }
      }

      这种写法完美的实现了js与oc的无缝连接,有点类似于服务器用的redis, 通过webKit的消息进行传递。

    6.WKWebView加载过程代理方法:

    
     #pragma mark WKNavigationDelegate
    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
        NSLog(@"start");
    }
    
    - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
        NSLog(@"commit");
    }
    
    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
        NSLog(@"finish");
    }
    
    - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
        NSLog(@"fail");
    }

    7.页面跳转代理方法, 可用于拦截URL

    // 接收到服务器跳转请求之后调用
    - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
        NSLog(@"recieve erdirect");
    }
    
    // 在收到响应后,决定是否跳转
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
        decisionHandler(WKNavigationResponsePolicyAllow);
    }
    // 在发送请求之前,决定是否跳转
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    展开全文
  • WKWebViewUIWebView

    2017-04-07 15:37:00
    applegoogle为webkit该浏览器引擎的发扬光大做出了重要贡献,在WWDC 2014发布会上发布iOS8中,apple公布了WebKit...webkit使用WKWebView来代替IOS的UIWebView和OSX的WebView,并且使用Nitro JavaScript引擎,这意...

    apple和google为webkit该浏览器引擎的发扬光大做出了重要贡献,在WWDC 2014发布会上发布iOS 8中,apple公布了WebKit框架,这意味着OSX和IOS开发者将共用同样的开发库,新改变可以提高开发者编写的代码的重复使用性。
    webkit使用WKWebView来代替IOS的UIWebView和OSX的WebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safari一样快。
    第一、WKWebView增加的属性和方法
    类比UIWebView,跟UIWebView的API对比,
    增加的属性:
    1、estimatedProgress 加载进度条,在IOS8之前我们是通过一个假的进度条来实现
    2、backForwardList 表示historyList
    3、WKWebViewConfiguration *configuration; 初始化webview的配置
    增加的方法:
    1、- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration 
    初始化
    3、(WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item; 
    跳到历史的某个页面
    第二、相同的属性和方法
    goBack、goForward、canGoBack、canGoForward、stopLoading、loadRequest、scrollView
    第三、被删去的属性和方法:
    1、- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    在跟js交互时,我们使用这个API,目前WKWebView完档没有给出实现类似功能的API
    2、无法设置缓存
    在UIWebView,使用NSURLCache缓存,通过setSharedURLCache可以设置成我们自己的缓存,但WKWebView不支持NSURLCache
    第四、delegate方法的不同

    UIWebView支持的代理是UIWebViewDelegate,WKWebView支持的代理是WKNavigationDelegate和WKUIDelegate
    WKNavigationDelegate主要实现了涉及到导航跳转方面的回调方法
    WKUIDelegate主要实现了涉及到界面显示的回调方法:如WKWebView的改变和js相关内容
    具体来说WKNavigationDelegate除了有开始加载、加载成功、加载失败的API外,还具有额外的三个代理方法:
    1、- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation
    这个代理是服务器redirect时调用
    2、- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
    这个代理方法表示当客户端收到服务器的响应头,根据response相关信息,可以决定这次跳转是否可以继续进行。
    3.- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
    根据webView、navigationAction相关信息决定这次跳转是否可以继续进行,这些信息包含HTTP发送请求,如头部包含User-Agent,Accept

     

     转自:http://blog.csdn.net/richard_rufeng/article/details/36876817

     

    转载于:https://www.cnblogs.com/GJ-ios/p/6678394.html

    展开全文
  • WKWebView相对UIWebView的优劣势

    千次阅读 2018-06-01 10:43:54
    在开发过程中,iOS 中实现加载 web 页面主要有两种控件,UIWebView WKWebview,两种控件对应具体的实现方法不同。WKWebView 是苹果在iOS 8中引入的新组件,目的是提供一个现代的支持最新Webkit功能的网页浏览控件...
  • 在app的内容页(详情页)中,富文本的显示一直是经常需要处理的问题,而通常在后端的富文本编辑中,Html...以下对这3种方式进行内存的测试对比,毕竟详情页是相对比较大,而且打开频率高的页面,所以内存占用是必...
  • 一、整体介绍UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView。通过简单的测试即可发现UIWebView占用过多内存,且内存峰值更是夸张。WKWebView网页加载速度也有提升,但是并...
  • 在app的内容页(详情页)中,富文本的显示一直是经常需要处理的问题,而通常在...以下对这3种方式进行内存的测试对比,毕竟详情页是相对比较大,而且打开频率高的页面,所以内存占用是必须要考虑的问题。基本环境:...
  • http://www.skyfox.org/ios-wkwebview-cookie-opration.html 经典  1》cookie的使用场景-场景描述 我们以实际例子驱动的方式来开始这个话题。 实际例子描述:在App里内嵌一个UIWebView,通过UIWebView打开...
  • 但是我做了一个PPT,更方便详细的介绍了两者的用法区别,并在调试中遇到的问题,详细请下载demo文件,内含PPT、demo源码二、调研笔记:调研UIWebview和WKWebview异同点 1、UIWebview+Javasc
  • 1.UIWebView和WKWebView UIWebView 1)UIWebView是iOS2就有了的,占用内存也比较多,内存峰值也挺夸张的 2)UIWebView继承自UIView 是用来加载网页的类,可以简单理解成就是一个view WKWebView 1)相比UIWebView的话,...
  • WKWebView的使用各种坑的解决方法(OC+Swift) WKWebView 的使用
  • UIWebViewWKWebView

    2017-07-07 14:50:20
    WKWebView 是 iOS 8 引入的一个 WebKit API,替换 iOS 的 UIWebView OSX 的 WebView,WKWebView 使用 Nitro JavaScript 引擎,运行 JavaScript Safari 一样快。WKWebView UIWebView 使用上有很多区别,这篇...
  • WKWebView的简单使用(添加请求头)

    万次阅读 2017-09-13 14:40:36
    之前公司项目不怎么使用到H5,即使...这次开发项目整整一个功能都要用H5的我就实用WKWebView和UIWebView对比了一下。以下是WKWebView 实用过程中遇到的问题。 首先图片对比UIWebView和WKWebView的内存对比 (显而易见)
  • 这里分别用WKWebview 和UIWebview加载了一个百度的网页,内存的占用情况如下 WKWebview UIWebview 相比之下,WKWebView占用20M,而UIWebView占用73M,这性能提升的不只一点点。具体的要了解使用 ...
  • wkwebview是苹果公司推出的替代uiwebview的方案,它在内存占用稳定性方面有很大的优势,性能对比此篇文章就不讲了。 但是就目前情况而言,uiwebview还有有一些不能被完全替代的原因,比如wkwebview无法用...
  • iOS WKWebView使用方法

    2018-10-16 18:15:21
    iOS WKWebView使用方法WKWebViewUIWebView对比有哪些优点WKNavigationDelegate调用的顺序 WKWebViewUIWebView对比有哪些优点 WKWebView从iOS8才有,通过简单的测试即可发现UIWebView占用过多内存,且内存峰值更...
  • 一、整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView。通过简单的测试即可发现UIWebView占用过多内存,且
  • 引擎中包含的UIWebView不能直接用WKWebView替换,因为涉及调用的地方很多,在触控官方论坛网站上找到了修改前后的对比https://github.com/cocos2d/cocos2d-x/pull/20098/files,官方论坛也提供了一些版本的升级方式...
  • 本文是本系列文章的第二篇,主要为小伙伴们分享下WKWebView相关的内容:iOS中UIWebViewWKWebView、JavaScript与OC交互、Cookie管理看我就够(上)iOS中UIWebViewWKWebView、JavaScript与OC交互、Cookie管理看我...
  • UIWebView替换WKWebView看这篇就够了

    千次阅读 2020-05-19 09:29:15
    调研UIWebView和WKWebView的异同 一、UIWebView 介绍 1.UIWebView网页加载展现的几种方法 // 使用 NSURLRequest 的方式加载网页 (url可以是远程也可以是本地) - (void)loadRequest:(NSURLRequest *)request; /*! ...
  • Native开发原生应用是手机操作系统厂商(目前主要是苹果的iOSgoogle的Android)对外界提供的标准化的开发模式,他们对于native开发提供了一套标准化实现优化方案。但是他们存在一些硬伤,比如App的发版周期偏长...
  • WKWebView 的优势不必多说,这里将两者与 JS 的交互分别做对比. 首先,前端以及安卓同学定义好一样的方法: js 调用原生: jsCallNativeDoSomethingWithParams() 原生调用js: nativeCallJSSendParams() ...
  • UIWebViewWKWebView 支持 WebP 图片显示

    千次阅读 2019-05-08 16:16:53
    WebP 作为一种更高效的图片编码格式,平均大小比 PNG/JPG/ GIF / 动态 GIF 格式减少 70%(对比测试页面),且质量没有明显的差别,是其他图片格式极佳的替代者。 一、MagicWebViewWebP.framework 架构 主要文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 411
精华内容 164
关键字:

wkwebview和uiwebview对比