官方地址:https://github.com/marcuswestin/WebViewJavascriptBridge
用于在WKWebViews,UIWebViews和WebViews中的Obj-C和JavaScript之間發送消息的iOS / OSX橋接器。
一、安裝
(1)使用CocoaPods安裝
`pod 'WebViewJavascriptBridge', '~> 2.0'`
(2)手動安裝
拖拽WebViewJavascriptBridge文件到工程之中
在出現的對話框中,取消選中“將項目復制到目標組的文件夾”,然后選擇“為任何文件夾創建組”
二、使用
(1)導入頭文件并聲明屬性
//導入頭文件#import "WebViewJavascriptBridge.h"http://聲明屬性@property WebViewJavascriptBridge* bridge;
(2)為(WKWebView, UIWebView, WebView)實例化WebViewJavascriptBridge
self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView];
(3)在Objective-C中注冊處理,并調用JS處理
/* *Objective-C*///注冊處理[self.bridge registerHandler:@"ObjC Echo" handler:^(id data, WVJBResponseCallback responseCallback) {? ? NSLog(@"ObjC Echo called with: %@", data);? ? responseCallback(data);}];//調用處理[self.bridge callHandler:@"JS Echo" data:nil responseCallback:^(id responseData) {? ? NSLog(@"ObjC received response: %@", responseData);}];
(4)復制并粘貼setupWebViewJavascriptBridge方法到JS中
/*
*JS
*/functionsetupWebViewJavascriptBridge(callback){if(window.WebViewJavascriptBridge){returncallback(WebViewJavascriptBridge);}if(window.WVJBCallbacks){returnwindow.WVJBCallbacks.push(callback);}window.WVJBCallbacks=[callback];varWVJBIframe=document.createElement('iframe');WVJBIframe.style.display='none';WVJBIframe.src='https://__bridge_loaded__';document.documentElement.appendChild(WVJBIframe);setTimeout(function(){document.documentElement.removeChild(WVJBIframe)},0)}
(5)最后,調用setupWebViewJavascriptBridge方法,使用bridge注冊處理,并調用Objective-C處理
/*
*JS
*/setupWebViewJavascriptBridge(function(bridge){/* Initialize your app here *///注冊處理bridge.registerHandler('JS Echo',function(data,responseCallback){console.log("JS Echo called with:",data)responseCallback(data)})//調用處理bridge.callHandler('ObjC Echo',{'key':'value'},functionresponseCallback(responseData){console.log("JS received response:",responseData)})})
三、自動引用計數(ARC)
這個庫依賴于ARC,所以如果你在你的項目中使用ARC,一切正常。但是如果你的項目沒有ARC支持,一定要做下一步:
1)在Xcode項目中打開項目設置 - >'Build Phases'
2)展開'Compile Sources'找到所有屬于這個庫的.m文件,請注意此列表中每個源文件前面的'Compiler Flags'
3)為每個文件添加'-fobjc-arc'
現在所有的WVJB文件將被ARC支持編譯
四、API參考
Objective-C API
//為web視圖創建一個javascript bridge[WebViewJavascriptBridge bridgeForWebView:(WKWebVIew/UIWebView/WebView*)webview
//注冊一個名為"handlerName"的處理之后,javascript可以使用WebViewJavascriptBridge.callHandler調用這個處理[bridge registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler]
//調用名為handlerName的javascript處理[bridge callHandler:(NSString*)handlerName data:(id)data]//responseCallback的block,響應javascript的處理[bridge callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)callback]
//(可選)如果需要響應Web視圖的生命周期事件,請設置WKNavigationDelegate / UIWebViewDelegate[bridge setWebViewDelegate:(id)webViewDelegate]
//不安全。通過禁用setTimeout安全檢查來加快橋消息傳遞。只有在您不調用任何JavaScript彈出框功能(警報,確認和提示)時,才能安全地禁用此安全檢查。如果您從橋接的JavaScript代碼調用任何這些函數,該應用程序將掛起[bridge disableJavscriptAlertBoxSafetyTimeout]
Javascript API
//注冊一個名為"handlerName"的處理之后,Objective-C可以使用callHandler: data:或callHandler: data: responseCallback:調用這個處理bridge.registerHandler("handlerName",function(responseData){...})
//調用名為handlerName的Objective-C處理bridge.callHandler("handlerName",data)//responseCallback的函數,響應Objective-C的處理bridge.callHandler("handlerName",data,functionresponseCallback(responseData){...})
//調用bridge.disableJavscriptAlertBoxSafetyTimeout()方法和Objective-C中[bridge disableJavscriptAlertBoxSafetyTimeout]具有與調用相同的效果bridge.disableJavscriptAlertBoxSafetyTimeout()