Как я должен сопоставить applicationWillEnterForeground appDelegate tvOS с функцией JavaScript? - PullRequest
0 голосов
/ 14 марта 2019

Я слежу за примером проекта Apple для Воспроизведение мультимедиа в приложении клиент-сервер .

func executeRemoteMethod(_ methodName: String, completion: @escaping (Bool) -> Void) {
    appController?.evaluate(inJavaScriptContext: { (context: JSContext) in
        let appObject : JSValue = context.objectForKeyedSubscript("App")

        if appObject.hasProperty(methodName) {
            appObject.invokeMethod(methodName, withArguments: [])
        }
        }, completion: completion)
}

Метод вызывается во время событий жизненного цикла приложения, например:

func applicationWillEnterForeground(_ application: UIApplication) {

    executeRemoteMethod("onWillEnterForeground", completion: { (success: Bool) in
        // ...
    })
}

Мне интересно, как это работает. Это так, чтобы собственная кодовая база iOS могла сообщать событие жизненного цикла к коду Javascript? Когда я ставлю точку останова, я вижу, как вызывается функция executeRemoteMethod. Но я не думаю, что на самом деле это что-то делает. Как я могу сопоставить его с функцией JS? Нужно ли создавать новый файл js или просто создавать новую функцию в моем файле application.js?

1 Ответ

0 голосов
/ 15 марта 2019

Благодаря прочтению этого урока .Я узнал:

В начале блока мы сначала получаем ссылку на наш объект JavaScript «App» .Затем мы проверяем существование свойства с именем метода, которое было передано нам.Если он существует, мы вызываем метод.Хотя текущая реализация не передает аргументы методу, мы можем изменить его, чтобы сделать это, если это необходимо.Наконец, блок завершения, который был передан нам, выполняется после завершения выполнения метода JavaScript. Это похоже на то, как функция уже написана внутри application.js:

В своем уроке application.js выглядит следующим образом:

App.onLaunch = function(options) {
    var alert = createAlert("Hello World!", "Welcome to tvOS");
    navigationDocument.pushDocument(alert);
}

App.onWillResignActive = function() {
}

App.onDidEnterBackground = function() {
}

App.onWillEnterForeground = function() {
}

App.onDidBecomeActive = function() {
}

App.onWillTerminate = function() {
}

var createAlert = function(title, description) {
    var alertString = `<?xml version="1.0" encoding="UTF-8" ?>
        <document>
          <alertTemplate>
            <title>${title}</title>
            <description>${description}</description>
          </alertTemplate>
        </document>`

    var parser = new DOMParser();

    var alertDoc = parser.parseFromString(alertString, "application/xml");

    return alertDoc
}

В результате мне просто нужно добавить следующее внутри application.js, тогда оно будет вызвано при обратном вызове AppDelegates WillEnterForeGround.

App.onWillEnterForeground = function(options) {
    console.log("something")
}
...