ios WKWebView和JS交互注意细节
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弹框了");
}