main.swift 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import JavaScriptCore
  2. import Alamofire
  3. func createJSContext() -> JSContext {
  4. let ctx = JSContext()
  5. // 注入 console.log
  6. ctx?.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
  7. let consoleLog: @convention(block) (String) -> Void = { message in
  8. print("JavaScript Console.log: " + message)
  9. }
  10. ctx?.setObject(unsafeBitCast(consoleLog, to: AnyObject.self), forKeyedSubscript: "_consoleLog" as (NSCopying & NSObjectProtocol)?)
  11. // 注入AF
  12. ctx?.evaluateScript("var AF = { request: function(url, method, data, headers, callback) { _request(url, method, data, headers, callback) } }")
  13. let af: @convention(block) (String, String, String?, [String: String]?, JSValue?) -> Void = { url, method, data, headers, callback in
  14. var request = URLRequest(url: URL(string: url)!)
  15. request.httpMethod = method
  16. if method == "POST" {
  17. if let data = data {
  18. request.setValue("application/json", forHTTPHeaderField: "Content-Type")
  19. request.httpBody = data.data(using: .utf8)
  20. }
  21. }
  22. if let headers = headers {
  23. request.headers = HTTPHeaders(headers)
  24. }
  25. AF.request(request).response { response in
  26. if let data = response.data {
  27. callback?.call(withArguments: [String(data: data, encoding: .utf8), nil])
  28. }
  29. if let error = response.error {
  30. callback?.call(withArguments: [nil, error.localizedDescription])
  31. }
  32. }
  33. }
  34. ctx?.setObject(unsafeBitCast(af, to: AnyObject.self), forKeyedSubscript: "_request" as (NSCopying & NSObjectProtocol)?)
  35. // 捕捉JS运行异常
  36. ctx?.exceptionHandler = { context, exception in
  37. if let exception = exception {
  38. print("JavaScript Exception: \(exception)")
  39. }
  40. }
  41. return ctx!
  42. }
  43. let ctx = createJSContext()
  44. let script = """
  45. AF.request("http://api.mywidgetsnow.com/health", "GET", null, null, function(data, err) {
  46. console.log(data);
  47. console.log(err);
  48. });
  49. AF.request("httpdddd://api.mywidgetsnow.com/health", "GET", null, null, function(data, err) {
  50. console.log(data);
  51. console.log(err);
  52. });
  53. """
  54. // 执行 JavaScript 脚本
  55. ctx.evaluateScript(script)
  56. RunLoop.main.run()