#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];
}