#define URL_define @"URL"
// 添加监听当前url
-(void)addwebViewKVOUrl
{
[self.webview addObserver:self forKeyPath:URL_define options:NSKeyValueObservingOptionNew context:nil];
}
// KVO 方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"URL"])
{
NSLog(@" 当前 URL------%@",self.webview.URL.absoluteString);
}
}
-(void)removeWebViewKVOUrl
{
[self.webview removeObserver:self forKeyPath:URL_define];
}
// ---------------------接收前端参数----------------------
/// 添加 js 接收消息方法
/// 前端 发消息给客户端方法 window.webkit.messageHandlers.与后台约定的方法名.postMessage(传的参数);
/// @param name 方法名 与前端协商好一个字符串 就可以了
-(void)addJSMessageFromName:(NSString *)name
{
[self.webview.configuration.userContentController addScriptMessageHandler:self name:name];
}
/*
接收H5 消息的方法
需要指定 WKScriptMessageHandler 代理
*/
-(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message
{
NSLog(@"h5 name %@",message.name);
NSLog(@"h5 body %@",message.body);
}
-(void)removeJSMessageFromName:(NSString *)name
{
[self.webview.configuration.userContentController removeScriptMessageHandlerForName:name];
}
// ----------------- 给前端发消息 -------------------------
-(void)sendMessageToJSFromNme:(NSString *)name data:(id)data
{
NSString * jsStr = [NSString stringWithFormat:@"%@('%@')",name,data];
[self.webview evaluateJavaScript:jsStr completionHandler:^(id _Nullable response, NSError * _Nullable error) {
if (!error)
{
NSLog(@"成功 = %@",response);
}
else
{
NSLog(@"失败 = %@",error.localizedDescription);
}
}];
}
-(WKWebView *)webview{
if (!_webview)
{
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.selectionGranularity = WKSelectionGranularityDynamic;
config.allowsInlineMediaPlayback = YES;
WKPreferences *preferences = [WKPreferences new];
preferences.javaScriptEnabled = YES;
preferences.javaScriptCanOpenWindowsAutomatically = YES;
config.preferences = preferences;
CGRect frem = self.view.frame;
WKWebView * webview = [[WKWebView alloc] initWithFrame:frem configuration:config];
webview.navigationDelegate = self;
webview.UIDelegate = self;
_webview = webview;
}
return _webview;
}
// ------------------ 调用 -------------------------
#define MessageName @"resiveMessage"
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self addwebViewKVOUrl];
[self addJSMessageFromName:MessageName];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self removeWebViewKVOUrl];
[self removeJSMessageFromName:MessageName];
}