1. 程式人生 > >OC 與 JS 互動遇到的坑

OC 與 JS 互動遇到的坑

呼叫互動方法的時機不對。當我們在- (void)viewDidLoad中注入JS程式碼之後,如果頁面發生了重定向,此時web頁面的JS已經發生了變化,而- (void)viewDidLoad方法只會執行一次,所以不再是之前我們注入過的那些JS了,此時再呼叫本地方法自然就失效了。
如果我們在- (void)webViewDidFinishLoad:(UIWebView )webView方法中注入JS,看起來貌似可以解決重定向之後呼叫失效的問題,因為webView每次載入完成後都會回撥- (void)webViewDidFinishLoad:(UIWebView )webView,也就是說每次重定向之後,只要頁面載入完成,JS程式碼就會重新被注入。如果JS呼叫OC方法的時機是在頁面載入完成之後,比如點選web介面上的按鈕或者由使用者手動觸發一個事件呼叫OC程式碼,這種情況一定是web頁面載入完成之後才會發生的,而此時我們已經重新注入了JS,這樣一點問題都沒有。但是,如果JS呼叫OC方法的時機剛好發生在頁面載入過程中呢?比如web介面載入過程中自動執行一些操作需要呼叫OC程式碼,而此時- (void)webViewDidFinishLoad:(UIWebView *)webView還沒有回撥,所以我們的JS程式碼並沒有重新注入,這裡仍然會造成失效的問題。應該
在每次建立JSContext環境的時候,我們都去注入此互動物件這樣就解決了上面的問題。於是我找到了相關的第三方webview的延展UIWebView+TS_JavaScriptContext。解決了該問題。(有可能AppStore稽核會被拒絕,說是因為使用了私有的API。我還沒有遇到該情況。)