web-dev-qa-db-ja.com

JavaScriptをSwiftコード内で実行できますか?

SignalRチャットを呼び出すことができるようにJavaScriptコードをSwiftコードに含める必要がありますか?それができない場合、変換できますか?

sendmessageはボタンです。

$(function () {
    // Declare a proxy to reference the hub.
    var chat = $.connection.chatHub;
    // Create a function that the hub can call to broadcast messages.
    chat.client.broadcastMessage = function (name, message) {
        // some code
    };

    // Start the connection.
    $.connection.hub.start().done(function () {
        $('#sendmessage').click(function () {
            // Call the Send method on the hub.
            chat.server.send('name', 'message');
        });
    });
});

signalrコードは次のとおりです。

    public void Send(string name, string message)
    {
        // Call the broadcastMessage method to update clients. 
        Clients.All.broadcastMessage(name, message);
    }

更新#1:

@MartinRごとに混乱しないように質問を少し変更しました

30
user1019042

Swift内でJavaScriptを実行できます!

Playgroundで実行して開始できる例を次に示します。

import JavaScriptCore

let jsSource = "var testFunct = function(message) { return \"Test Message: \" + message;}"

var context = JSContext()
context?.evaluateScript(jsSource)

let testFunction = context?.objectForKeyedSubscript("testFunct")
let result = testFunction?.call(withArguments: ["the message"])

resultTest Message: the message

WKWebView 呼び出し evaluate Java Script(_:completion Handler:) 内でJavaScriptコードを実行することもできます。

IWebView 内でJavaScriptを実行することもできます string By Evaluating Java Script(from:) を呼び出しますが、 methodはdeprecatedであり、iOS 2.0〜12.0としてマークされています。

49
Daniel

JavaScriptCore frameworkを使用すると、Swift code。

最も対処するクラスは、JSContextです。このクラスは、JavaScriptコードを実行する実際の環境(コンテキスト)です。

JSContextのすべての値は、JSValue =クラスが表すように、JSValueオブジェクトですJavaScript値のデータ型。つまり、SwiftからJavaScript変数とJavaScript関数にアクセスする場合、両方とも「JSValue」オブジェクトと見なされます。

JavaScriptCore framework に関する公式ドキュメントを読むことを強くお勧めします。

import JavaScriptCore


var jsContext = JSContext()


// Specify the path to the jssource.js file.
if let jsSourcePath = Bundle.main.path(forResource: "jssource", ofType: "js") {
    do {
        // Load its contents to a String variable.
        let jsSourceContents = try String(contentsOfFile: jsSourcePath)

        // Add the Javascript code that currently exists in the jsSourceContents to the Javascript Runtime through the jsContext object.
        self.jsContext.evaluateScript(jsSourceContents)
    }
    catch {
        print(error.localizedDescription)
    }
}  

詳細はこれを参照してください チュートリアル

5
Ashish