Подтвердить что ты не робот

Можно ли запустить JavaScript внутри кода Swift?

Мне нужно включить код JavaScript в код Swift, чтобы можно было вызвать чат signalR, это возможно? Если нет, могу ли я преобразовать его?

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

4b9b3361

Ответ 1

Вы можете запустить JavaScript внутри Swift!

Вот пример, который вы можете запустить в 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"])

result будет Test Message: the message.

Вы также можете запустить код JavaScript в WKWebView, вызывая оценочный Java Script (_: завершение обработчика :).

Вы также можете запустить JavaScript в UIWebView, вызвав строку путем оценки Java Script (from :), но обратите внимание, что этот метод устарел и помечен как iOS 2.0–12.0.

Ответ 2

Использование JavaScriptCore Framework включает код JavaScript в код Swift.

Класс, с которым вы будете иметь дело больше всего, это JSContext. Этот класс является фактической средой (контекстом), которая выполняет ваш код JavaScript.

Все значения в JSContext являются объектами JSValue, так как класс JSValue представляет тип данных любого значения JavaScript. Это означает, что если вы обращаетесь к переменной JavaScript и функции JavaScript из Swift, оба они считаются объектами JSValue.

Я настоятельно советую вам прочитать официальную документацию, касающуюся инфраструктуры JavaScriptCore.

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)
    }
}  

более подробную информацию см. в этом уроке

Ответ 3

я пытаюсь использоватьvaluScript для URL-адреса в документации Apple, он показывает funcvaluScript (_ script: String !, withSourceURL sourceURL: URL!) → JSValue!

я позволил newURL = URL (строка: " https://google.com/ ") self.jsContext.evaluateScript(jsSourceContents, newURL) <- ошибка говорит: "Невозможно вызвать" defineScript "со списком аргументов типа" (String, URL?)"