2015-02-05 28 views
0

我目前正在测试允许应用程序的用户在应用程序内使用JavaScriptCore创建脚本/插件 - 可以这么说 - 的功能。例如,这些插件允许它们在对象和当前视图控制器上进行调用。问题在于,用户可能犯了一个错误,导致异常被引发,例如,如果他们发送消息:对象没有响应或试图呈现已经活动的视图控制器。应用程序的隔离/沙箱部分(即插件)

到目前为止,我一直在寻找使用NSSetUncaughtExceptionHandler来捕获应用程序中的所有异常,我的想法是在单独的线程中隔离脚本/插件的执行,然后在出现异常时使用[NSThread exit]退出该线程,从而防止一个完整的应用程序崩溃。与此相关的问题是双重的,首先早期退出线程会导致内存泄漏所有分配的对象,而不会释放到该点;其次,任何与UI相关的东西都不能在单独的线程上处理。

除了需要防止由脚本/插件引起的崩溃之外,还需要能够根据需要终止脚本(这可能可能是一个单独的问题),例如停止按钮。这将终止任何设置定时器,例如,我相信有一个单独的线程上运行插件也将处理这个,因为他们将在一个单独的运行循环。

无可否认,这是一个非常不理想的情况,如果这是在OS X上,那么我的第一个想法就是产生一个沙盒子进程并使用XPC。然而,不幸的是,在iOS上不能提供这种奢侈品。

任何意见/建议,将不胜感激。

回答

0

为了在“安全”环境中测试脚本,您可以继承NSOperation类并在自定义main函数中执行脚本。在你的NSOperation子类需要实现开始方法,并呼吁主要@try @catch

-(void)start { 
    @try { 
     [self main]; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Exception was raised"); 
    } 
} 

-(void)main { 
    // Perform script here 
} 

最终你需要这个操作添加到主操作队列

[[NSOperationQueue mainQueue] addOperation:[MyScriptOperation new]]; 

因此,您的脚本将在主线程上运行,并且您将能够执行UI操作。

此外,通过附加配置,您将能够手动运行并取消该操作。你可以找到更多关于NSOperation子类和细节的细节here

+0

对JSContext(JavaScriptCore)'evaluateScript:'使用try-catch块似乎无法捕获由于脚本中的调用而导致的异常。例如如果从JS调用的导出方法抛出异常 – Joshua 2015-02-11 13:51:28

+0

你见过这篇文章吗?(http://www.bignerdranch.com/blog/javascriptcore-example/)?有一个段落叫做“如果可以的话,赶上我”,它描述了如何捕捉JS异常。也许这将有助于解决您的问题。 – salabaha 2015-02-12 22:01:08

+0

我确实有,但不幸的是,它没有JS异常,我遇到了问题捕获,而是因为Javascript调用而抛出的Obj-C异常。如果这不是我使用JavaScriptCore的具体情况,那么我相信你的回答会很好。 – Joshua 2015-02-12 22:22:28