ios WKWebView和JS交互注意细节

2019-03-02  本文已影响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弹框了");

}

上一篇下一篇

猜你喜欢

热点阅读