import JavaScriptCore import Alamofire func createJSContext() -> JSContext { let ctx = JSContext() // 注入 console.log ctx?.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }") let consoleLog: @convention(block) (String) -> Void = { message in print("JavaScript Console.log: " + message) } ctx?.setObject(unsafeBitCast(consoleLog, to: AnyObject.self), forKeyedSubscript: "_consoleLog" as (NSCopying & NSObjectProtocol)?) // 注入AF ctx?.evaluateScript("var AF = { request: function(url, method, data, headers, callback) { _request(url, method, data, headers, callback) } }") let af: @convention(block) (String, String, String?, [String: String]?, JSValue?) -> Void = { url, method, data, headers, callback in var request = URLRequest(url: URL(string: url)!) request.httpMethod = method if method == "POST" { if let data = data { request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = data.data(using: .utf8) } } if let headers = headers { request.headers = HTTPHeaders(headers) } AF.request(request).response { response in if let data = response.data { callback?.call(withArguments: [String(data: data, encoding: .utf8), nil]) } if let error = response.error { callback?.call(withArguments: [nil, error.localizedDescription]) } } } ctx?.setObject(unsafeBitCast(af, to: AnyObject.self), forKeyedSubscript: "_request" as (NSCopying & NSObjectProtocol)?) // 捕捉JS运行异常 ctx?.exceptionHandler = { context, exception in if let exception = exception { print("JavaScript Exception: \(exception)") } } return ctx! } let ctx = createJSContext() let script = """ AF.request("http://api.mywidgetsnow.com/health", "GET", null, null, function(data, err) { console.log(data); console.log(err); }); AF.request("httpdddd://api.mywidgetsnow.com/health", "GET", null, null, function(data, err) { console.log(data); console.log(err); }); """ // 执行 JavaScript 脚本 ctx.evaluateScript(script) RunLoop.main.run()