Swift與JS互動
阿新 • • 發佈:2018-11-25
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"