如何在swift中从.js文件中调用javascript函数

时间:2016-12-27 08:00:32

标签: javascript ios swift javascriptcore

我尝试使用以下代码从swift调用Javascript函数但无法访问Javascript函数

这是我创建Javascript上下文对象的方式:

lazy var context: JSContext? = {
        let context = JSContext()

        guard let
            JSPath = Bundle.main.path(forResource: "IAV", ofType: "html")
            else {
                print("Unable to read resource files.")
                return nil
        }


        do {
            let iav = try String(contentsOfFile: JSPath, encoding: String.Encoding.utf8)
            _ = context?.evaluateScript(iav)
        } catch (let error) {
            print("Error while processing script file: \(error)")
        }

        return context
    }()

//将值设置为js

func setToken(Token:String)
    {
        let jsmethod = context?.objectForKeyedSubscript("setIAVToken")
        let passParameter = jsmethod?.call(withArguments: [Token])
    }

html文件的内容是

  


      
      样本IAV表格

     

    

</head>  


<body > <header> </header> <main>
<h1>Registration Form</h1>  
<form id="myform" method="post">  
 <div id="mainContainer">   <input type="button" id="start" value="Add Bank"> </div>  
           

      var value =&#34; dhjhsd&#34 ;;

var setIAVToken = function(token) {
value= token;
}


$('#start').click(function() {
var iavToken = value;
alert(iavToken)
dwolla.configure('uat');
dwolla.iav.start('iavContainer', iavToken, function(err, res) {
console.log('Error: ' + JSON.stringify(err) + ' -- Response: ' + JSON.stringify(res));
});
}); </script> </html>

3 个答案:

答案 0 :(得分:1)

如果是客观c,请执行以下操作:

    头文件中的
  • #import <JavaScriptCore/JavaScriptCore.h>

  • 接下来在viewcontroller中使用此代码。

NSString *jsPath = [[NSBundle mainBundle] pathForResource:@"JSFileName" ofType:@"js"];

NSString *scriptString = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:nil];

JSContext *context = [[JSContext alloc] init];
    context = [[JSContext alloc] init];
    [context evaluateScript:scriptString];
    JSValue *function = context[@"setMessage"];
    JSValue* result = [function callWithArguments:@[@"your custom string"]]; //pass the string whatever you want.
    [result toString]; // This will give the value in string format.

答案 1 :(得分:0)

编辑html,使用 <input type="button" id="start" value="Add Bank" onClick="setMessage()">代替<input type="button" id="start" value="Add Bank">

还在表单中添加<input type="hidden" id="token" value="Token value">以传递令牌值。

在javascript方法中:

<script>
  function setMessage() {
  var iavToken = document.getElementById("token").value;
  alert(iavToken)
  dwolla.configure('uat');
  dwolla.iav.start('iavContainer', iavToken, function(err, res) {
  console.log('Error: ' + JSON.stringify(err) + ' -- Response: ' +  JSON.stringify(res));
  });
  } 
</script>

接下来使用以下目标c。

调用javascript函数
NSString * jsCallBack = [NSString stringWithFormat:@"setMessage()"]; 
 [webView stringByEvaluatingJavaScriptFromString:jsCallBack];

P.S:您需要在html中添加<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>(或者如果你有js文件在本地添加它。)以使用js。

答案 2 :(得分:0)

您可能应该使用WKWebView(这是在iOS中将Web内容加载到Web视图中的新方法,因为它使用WebKit并具有很多改进,例如比WebView更好的内存分配)。

在iOS的快速文件WebviewBridging.swift中,您可能会遇到类似的情况

import UIKit
import WebKit

class WebviewBridging: UIViewController, WKNavigationDelegate {

    var webView: WKWebView?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Create a WKWebView instance
        webView = WKWebView (frame: self.view.frame, configuration: webConfig)
        view.addSubview(webView!)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let url = Bundle.main.url(forResource: "index", withExtension: "html")!
        webView!.loadFileURL(url, allowingReadAccessTo: url)
    }

    func callJSFunctionFromSwift(){
        webView!.evaluateJavaScript("changeBackgroundColor('red')", completionHandler: nil)
    }
}

在iOS项目文件夹中的index.html文件中,您可能会看到类似的内容

<html>
    <head>
    </head>
    <body>
    <script>
    function changeBackgroundColor(colorText) {
        document.body.style.background = colorText;
    }
    </script>
    </body>
</html> 

每当您迅速调用callJSFunctionFromSwift()时,它将通过XPC通信与WKWebView进行通信,并评估将触发index.html中的javascript函数的javascript代码。