OC WebView 與JavaScript 交互

Native 開發 和 H5 ?誰優誰劣,不在這邊展開討論。目前的開發過程中經常會遇到 原生應用 和web 交互的 需求。接下來我們就聊聊吧。

需求點

首頁 運營一個活動,一個大轉盤,轉呀轉呀,送 各種禮品吶。一個人一天可以轉三次,分享到社交軟件增加一次抽獎機會。


開始

iOS 應用 和web 頁面交互 有以下 幾種方法:

1、挺有名的第三方框架 WebViewJavaScriptBridge

2、iOS7 之后自帶的 JavaScriptCore

3、據說還可以 攔截協議

第一種 和 第三種方法 這里就不詳細介紹了(其實是我不會?。。。?/p>

方法一 作為 一個 知名的第三方框架,肯定會有 其他同行小伙伴介紹的,

傳送門 :http://kittenyang.com/webview-javascript-bridge/

反正我也寫不過他!

我選擇方法二!

因為簡單...

JavaScriptCore框架


JSContext:給JavaScript提供運行的上下文環境

JSValue:JavaScript和Objective-C數據和方法的橋梁

JSManagedValue:管理數據和方法的類

JSVirtualMachine:處理線程相關

JSExport:一個協議,接下來會介紹到

直接看代碼

@interfaceTWWebViewController() <UIWebViewDelegate>

@property(nonatomic,strong)UIWebView*webView;

@property(nonatomic,strong)JSContext*jContext;

@property(nonatomic,strong)TWWebCallBackFunctionHelper*helper;

@end

考慮到 需求經常變化,我用 TWWebCallBackFunctionHelper 統一處理 OC 和 JS 制定的 方法。

- (void)viewDidLoad

{

[superviewDidLoad];

self.helper= [[TWWebCallBackFunctionHelperalloc]init];[self.viewaddSubview:self.webView];[self.webViewloadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:self.webUrl]]];

}

加載 ?webView ?和生成 ?TWWebCallBackFunctionHelper 對象。

#pragma mark - UIWebViewDelegate

- (BOOL)webView:(UIWebView*)webView

shouldStartLoadWithRequest:(NSURLRequest*)request

navigationType:(UIWebViewNavigationType)navigationType

{

returnYES;

}

- (void)webViewDidStartLoad:(UIWebView*)webView

{

if(!_jContext) {

self.jContext=

[webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

self.jContext[@"toApp"] =_helper;

}

}

- (void)webViewDidFinishLoad:(UIWebView*)webView

{

if(!self.webTitle.length) {

//獲取當前頁面的title

NSString*webTitle = [webViewstringByEvaluatingJavaScriptFromString:@"document.title"];

self.title= webTitle;

}

}

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error

{

NSLog(@"didFailLoadWithError = %@", error);

}

在 webView 開始加載的時候 獲取 JavaScript 上下文,和前端的小伙伴約定 toApp 為回調對象名(也有一些叫法 橋梁對象 ),helper 為實現協議對象。

接下來實現 TWWebCallBackFunctionHelper

#import <JavaScriptCore/JavaScriptCore.h>

@protocol webViewJsDelegate<JSExport>

JSExportAs(sharered, -(void)sharered

: (NSString *)url shareContent

: (NSString *)content linkUrl

: (NSString *)lUrl);

@end

JSExport 是 一個 協議, 自定義的 ?webViewJsDelegate 協議 需要遵守此協議。

我們來看下 ?JSExportAs 宏定義

PropertyName ?類似 一個 key,和 對應的 例子里是 sharered,其 對應 要實現的方法是

-(void)sharered:shareContent:linkUrl;其中 'key' 對應的 sharered 需要和 web 約定一致。

//遵守 webViewJsDelegate 協議

@interfaceTWWebCallBackFunctionHelper() <webViewJsDelegate>

@end

@implementationTWWebCallBackFunctionHelper

- (void)sharered:(NSString*)url shareContent:(NSString*)content linkUrl:(NSString*)lUrl

{

//TODO:

//實現業務邏輯,調起 分享 功能

}

@end

好了,差不多就這樣了,在運行過程中,偶現一個bug,點擊分享 按鈕沒有 絲毫 反應,也就是 分享UI組件 沒有 調用起來。這是什么鬼呀!

好吧,直接斷點 調試,-(void)sharered:shareContent:linkUrl 方法是跑到了,也就是 調用 UI 時沒有 反應??紤]是不是線程問題,看了JavaStript 相關定義,果然,“avaScript引擎是單線程運行的”,“JavaStript調用本地方法是在子線程中執行的” ,so...

- (void)sharered:(NSString*)url shareContent:(NSString*)content linkUrl:(NSString*)lUrl

{

//TODO:

//實現業務邏輯,調起 分享 功能

//主線程中去 刷新 UI 等功能

dispatch_async(dispatch_get_main_queue(), ^{

}

});

}

結論

這邊只是簡單的介紹 JavaScriptCore ?最基礎的 用法,很輕量。更多的 JavaScriptCore API 可以去查 蘋果官方文檔。另外在網上搜了下,發現一篇 類似 介紹 OC WebView 與JavaScript 交互 文章,除了 介紹JavaScriptCore ?還介紹了 iOS8之后的WKWebView ?和 第三點 攔截協議,介紹的都 比我 的詳細,貼出來 給大家參考:http://www.lxweimin.com/p/f896d73c670a?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weibo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容