iOS WKWebView與H5交互,監聽頁面URL變化、接收H5傳值、傳值給H5。


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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章