Можно ли запустить 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
Ответы
Ответ 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?)"