美文网首页
UIWebView更换WKWebView

UIWebView更换WKWebView

作者: Hyman_luo | 来源:发表于2020-04-20 14:40 被阅读0次

    一、加载方式

    1.-(void)loadRequest:(NSURLRequest *)request;

    可以请求本地文件也可以请求网络资源

    NSURL*fileURL = [[NSBundle mainBundle] URLForResource:@"test.html" withExtension:nil];

    //    fileURL= [NSURL URLWithString:@"https://www.baidu.com"];

        NSURLRequest *request = [NSURLRequest requestWithURL:fileURL];

        [self.webView loadRequest:request];

    2.-(void)loadHTMLString:(NSString *)htmlbaseURL:(NSURL *)url;

    只能用于加载本地HTML文件

    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"test.html" withExtension:nil];

        NSString *appHtml = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];

        [self.webView loadHTMLString:appHtmlbaseURL:fileURL];

    二、代理设置

    UIWebView代理设置

     webView.delegate = self;

    WKWebView代理设置

    self.webView.navigationDelegate = self;

    UIWebView与WKWebView相对应的代理

    UIWebViewDeletage 一共四个方法

    //刚开始加载网页,用于跳转的网页,也可不做任何跳转,也会用于对JS的交互

    UIWebView —webView:shouldStartLoadWithRequest:navigationType:

    WKWebView —webView:decidePolicyForNavigationAction:decisionHandler:

    //已经开始加载网页

    UIWebView —webViewDidStartLoad:

    WKWebView —webView:didStartProvisionalNavigation:

    //加载完成

    UIWebView —webViewDidFinishLoad:

    WKWebView —webView:didFinishNavigation:

    //加载失败

    UIWebView —webView:didFailLoadWithError:

    WKWebView — webView:didFailLoadWithError:

    三、替换中遇到的坑

    1.问题:ionic 1不能兼容WKWebView

      解决方法: 只能升级ionic了~~~

    2.问题:Xib里不能直接拖WKWebView替换UIWebView,要重写loadView方法

      解决方法:只是拖了一个UIView,再在代码中初始化WKWebView

    3.问题:WKWebView不支持scalesPageToFit属性

      解决方法:网上找的方法,在初始化时设置Configuration

    [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];

    - (WKWebViewConfiguration *)configurationForScalesPageToFit {

        NSString *jScript = @"var meta = document.createElement('meta');

    meta.setAttribute('name', 'viewport'); meta.setAttribute('content',

    'width=device-width');

    document.getElementsByTagName('head')[0].appendChild(meta);";

        WKUserScript*wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];

        WKUserContentController *wkUController = [[WKUserContentController alloc] init];

        [wkUController addUserScript:wkUScript];

        WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];

        wkWebConfig.userContentController= wkUController;

        returnwkWebConfig;

    }

    4. 问题:cookies问题,有些请求需要cookies,原来的UIWebView是系统自动设置的,WKWebView需要手动设置.

    解决方法: WKWebView手动设置cookies.

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

           //添加cookies;

           NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];

           request.allHTTPHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];

            [self.webView loadRequest:request];

    5.问题:stringByEvaluatingJavaScriptFromString方法在WKWebView不可用

      解决方法: 用evaluateJavaScript:completionHandler代替,与JS交互

    [self.pieWebView evaluateJavaScript:str completionHandler:nil];

    6.问题:与JS交互的桥WebViewJavascriptBridge不支持WKWebView

      解决方法:使用WKWebViewJavascriptBridge

    7.问题:webView中的图片显示不出来,原因是跨域的图片,html没有带cookie

    解决方法:拼接cookie,并且传入加载的html中通过

    - (WKWebViewConfiguration *)createWebViewConfiguration {

        WKUserContentController *userContrntController = [[WKUserContentController alloc] init];

        WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];

        configuration.userContentController= userContrntController;

        WKProcessPool*processpool = [[WKProcessPool alloc] init];

        configuration.processPool=processpool;

        //给html cookie值

        WKUserScript*cookieScript = [[WKUserScript alloc] initWithSource:[self cookieJavaScriptString] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];

        [userContrntController addUserScript:cookieScript];

        returnconfiguration;

    }

    //配置config,获取cookieString

    - (NSString *)cookieJavaScriptString {

        NSMutableString*cookieString = [[NSMutableString alloc] init];

        NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];

        for (NSHTTPCookie*cookie incookies) {

            NSString*excuteJSString = [NSString stringWithFormat:@"document.cookie='%@=%@';",cookie.name,cookie.value];

            [cookieString appendString:excuteJSString];

    }

        returncookieString;

    }

    相关文章

      网友评论

          本文标题:UIWebView更换WKWebView

          本文链接:https://www.haomeiwen.com/subject/kscdihtx.html