我们在使用WKWebView的时候,需要与h5那边进行交互,比如:h5那边有个按钮点击,iOS端需要监听这个方法并作出相应的逻辑处理,这时候我们就需要通过注册方法来进行交互,如下
[self.userContentController addScriptMessageHandler:self name:MethodName];
但我们退出该控制器的时候,就会发现dealloc方法根本不会调用,导致内存得不到释放,这时候我们就要通过中间变量LAWKDelegateController来注册方法,解决内存释放问题
- (void)viewDidLoad {
[super viewDidLoad];
//配置环境
WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc]init];
self.userContentController = [[WKUserContentController alloc]init];
configuration.userContentController = self.userContentController;
self.webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, 100, 100) configuration:configuration];
// self.webView.UIDelegate = self;
// self.webView.navigationDelegate = self;
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
[self.view addSubview:self.webView];
/**
注册方法
addScriptMessageHandler:self
当我们通过self注册方法的时候,发现dealloc不会调用,内存得不到释放
解决方法:
通过中间变量解决内存释放问题:LAWKDelegateController
*/
// [self.userContentController addScriptMessageHandler:self name:MethodName];
LAWKDelegateController *delegateController = [[LAWKDelegateController alloc]init];
delegateController.delegate = self;
[self.userContentController addScriptMessageHandler:delegateController name:MethodName];
}
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
NS_ASSUME_NONNULL_BEGIN
@protocol WKDelegate <NSObject>
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
@end
@interface LAWKDelegateController : UIViewController <WKScriptMessageHandler>
@property (weak , nonatomic) id<WKDelegate> delegate;
@end
NS_ASSUME_NONNULL_END
#import "LAWKDelegateController.h"
@interface LAWKDelegateController ()
@end
@implementation LAWKDelegateController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
if ([self.delegate respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) {
[self.delegate userContentController:userContentController didReceiveScriptMessage:message];
}
}
@end