macOS開發中客戶端和javaScript的互調(使用Swift開發)
阿新 • • 發佈:2019-02-10
在iOS開發中,我們經常使用到OC(或者Swift)和javaScript的互相呼叫,
那麼在macOS開發中如何實現客戶端和javaScript的互調呢?
在macOS開發中需要引入“WebKit.framework”,如下圖:
WebView的連線如下:
@IBOutletweakvar webView: WebView!
1、客戶端呼叫JavaScript
呼叫方式和iOS開發一樣:
self?.webView.stringByEvaluatingJavaScript(from: "alert(123);")
2、JavaScript呼叫客戶端
// // WebViewWindowController.swift // // Created by yqh on 2017/7/20. // Copyright © 2017年 MCT. All rights reserved. // import Cocoa import WebKit class WebViewWindowController: NSWindowController { //WEBKIT控制元件 @IBOutlet weak var webView: WebView! override func windowDidLoad() { super.windowDidLoad() //設定代理 webView.frameLoadDelegate = self //設定WEBVIEW地址 loadRequest() } /// 載入頁面 func loadRequest(){ let urlString = "載入的地址" webView.mainFrame.load(URLRequest.init(url: URL(string: urlString)!)) print( NSHomeDirectory()) } } // MARK: - WebFrameLoadDelegate代理 extension WebViewWindowController:WebFrameLoadDelegate{ /// JS進入的方法 /// - Parameter jsObject: jsObject /// - Returns: func jsScript(jsObject:WebScriptObject) -> WebScriptObject{ //執行的JS型別 let jsType = jsObject.value(forKey: "js_type") as? String guard let jsTypeg = jsType else { return jsObject } //判斷是呼叫的哪個JS if(jsTypeg == "printcf"){ //列印的內容 let htmlstr = (jsObject.value(forKey: "con") as? String ?? "") //對應客戶端的程式碼 } //返回值 return jsObject } /// 返回是否阻止響應該方法,返回NO即能響應該方法 /// - Parameter selector: selector /// - Returns: BOOL override class func isSelectorExcluded(fromWebScript selector: Selector!) -> Bool{ if(selector == #selector(jsScript(jsObject:))){ return false } return true } /// 設定JSVASCRIPT名稱 /// - Parameter selector: selector /// - Returns: override class func webScriptName(for selector: Selector!) -> String!{ if(selector == #selector(jsScript(jsObject:))){ return "swiftMethod" } return "" } /// 設定WEBVIEW在在網頁中的物件名 /// - Parameters: /// - webView: webView /// - windowObject: windowObject /// - frame: frame func webView(_ webView: WebView!, didClearWindowObject windowObject: WebScriptObject!, for frame: WebFrame!){ windowObject.setValue(self, forKey: "mctnative") } }
對應的封裝的JS方法:
if(mctnative) {
var yzkj = new Object();
yzkj.macos = {
printCf: function(objset) {
objset.js_type = "printcf" //客戶端判斷方法的標識
var result = mctnative.swiftMethod(objset); //呼叫客戶端方法並獲取到返回值
return result;
}
}
}
因為“mcnative“是從客戶端獲取的,瀏覽器開啟頁面時沒有,因此最好補獲一下異常,呼叫方法如下:
try{
yzkj.macos.printcf({con:"傳遞給客戶端的引數"})//方法引數是一個JSON資料
}catch(e){
}