我目前正在测试允许应用程序的用户在应用程序内使用JavaScriptCore创建脚本/插件 - 可以这么说 - 的功能。例如,这些插件允许它们在对象和当前视图控制器上进行调用。问题在于,用户可能犯了一个错误,导致异常被引发,例如,如果他们发送消息:对象没有响应或试图呈现已经活动的视图控制器。应用程序的隔离/沙箱部分(即插件)
到目前为止,我一直在寻找使用NSSetUncaughtExceptionHandler
来捕获应用程序中的所有异常,我的想法是在单独的线程中隔离脚本/插件的执行,然后在出现异常时使用[NSThread exit]
退出该线程,从而防止一个完整的应用程序崩溃。与此相关的问题是双重的,首先早期退出线程会导致内存泄漏所有分配的对象,而不会释放到该点;其次,任何与UI相关的东西都不能在单独的线程上处理。
除了需要防止由脚本/插件引起的崩溃之外,还需要能够根据需要终止脚本(这可能可能是一个单独的问题),例如停止按钮。这将终止任何设置定时器,例如,我相信有一个单独的线程上运行插件也将处理这个,因为他们将在一个单独的运行循环。
无可否认,这是一个非常不理想的情况,如果这是在OS X上,那么我的第一个想法就是产生一个沙盒子进程并使用XPC。然而,不幸的是,在iOS上不能提供这种奢侈品。
任何意见/建议,将不胜感激。
对JSContext(JavaScriptCore)'evaluateScript:'使用try-catch块似乎无法捕获由于脚本中的调用而导致的异常。例如如果从JS调用的导出方法抛出异常 – Joshua 2015-02-11 13:51:28
你见过这篇文章吗?(http://www.bignerdranch.com/blog/javascriptcore-example/)?有一个段落叫做“如果可以的话,赶上我”,它描述了如何捕捉JS异常。也许这将有助于解决您的问题。 – salabaha 2015-02-12 22:01:08
我确实有,但不幸的是,它没有JS异常,我遇到了问题捕获,而是因为Javascript调用而抛出的Obj-C异常。如果这不是我使用JavaScriptCore的具体情况,那么我相信你的回答会很好。 – Joshua 2015-02-12 22:22:28