IOS中 使用JavaScriptCore 實現OC與JS的互動
轉: http://www.jianshu.com/p/cdaf9bc3d65d
一、說明
這篇文章記錄自己在研究OC與JS互動中的所得,以及遇到的問題與解決
由於蘋果的稽核時間太漫長,一次稽核不過,那又將進入另一個漫長的稽核期。為了能在開發中方便更新,公司要求在專案中使用HTML5,這樣就涉及到OC與JS的互動,不懂H5,不懂JS。在經過一段時間的摸索之後,將自己的研究記錄下來,以做備忘。
OC與JS的互動實現方式有很多,之前用的比較多的是WebViewJavaScriptBridge,但在IOS7之後,蘋果將JavaScriptCore框架開放。因此,這篇文章不講理論,主要講的是JavaScriptCore的實際使用。
廢話說完了,下面進入正題
二、Demo專案中功能介紹
![](http://upload-images.jianshu.io/upload_images/636965-afd215a2dc41aaa3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Demo首頁
這個demo主要分為了三個部分來:
1.JS Call OC , JS呼叫OC的函式
2.OC Call JS , OC呼叫JS的函式
3.一個繪圖的例子
在做OC與JS互動工作之前,我們需要做些準備工作
1.匯入JavaScriptCore的標頭檔案
#import <JavaScriptCore/JavaScriptCore.h>
2.用webView載入HTML檔案,這裡用的是本地HTML;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.title = @"js call oc";
NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"JSCallOC.html"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]];
[self.webView loadRequest:request];
}
3.在JS互動中,很多事情都是在webView的delegate方法中完成的,通過JSContent建立一個使用JS的環境,所以這裡,我們先將self.content在這裡面初始化;
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//初始化content
self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 列印異常,由於JS的異常資訊是不會在OC中被直接列印的,所以我們在這裡新增列印異常資訊,
self.context.exceptionHandler =
^(JSContext *context, JSValue *exceptionValue)
{
context.exception = exceptionValue;
NSLog(@"%@", exceptionValue);
};
}
三、實際操作中 JS call OC
先來看demo
![](http://upload-images.jianshu.io/upload_images/636965-23e858f667ceddb1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
JS Call OC
這個頁面整個都是通過HTML實現的,
1 計算階乘:在輸入框中輸入一個數字,然後在OC中計算出結果,最後顯示在HTML的頁面上;
2 測試log:點選後,在後臺列印測試資料;
3 OC原生Alert :點選後,彈出OC的提示框;
4 addSubView:點選後,在OC中新增一個View;
5 push to second ViewController :跳轉到下一個介面
總結:以上功能都是在OC獲取HTML中按鈕的點選事件,在後在OC中實現功能
??如何獲取HTML中的點選事件呢??
在HTML中,為一個元素新增點選時間有兩種寫法
<input type="button" value="計算階乘" onclick="native.calculateForJS(input.value);" />
或者
<input type="button" value="測試log" onclick="log('測試');" />
如果是第一種方法,
那麼就要用JSExport協議關聯native的方法,要在webView的delegate裡面新增
// 以 JSExport 協議關聯 native 的方法
self.content[@"native"] = self;
新增完之後,要宣告一個繼承JSExport的協議,協議中宣告供JS使用的OC的方法
@protocol TestJSExport <JSExport>
JSExportAs
(calculateForJS /** handleFactorialCalculateWithNumber 作為js方法的別名 */,
- (void)handleFactorialCalculateWithNumber:(NSNumber *)number
);
- (void)pushViewController:(NSString *)view title:(NSString *)title;
-(void)log:(NSString*)l;
@end
在OC中實現這些方法,這樣就完成了!
如果是第二章方法,則只需要通過block的形式關聯JavaScript function就可以了!
self.context[@"log"] = ^(NSString *str)
{
NSLog(@"%@", str);
};
三、OC呼叫JS
![](http://upload-images.jianshu.io/upload_images/636965-0cfb7494bf73761f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
OC呼叫JS
在這個例子中,介面的所有View都是OC建立的,點選“交給JS處理計算階乘”後,將textfild的資料傳給JS,JS計算完成後在返回來!
這裡面首先要獲取JS裡面的計算函式,在OC中,所有表示JS中物件,都用JSValue來建立,通過objectForKeyedSubscript方法或者直接使用下標的方法獲取JS物件,然後使用callWithArguments方法來執行函式
// 方法一. JSValue *function = [self.context objectForKeyedSubscript:@"factorial"];
// 方法二.
JSValue * function = self.context[@"factorial"];
JSValue *result = [function callWithArguments:@[inputNumber]];
self.showLable.text = [NSString stringWithFormat:@"%@", [result toNumber]];
四、demo之外(慢慢在總結)
1.JS注入
2.在OC中為JS建立物件
......
零碎的補充1:對於JS 函式中,引數中有函式的,在OC中用JSValue接收
// 比如:JS程式碼
function myFunc({"text":"這裡是文字","callbackFun":function(string){alert'string'}});
//OC程式碼中在.h的protocol中宣告JS要呼叫的OC方法
//.h protocol中,函式名稱要和JS中相同,這裡接收的引數為JSValue
JSExportAs
(myFunc,
-(void) myFunc:(JSValue*)value
);
//在.m檔案中,實現myFunc方法
-(void) myFunc:(JSValue*)value{
NSString * text = [value valueForProperty:@"text"];//列印"這裡是文字"
JSValue * func = [value valueForProperty:@"callbackFun"]; //這裡是JS引數中的func;
//呼叫這個函式
[func callWithArguments:@[@"這裡是引數"]];
}
文/brian0419(簡書作者)
原文連結:http://www.jianshu.com/p/cdaf9bc3d65d
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
相關推薦
IOS中 使用JavaScriptCore 實現OC與JS的互動
轉: http://www.jianshu.com/p/cdaf9bc3d65d 一、說明 這篇文章記錄自己在研究OC與JS互動中的所得,以及遇到的問題與解決 由於蘋果的稽核時間太漫長,一次稽核不過,那又將進入另一個漫長的稽核期。為了能在開發中方便更新,公司要求在專案
使用WebViewJavascriptBridge實現OC與JS互動
陳向陽哈 關注 2015.09.29 15:36* 最後編輯於 2015.10.13 09:44 字數 146
iOS 開發 Object-C和JavaScript互動詳解之OC與JS互動在WKWebView中使用
1.OC與JS互動在UIWebView中使用 2. WKWebView的使用詳解 3.OC與JS互動在WKWebView中使用 // // ViewController.m // oc與js互動WKWebView // // Cr
OC與JS互動之JavaScriptCore
JavaScriptCore初探 在iOS7之前,原生應用和Web應用之間很難通訊。如果你想在iOS裝置上渲染HTML或者執行JavaScript,你不得不使用UIWebView。iOS7引入了JavaScriptCore,功能更強大,使用更簡單。 ###JavaScriptCore
OC與JS互動 初體會
第一篇部落格,有點小緊張、小期待,會不會有人看?有也好,沒有也罷,權當自己圖個樂兒,記錄近來學到的知識。閒話少說,進入正題! OC與JS互動的方式:1、使用UIWebView通過攔截Request完成JS調取OC,通過stringByEvaluatingJavaScriptFromString注入JS函式或
使用javaScriptCore實現原生與H5互動
javaScriptCore與原生互動 1、H5調原生: 1》通過代理調原生,並回調(此處用到了jsExportAs): 1.1:代理調原生並傳參給原生:<input type="button" value="計算階乘"onclick="app.
Swift 使用WKWebView 實現Swift 與JS 互動
功能一:刪除京東手機版https://m.jd.com/右上角的登陸按鈕 程式碼如下 import UIKit import WebKit class ViewController2: UIViewController,WKNavigationDelegate { @IBOutlet w
OC與JS互動
第一種:JS給OC傳值,使用JavaScriptCore.framework。 oc 程式碼 #import <JavaScriptCore/JavaScriptCore.h> - (void) webViewDidFinishLoad:(UIWebView *)webView{
OC 與 JS 互動遇到的坑
呼叫互動方法的時機不對。當我們在- (void)viewDidLoad中注入JS程式碼之後,如果頁面發生了重定向,此時web頁面的JS已經發生了變化,而- (void)viewDidLoad方法只會執行一次,所以不再是之前我們注入過的那些JS了,此時再呼叫本地方法自然就失效了。 如果我們在- (void)w
OC與JS互動 -- 原生
本文只是介紹簡單的OC與JS互動 一、OC呼叫JS <html> <header> <meta http-equiv="Content-Type" content="text/html"; chars
iOS webView的高階用法之JS互動,js與oc的相互呼叫(JavaScriptCore)
重要的事情放前面 github地址:https://github.com/horisea/JSCallOCTest 歡迎star 前言:說起JS互動,很多童鞋會黯然色變,感覺很高深的樣子。大部分小夥伴只知道一種,哪一種我也說說吧。 1.在webView中將要
iOS OC與JS的互動(WebViewJavascriptBridge實現)
在開發的過程中,我們會遇到原生app與web的互動,除了用WebView載入HTML5檔案顯示外,還可能需要和WebView進行互動,例如點選WebView上面的按鈕呼叫原生OC的函式方法,上一章總結了JavaScriptCore的用法,這一章我們來學習另一種方
iOS 開發中OC 與 JS的互動
iOS原生應用和web頁面的互動有iOS7之後的JavaScriptCore、攔截協議、第三方框架WebViewJavaScriptBridge、iOS8之後的WKWebView幾種方法,這一章我們主要講解JavaScriptCore和攔截協議這兩種辦法。WebViewJ
IOS應用通過UIWEBVIEW實現與JS互動
眾所周知,蘋果商店的稽核是不允許應用載入外部可執行檔案的。即如果你想要給APP增加功能就需要修改程式碼增加新功能的程式碼後重新上傳至蘋果商店,經過漫長的稽核之後再上線。那麼有沒有辦法繞過這個步驟去動態的新增新功能呢?答案是有的。我們可以通過擁有歷史悠久的javascrip
iOS中原生APP與JS互動 之 WebViewJavascriptBridge 的簡單用法
有時候我們需要跟H5介面做一些簡單的互動功能,這就需要跟JS打交道了。 1、首先初始化一個webview(viewdidload) UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds
iOS與JS互動,OC呼叫JS方法,JS呼叫OC方法,URL解碼
首先 iOS7開始 蘋果公佈了JavaScriptCore.framework 它使得JS與OC的互動更加方便了。 第一步:匯入framework OC 呼叫JS方法 :(一句話即可) -(void)webViewDidFinishLoad:(UIWebV
iOS與JS互動的4種方法
iOS與JS互動的方法: 1.攔截url(適用於UIWebView和WKWebView) 2.JavaScriptCore(只適用於UIWebView,iOS7+) 3.WKScriptMessageHandler(只適用於WKWebView,iOS8+) 4.WebViewJ
Swift WKWebView(二):iOS與js互動
在上一篇中我們介紹了Swift下WKWebView的基本使用方法,下面總結一下iOS與js互動的實現,最終的頁面效果如下圖所示: 其中,js有關程式碼如下: function navButtonAction(name,age){
Android開發之Webview中原生與JS互動
文章目錄 概述 使用場景 互動方式 Java呼叫JS程式碼 JS呼叫Java程式碼 總結 概述 由於手機硬體資源的快速提升,使得采用混合開發的可能性逐漸成為現實並且流行起來。Android開發中
目前iOS與JS互動的方法選擇比對
只是針對目前存在的互動方式做個比對。不會涉及任何實現。如需知道具體的使用。可自行baidu或者Google。 攔截協議 攔截協議是最簡單的互動方式,在Android端和iOS端直接攔截,可以統一web前端的程式碼。web前端通過在連結中帶上引數。比如: 88gongxiang: