欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

macOS开发中客户端和javaScript的互调(使用Swift开发)

程序员文章站 2022-05-14 08:06:45
...

在iOS开发中,我们经常使用到OC(或者Swift)和javaScript的互相调用,

那么在macOS开发中如何实现客户端和javaScript的互调呢?

在macOS开发中需要引入“WebKit.framework”,如下图:

macOS开发中客户端和javaScript的互调(使用Swift开发)


WebView的连线如下:

@IBOutlet weak var 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){

}





相关标签: macOS