webView与JS交互

1.使用JavaScriptCore框架
2.js调用iOS分两种情况:
一,js里面直接调用方法
-(void)webViewDidFinishLoad:(UIWebView *)webView  {
//网页加载完成调用此方法  
      
    //iOS调用js  
      
    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)  
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
    
    //js调用iOS  
    //第一种情况  
    //其中test1就是js的方法名称,赋给是一个block 里面是iOS代码  
    //此方法最终将打印出所有接收到的参数,js参数是不固定的 我们测试一下就知道  
    context[@"test1"] = ^() {  
        NSArray *args = [JSContext currentArguments];  
        for (id obj in args) {  
            NSLog(@"%@",obj);  
        }  
    };  
    //此处我们没有写后台(但是前面我们已经知道iOS是可以调用js的,我们模拟一下)  
    //首先准备一下js代码,来调用js的函数test1 然后执行  
    //一个参数  
    NSString *jsFunctStr=@"test1('参数1')";  
    [context evaluateScript:jsFunctStr];  
      
    //二个参数  
    NSString *jsFunctStr1=@"test1('参数a','参数b')";  
    [context evaluateScript:jsFunctStr1];  

   }

二,js里面通过对象调用方法

class BaseWebViewController: UIViewController {
  /// JSObject
    lazy var jsObject:HLJSObject = {
        let obj = HLJSObject()
        obj.delegate = self
        return obj
    }()

 ///初始化JSObject
    func initJSObject() {
        let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext
        context.setObject(jsObject, forKeyedSubscript: "JSInterface")
        
     }

  func webViewDidFinishLoad(webView: UIWebView){

         initJSObject()


   }
}
extension BaseWebViewController:HLJSObjectProtocol{
    // MARK: - 登录
    func isLogin(){
        
        let user_id = HLCheckUserID(true)
        if user_id == 1 {
            
            let vc = SB_Login.initialVC! as! UINavigationController
            presentPushEffect(vc, completion: {
                
            })
        }else{
            webViewReoload()
        }
    }
}

import Foundation
import JavaScriptCore

@objc protocol HLJSObjectProtocol:JSExport {
    /// 登录
    func isLogin()
}

@objc class HLJSObject: NSObject,HLJSObjectProtocol {
    var delegate:HLJSObjectProtocol?
    /// 登录
    func isLogin(){
        delegate?.isLogin()
    }
}


你可能感兴趣的:(webView与JS交互)