首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序的隔离/沙箱部分(即插件)

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

Stack Overflow用户
提问于 2015-02-06 07:04:51
回答 1查看 240关注 0票数 0

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

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

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

诚然,这远不是理想的情况,如果这是在OS上,那么我的第一个想法是产生一个沙箱子进程并利用XPC。然而,不幸的是,人们无法在iOS上享受到这种奢侈。

任何关于这个问题的想法/建议都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-02-11 10:50:45

为了在“安全”的环境中测试你的脚本,你可以继承NSOperation类并在自定义的函数中执行你的脚本。在NSOperation子类中,您需要实现start方法,并从@try @catch块调用

代码语言:javascript
复制
-(void)start {
    @try {
       [self main];
    }
    @catch (NSException *exception) {
       NSLog(@"Exception was raised");
    }
}

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

最后,您需要将此操作添加到主操作队列中

代码语言:javascript
复制
[[NSOperationQueue mainQueue] addOperation:[MyScriptOperation new]];

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

此外,通过其他配置,您还可以手动运行和取消此操作。您可以找到有关NSOperation子类化和实现细节here的更多详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28355751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档