macOS开发中客户端和javaScript的互调(使用Swift开发)
程序员文章站
2022-05-14 08:06:45
...
在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){
}