我正在关注Apple的Playing Media in a Client-Server App示例项目。
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
文件中创建一个新函数?
感谢阅读这个tutorial。我学会了:
在块开始时,我们首先获得对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")
}