? ? ? ?前些時間,博主遇到了一個需求,就是在網頁在UIWebView顯示之前傳參數給web,就是webView調用OC代碼的問題。那個寫web頁面的兄弟和博主對這個不是很熟悉。然后就是各種google,然后用了網上一個WebViewJavascriptBridge-master的庫,然后整個人就開始懵B了。直到一個大神給我一個例子,看到例子以后終于搞定了,現在記錄下這個過程。。。
web調OC需要用到JSContext,這個東西是干嘛的呢?以下是蘋果給出解釋:A JSContextobject represents a JavaScript execution environment. You create and use JavaScript contexts to evaluate JavaScript scripts from Objective-C or Swift code, to access values defined in or calculated in JavaScript, and to make native objects, methods, or functions accessible to JavaScript.我個人的理解就是它是一個web,也就相當于OC里的一個的類吧(不知道理解的對不對)。
它的創建和使用都很簡單,就像這樣:
我來解釋下為什么要把self給context的iOS呢?看到下面的代碼你就明白了:
當然,這只是OC里寫的,下面看看web童鞋要怎么寫,看下面:
看到了嗎?這里的iOS對象就相當于ViewContrller,只要是這個ViewController遵循的協議方法,只要OC里實現了,webView都可以調用。
PS:如果在協議加上@optional關鍵字,web是調用不了這些方法的。
以上代碼中,其實有個地方是有問題的,這個問題也是博主后來才發現的,問題的點就是:
這就會造成這個self會被強引用,最終會變成循環引用。解決是創建一個中間對象:
使用時,就這樣用:
最后,這個問題還是沒有完全解決,只是通過中間類替換了,這個中間類會被強引用!!!樓主,放棄了這個方法,改用WKWebView,可以點這里查看新的方案,如果還是不明白,那就看Demo吧。