iOS之與JS交互通信


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

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

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

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

1.javascript調用Objective-C

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

javascript代碼:

Objective-C代碼:

2.Objective-C調用javascript


(PS)如果你想去掉webview彈出的alert 中的來自XXX網頁

二、JavaScriptCore && UIWebview >=iOS7

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

合適時機注入交互對象

什么時候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

三、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM