主要介绍xcode自带的JavaScriptCore.framework的用法
添加framework 工程文件->target->general->linked frameworks and libraries ->下面+号点下 搜索javascriptCore ->添加
import UIKit
import JavaScriptCore
//这边是直接用模型做的比较方便也比较严谨利于扩展 直接调用就不介绍了
//JSExport要遵从这个协议才能使自己的api对外界开放
@objc protocol JavaScriptSwiftDelegate:JSExport
{
//定义协议 这边可以传参 也可以传字典啥的 可以定义多个方法
//传多个参数用字典比较合适 单个参数直接传
func payResult(dict: [String:AnyObject])
}
@objc class JSModelSwift:NSObject,JavaScriptSwiftDelegate
{
weak var jsContext:JSContext?
//定义模型方法
func payResult(dict: [String:AnyObject])
{
//打印获取的值 这边讲一下 原理是这样的模型后面会注册到js中这样js就可以调用模型及其方法,一般要配合后台人员传参所以这边的参数是已经有值得可以直接打印出来
NSLog(" @ ",dict)
//向js方法传值这边实现传值是swift调用js
这边是从swift端向js端传数据 所以要在js端定义一个function来接收
// let jsParamsFunc = self.jsContext?.objectForKeyedSubscript("jsParamsFunc")
// let dict = NSDictionary(dictionary: ["from":"订单","payCode":9000,"payInfo":"seccuess"])
// jsParamsFunc?.callWithArguments([dict])
//js端的代码
//var jsParamFunc = function(argument) {
//这边是讲html上的一个元素用字典的一个value赋值
// document.getElementById('jsParamFuncSpan').innerHTML
// = argument['payCode'];
}
}
//
}
//在webView中实现交互
class ViewController:UIViewController,UIWebViewDelegate {
var webView:UIWebView!
var jsContext:JSContext?
overridefunc viewDidLoad() {
super.viewDidLoad()
self.webView =UIWebView(frame:self.view.bounds);
self.view.addSubview(self.webView)
self.webView.delegate =self
self.webView.scalesPageToFit = true;
let url ="..."
let request =NSURLRequest(URL: url!)
self.webView.loadRequest(request)
}
// MARK: - UIWebViewDelegate 在webView 代理中实现交互
func webViewDidFinishLoad(webView:UIWebView) {
//创建js中的上下文环境
let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext")as?JSContext
//创建模型
let model =JSModelSwift()
model.jsContext = context
self.jsContext = context
// 这一步是将JSModel这个模型注入到JS中,在JS就可以通过JSModel调用我们公暴露的方法了。从而实现从js端向app端传值了
//附一段传值事件
//<input type="button"value="Call ObjC func with JSON and ObjC call js func to pass //args."onclick="JSModel.payResult({'payCode': 100, 'payInfo': 'faile', 'from': 'Xcode'})">
这边数据是后台的事 后台只要在onclick事件后面添加JSModel.payResult({'payCode': 100, 'payInfo': 'faile', 'from': 'Xcode'})方法并且传数据 Xcode就可以获取数据了
//
self.jsContext?.setObject(model, forKeyedSubscript:"JSModel")
//捕捉异常可以不写
self.jsContext?.exceptionHandler = {
(context, exception) in
print("exception @", exception)
}
}
}