我目前正在測試允許應用程序的用戶在應用程序內使用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