js(javascript)與ios(Objective-C)相互通訊交互

隨着蘋果SDK的不斷升級,愈來愈多的新特性增長了進來,本文主要講述從iOS6至今,Native與JavaScript的交互方法javascript

1、UIWebview && iframe && JavaScript  <=iOS6

iOS6原生沒有提供js直接調用Objective-C的方式,只能經過UIWebView的UIWebViewDelegate協議html

方法來作攔截,並在這個方法中,根據url來調用Objective-C方法java

1.javascript調用Objective-C

動態添加個iframe改變其地址 最後刪除,這種方法不會使當前頁面跳轉 效果更佳git

javascript代碼:github

 

Objective-C代碼:web

 

 

2.Objective-C調用javascript

 

 

 

 


(PS)若是你想去掉webview彈出的alert 中的來自XXX網頁sublime-text

 

 

2、JavaScriptCore && UIWebview >=iOS7

iOS7中加入了JavaScriptCore.framework框架。把 WebKit 的 JavaScript 引擎用 Objective-C 封裝。該框架讓Objective-C和JavaScript代碼直接的交互變得更加的簡單方便。api

合適時機注入交互對象

何時UIWebView會建立JSContext環境?

分兩種方式數組

第一在渲染網頁時遇到<script標籤時,就會建立JSContext環境去運行JavaScript代碼。瀏覽器

第二就是使用方法[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]去獲取JSContext環境時,這時不管是否遇到<script標籤,都會去創造出來一個JSContext環境,並且和遇到<script標籤再創造環境是同一個。

何時注入JSContext問題

我一般都會在 - (void)webViewDidFinishLoad:(UIWebView *)webView中去注入交互對象,可是這時候網頁還沒加載完,JavaScript那邊已經調用交互方法,這樣就會調不到原生應用的方法而出現問題。

改爲在- (void)viewDidLoad中去注入交互對象,這樣卻是解決了上面的問題,可是同時又引發了一個新的問題就是在一個網頁內部點擊連接跳轉到另外一個網頁的時候,第二個頁面須要交互,這時JSContext環境已經變化,可是- (void)viewDidLoad僅僅加載一次,跳轉的時候,沒有再次注入交互對象,這樣就會致使第二個頁面無法進行交互。固然你能夠在- (void)viewDidLoad和- (void)webViewDidFinishLoad:(UIWebView *)webView都注入一次,可是必定會有更優雅的辦法去解決此問題。

若是上邊的方案能知足需求,建議實在無可奈何再用這個方法,  就是在每次建立JSContext環境的時候,咱們都去注入此交互對象這樣就解決了上面的問題。具體解決辦法參考了此開源庫UIWebView-TS_JavaScriptContext

多個iFrame中的JSContext問題

 

 

1. JavaScriptCore調用Objective-C

html中的JS代碼

iOS中的代碼  UIWebview的delegate

JSExport 協議關聯 native 的方法

Objective-C

 

JavaScript

 

2.Objective-C 調用 JavaScriptCore

Objective-C

調用js的showResult方法,這裏是一個參數 result,多個就依次寫到數組中

JavaScript

 

3、WKWebView && JavaScript >=iOS8

iOS 8引入了一個新的框架——WebKit,以後變得好起來了。在WebKit框架中,有WKWebView能夠替換UIKit的UIWebView和AppKit的WebView,並且提供了在兩個平臺能夠一導致用的接口。WebKit框架使得開發者能夠在原生App中使用Nitro來提升網頁的性能和表現,Nitro就是Safari的JavaScript引擎 WKWebView 不支持JavaScriptCore的方式但提供message handler的方式爲JavaScript 與Native通訊.

1.Objective-C  調用JavaScript

 

2. JavaScript 調用 Objective-C

JavaScript,簡單的封裝一下,‘Native’爲事先在Objective-C註冊注入的js對象

JavaScript調用

Objective-C實現

 

 

注:本文除了第三種方法以外,前兩種JavaScript交互方法都和Android開發兼容,僅僅是api略不一樣。

demo地址: https://github.com/shaojiankui/iOS-WebView-JavaScript

相關文章
相關標籤/搜索