? 后天就要去北京出差了,據(jù)說那邊的項目主要是與網(wǎng)頁交互,所以就簡單的研究了一下js與iOS的交互。
其交互方式有很多種
一、native(app)通過UIWebView的代理方法攔截url scheme判斷是否是我們需要攔截處理的url及其所對應(yīng)的要處理的邏輯(可以實現(xiàn)對網(wǎng)頁的返回、前景、刷新),比較通用和簡單。
self.webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
self.webView.delegate = self;
[self.webView setUserInteractionEnabled:YES];//是否支持交互
[self.webView setOpaque:NO];//opaque是不透明的意思
[self.webView setScalesPageToFit:YES];//自動縮放以適應(yīng)屏幕
[self.view addSubview:self.webView];
if (sender.tag == 101) {
// 返回(點擊頁面才會有返回)
[self.mWebView goBack];
}else if (sender.tag == 102) {
// 前進(jìn)(點擊過的頁面)
[self.mWebView goForward];
}else {
// 刷新頁面
[self.mWebView reload];
}
二、iOS7之后出了JavaScriptCore.framework用于與JS交互,通過JSContext調(diào)用JS代碼的方法:
1、直接調(diào)用JS代碼
2、在ObjC中通過JSContext注入模型,然后調(diào)用模型的方法
通過evaluateScript:方法就可以執(zhí)行JS代碼
三、React Native (不是很了解,只知道是Facebook的,能編譯很多的語音,兼容性很強,可移植也很強,有很多很好的原生控件,有興趣的朋友可以了解一下)
四、WebViewJavascriptBridge(第三方)是基于方式一封裝的(主要是兩個回調(diào)函數(shù))。
在iOS端:1.self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
鏈接iOS與js,self.webView就是展示你用來顯示需要交換頁面的UIWebView
2.[self.bridge registerHandler:@"testJavascriptHandler" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"ObjC Echo called with: %@", data);
// 反饋給JS
responseCallback(data);
}];
// 在JS中如果調(diào)用了bridge.send(),那么將觸發(fā)OC端_bridge初始化方法中的回調(diào)。
// 在JS中調(diào)用了bridge.callHandler('testJavascriptHandler'),它將觸發(fā)OC端注冊的同名方法
// oc 同理
// JS主動調(diào)用OjbC的方法
// 這是JS會調(diào)用ObjC Echo方法,這是OC注冊給JS調(diào)用的
// JS需要回調(diào),當(dāng)然JS也可以傳參數(shù)過來。data就是JS所傳的參數(shù),不一定需要傳
// OC端通過responseCallback回調(diào)JS端,JS就可以得到所需要的數(shù)據(jù)
3.[self.bridge callHandler:@"sayHello" data:@{@"hello": @"你好"} responseCallback:^(id responseData) {
NSLog(@"回調(diào)結(jié)果: %@", responseData);
}];
直接調(diào)用JS端注冊的HandleName,一定注意此次的名字一定要與js端的相同。
js調(diào)用時也一樣
在JS端:
1.Copy and paste setupWebViewJavascriptBridge into your JS:
(此段代碼為固定格式,直接放在js端就行)
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
后面幾步與iOS端一樣
如有錯誤,望請指出。