应用程序的隔离/沙箱部分(即插件)

时间:2015-02-05 23:04:51

标签: ios objective-c plugins sandbox javascriptcore

我目前正在测试允许应用程序用户在应用程序内创建脚本/插件的功能(使用JavaScriptCore)。例如,这些插件允许它们对对象进行调用并呈现视图控制器。问题在于用户可能犯错,导致异常被引发,例如,如果他们发送对象没有响应的消息或者试图呈现已经活动的视图控制器。

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

除了需要防止由于脚本/插件导致的崩溃之外,还需要能够根据需要终止脚本(这可能是一个完全独立的问题),例如停止按钮。例如,这会终止任何设置的计时器,我相信让插件在一个单独的线程上运行也可以处理它,因为它们在一个单独的运行循环中。

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

非常感谢有关此事的任何想法/建议。

1 个答案:

答案 0 :(得分:0)

为了在"安全"中测试您的脚本环境您可以继承NSOperation类并在自定义功能中执行脚本。在您的NSOperation子类中,您需要实现 start 方法并从 @try @catch

调用 main
-(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的更多详细信息。