1. 程式人生 > >macOS開發中客戶端和javaScript的互調(使用Swift開發)

macOS開發中客戶端和javaScript的互調(使用Swift開發)

在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){

}