2015-02-05 68 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

相關問題