swift与js交互:
先看model:
@objc protocol VideoDelegate : JSExport {
func callSystemCamera();
func exitsCollection(cid: String);
}
@objc class OCModel: NSObject , VideoDelegate {
var jsContext: JSContext!
func callSystemCamera() {
print("callSystemCamera exe")
let jsFunc = jsContext.objectForKeyedSubscript("jsFunc");
jsFunc?.call(withArguments: []);
}
func exitsCollection(cid: String) {
print("cid \(cid)");
let handleFunc = jsContext.objectForKeyedSubscript(cid);
handleFunc?.call(withArguments: ["type","1"]);
}
}
class TestJSContext: NSObject {
func testJS(){
let jsContext = JSContext();
jsContext?.exceptionHandler = {
(context,value) -> Void in
print("context?.exception.toString() \(String(describing: context?.exception?.toString()))");
}
let jsPath = Bundle.main.url(forResource: "js", withExtension: "js");
let jsTxt = try? String.init(contentsOf: jsPath!);
// let value = jsContext?.evaluateScript("2 * 0");
// print("value?.toObject() \(value?.toString())");
let csDt = jsContext?.evaluateScript(jsTxt!);
print(csDt as Any);
let arrayVa = jsContext?.objectForKeyedSubscript("array");
print("arrayVa?.toArray() \(arrayVa?.toObject() ?? "")");
var funcMethod = jsContext?.evaluateScript("enterHome")
let result = funcMethod?.call(withArguments: [9])
print("object = \(result)")
}
}
注意: 必须实现 JSExport协议,
viewController:
首先加载 html 到 webView
然后 在加载完成之后 直接加入 model
有点需要注意:
是 value(forKeyPath:)不是 value(forKey:);
从webView 里获取 JSContext
- self.jsContext = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as? JSContext