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()
}
}
网友评论