38- WKWebView(二) - native和WebVie

作者: 春田花花幼儿园 | 来源:发表于2018-04-22 01:23 被阅读73次

    native和WebView交互主要是三种:
    1.拦截webView发的出请求
    2.native向网页注入脚本
    3.native直接调用JS

    拦截webView发的出请求

    拦截请求就不说了。

    native向网页注入脚本

    2014WWDC-native和web交互的两种方式
    从WWDC课件上可以看到,在WKWebView中,我们有User ScriptScript Messages两种方对网页内容进行控制。使用这两种方式进行操作的话,都会使用到WKUserContentController这个类。

    User Script

    User Script的意思是被网页接受的用户脚本。也就是你写到网页脚本是有效的。
    它可以用来:

    • 更新document
    • 监听js事件
    • 加载资源
    • 与你的程序进行沟通

    在WKWebView提供的方法中,你可以设置用户脚本执行的时机是在Html中document开始时候还是结束的时候。 也可以设置用户脚本运行的有效位置是在所有的frame中还是只在主frame中。具体设置方法和枚举如下:

    - (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
    

    举例:
    比如我在webView中弹出一个提示框,内容是document.cookie中的Cookies,代码如下:

       WKUserScript *alertCookieScript = [[WKUserScript alloc] initWithSource:@"alert(document.cookie);" injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
            [contentController addUserScript:alertCookieScript];
            webConfiguration.userContentController = contentController;
    

    Script Messages

    当我们向网页注入用户脚本,除了单向的让webView做一些东西,还会希望反向获得用户脚本执行的结果活着HTML中元素的值,这个时候就需要用到Script Messages了。WebKit提供了一个WKScriptMessageHandler,通过注册监听的方式接收回调。

    通过WKScriptMessageHandler,我们可以:

    • 网页可以发送任意的message
    • 网页和应用交互
    • 处理无效的请求

    举例:
    获取储存在document.cookie中的Cookies。分为三步。
    首先,先想网页中注册用户脚本,作用是当document.cookie中有Cookies的时候,就主动发送消息,这里我们用到User Script:

    WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource:@"window.webkit.messageHandlers.currentCookies.postMessage(document.cookie);"" injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];       
    [contentController addUserScript:cookieScript];
     webConfiguration.userContentController = contentController;
    

    然后,注册WKScriptMessageHandler:

    // 注册 [userContentController addScriptMessageHandler:handler name:@“currentCookies"];
    
    // 回调
    - (void)userContentController:(WKUserContentController
    *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
    {
        if ([message.name isEqualToString:@"currentCookies"]) {
            NSString *cookiesStr = message.body;
            NSLog(@"当前的cookie为: %@", cookiesStr);
        }
    }
    

    最后,移除注册:

    [userContentController removeScriptMessageHandlerForName:@“currentCookies"];
    

    native直接调用JS

    UIWebView中也有对应的方法,只不过UIWebView中是同步的,而在WKWebView是异步执行的,这一点需要特别注意。 具体方法如下:

    - (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
    

    其中:
    javaScriptString 是要执行的JS代码
    completionHandler 是前一个JS代码的返回结果,注意block中第一个参数是id,具体值是根据你写得JS变化的。

    举例:
    获取名字叫meta的标签的长度

    - (void)ocCallJavaScript:(void(^)(void))complete
    {
        [self.webView evaluateJavaScript:@"document.getElementsByTagName('meta').length"
                       completionHandler:^(NSString *count, NSError * _Nullable error)
         {
             !complete ? complete();
         }];
    }
    

    参考

    交流


    希望能和大家交流技术
    Blog:http://www.lilongcnc.cc


    相关文章

      网友评论

        本文标题:38- WKWebView(二) - native和WebVie

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