JS调用OC

通过wkwebview的WKScriptMessageHandler协议, 注入api方式

iOS 添加监听 [_wkWebView.configuration.userContentController addScriptMessageHandler:self name:name]; 实现协议中的方法(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message message有name和body,name就是约定好的事件名称,body就是传入的参数

js调用 window.webkit.messageHandlers.name.postMessage(action, token);

当然vcdisappear后,记得移除监听 [_wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"jsToOc"];

利用WebView-协议拦截

//! JS调用OC入口
function jsToOc(action, params) {
  var url = "jsToOc://" + action + "?" + params;
  window.location.href = url;
}

这个靠拦截url,再判断url协议来实现调用

#pragma mark - WKNavigationDelegate

//! WKWeView在每次加载请求前会调用此方法来确认是否进行请求跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    if ([navigationAction.request.URL.scheme caseInsensitiveCompare:@"jsToOc"] == NSOrderedSame) {
        [WKWebViewInterceptController showAlertWithTitle:navigationAction.request.URL.host message:navigationAction.request.URL.query cancelHandler:nil];
        decisionHandler(WKNavigationActionPolicyCancel);
    }
    else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

利用JavaScriptCore框架

//! 导入JavaScriptCore框架头文件 #import <JavaScriptCore/JavaScriptCore.h> #pragma mark - UIWebViewDelegate

//! UIWebView在每次加载请求完成后会调用此方法
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    
    //! 获取JS代码的执行环境/上下文/作用域
    JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    //! 监听JS代码里面的jsToOc方法(执行效果上可以理解成重写了JS的jsToOc方法)
    context[@"jsToOc"] = ^(NSString *action, NSString *params) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // dosomething in native
        });
    };
}

iOS 调用js, 直接调用js的方法并传参

NSString *jsString = [NSString stringWithFormat:@"ocToJs('loginSucceed', 'oc_tokenString')"];
[self.webView stringByEvaluatingJavaScriptFromString:jsString]

标签: objective-c, swift, javascript

添加新评论

0%