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

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

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

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



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

}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值