我已经开始研究为新Apple TV制作基于TVML / TVJS的应用程序的教程,我有两个问题使得开发过程非常繁琐且不切实际。
我无法理解的第一件事是我应该如何调试在应用程序启动时发生的代码。我已经连接了Safari调试器,我确实设法点击了一些断点,但仅限于某些用户输入触发的代码。在启动时,我正在从远程位置加载一个xml文档,我将使用它来动态生成tvml模板,但是我无法让调试器停止在模板完成渲染之前运行的代码中的任何位置。
我遇到的另一个反生产问题是,我似乎无法以任何其他方式重新加载JavaScript文件,而不是完全关闭模拟器中的应用程序(双击主页按钮,然后轻扫应用程序)。这也使调试器退出,所以我也必须重新启动它。这肯定不是你应该进行持续开发和测试的方式吗?
答案 0 :(得分:1)
当您从Safari菜单中选择“自动暂停”和“自动显示”选项时,可以使调试器停在第一行"开发/模拟器"。
你对退出问题是正确的。
您还可以尝试从Safari Debugger控制台运行App.reload()
。
这也会重新启动应用程序,也许将来他们可以使它工作,所以调试器不会消失。
但目前这也没有解决问题。
答案 1 :(得分:0)
对于手动调试器输出(又名console.log()
),您可以将日志记录重定向到Xcode调试器。
(在网络上的某个地方)我找到了实际做到这一点的方法,简而言之,它看起来像......
AppDelegate.Swift
func appController(appController: TVApplicationController, evaluateAppJavaScriptInContext jsContext: JSContext) {
let jsInterface: cJsInterface = cJsInterface();
jsContext.setObject(jsInterface, forKeyedSubscript: "swiftInterface")
}
App.js
// re-route console.log() to XCode debug window
var console = {
log: function() {
var message = '';
for(var i = 0; i < arguments.length; i++) {
message += arguments[i] + ' '
};
swiftInterface.log(message)
}
};
JsInterface.Swift
@objc protocol jsInterfaceProtocol : JSExport {
func log(message: String) -> Void
}
...
class cJsInterface: NSObject, jsInterfaceProtocol {
func log(message: String) -> Void {
print("JS: \(message)")
}
}
github中的完整资源:https://github.com/iBaa/PlexConnectApp/tree/f512dfd9c1cb2fbfed2da43c4e3837435b0b22af
我自己没有为垂死的调试器提供任何解决方案......