美文网首页
ios WKWebView和JS交互注意细节

ios WKWebView和JS交互注意细节

作者: 紫释沐沐 | 来源:发表于2019-03-02 12:17 被阅读0次

    1.签订代理<WKScriptMessageHandler>

    2.注册交互方法名

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

    [userContentController addScriptMessageHandler:self.wsDelegate name:@"functionName"];

    注:functionName:为JS和WKWebView交互时的比对信息,好比秘钥,一定要一样;self.wsDelegate:需创建一个弱引用的代理对象,不能直接引用self,否则导致控制器无法被释放。

    JS的调用方式:

    window.webkit.messageHandlers.<name>.postMessage(<messageBody>)(<messageBody>为键值对组)

    例如:window.webkit.messageHandlers.functionName.postMessage({key1: value1,key2:value2});(可以不传参)

    3.实现对应交互方法的执行内容,需执行代理方法

    - (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message

    {

           if([message.name isEqualToString:@"functionName"]) 

    {

     NSLog(@"%@,%@",message.name,message.body);//执行这个交互方法底下所需的操作

        }

    }

    4.创建一个弱引用的代理对象

          a.创建一个继承于NSObject的类

          b.在.h文件中签订代理<WKScriptMessageHandler>,并创建代理对象和初始化方法

    @property (nonatomic, weak) id<WKScriptMessageHandler> delegate;

    - (instancetype)initWithDelegate:(id)delegate;

           c.在.m文件中实现初始化方法并实现代理方法

    - (instancetype)initWithDelegate:(id)delegate

    {

        self= [superinit];

        if(self)

        {

            _delegate= delegate;

        }

        return self;

    }

    #pragma mark ---------------实现代理方法---------------

    - (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message

    {

        [self.delegate userContentController:userContentController didReceiveScriptMessage:message];

    }

           d.在控制器中初始化一个对象,即第2点中的self.wsDelegate,以解决控制器无法释放问题

    5.移除注册的交互方法

    -(void)dealloc

    {

        [self.wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"functionName"];

    }

    6.若当web调起alert时,app进行弹窗,需签订代理<WKUIDelegate>,同时执行以下代理方法

    #pragma mark - WKUIDelegate(js弹框需要实现的代理方法)

    //使用了WKWebView后,在JS端调用alert()是不会在HTML中显式弹出窗口,是我们需要在该方法中手动弹出iOS系统的alert的

    //该方法中的message参数就是我们JS代码中alert函数里面的参数内容

    - (void)webView:(WKWebView*)webView runJavaScriptAlertPanelWithMessage:(NSString*)message initiatedByFrame:(WKFrameInfo*)frame completionHandler:(void(^)(void))completionHandler

    {

        //    NSLog(@"js弹框了");

    }

    相关文章

      网友评论

          本文标题:ios WKWebView和JS交互注意细节

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