js –> native
目前,截止至iOS7崔步,iOS原生并沒有提供js直接調(diào)用native的方式稳吮,只能通過UIWebView相關(guān)的UIWebViewDelegate協(xié)議的
1
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
方法來做攔截,并在這個(gè)方法中井濒,根據(jù)url的協(xié)議或特征字符串來做調(diào)用方法或觸發(fā)事件等工作灶似,如
* 方法的返回值是BOOL值。
* 返回YES:表示讓瀏覽器執(zhí)行默認(rèn)操作瑞你,比如某個(gè)a鏈接跳轉(zhuǎn)
* 返回NO:表示不執(zhí)行瀏覽器的默認(rèn)操作酪惭,這里因?yàn)橥ㄟ^url協(xié)議來判斷js執(zhí)行native的操作,肯定不是瀏覽器默認(rèn)操作者甲,故返回NO
* /
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [request URL];
if ([[url scheme] isEqualToString:@"callFunction") {
//調(diào)用原生方法
return NO;
} else if (([[url scheme] isEqualToString:@"sendEvent") {
//觸發(fā)事件
return NO;
} else {
return YES;
}
}
雖然通過這個(gè)方式春感,js調(diào)用native是異步的,但是效率還是很高虏缸,我通過在js調(diào)用端鲫懒,把time傳入navive然后相減的方式計(jì)算纺铭,平均只有5ms的時(shí)間間隔。
如何觸發(fā)這個(gè)方法攔截
最最簡單且實(shí)用的方法莫過于用js創(chuàng)建一個(gè)隱藏的iframe設(shè)置src了刀疙,代碼:
1
2
3
4
5
6
7
8
function js2native(){
var iframe = document.createElement("iframe");
iframe.src="callFunction://";
iframe.style.display = 'none';
document.body.appendChild(iframe);
iframe.parentNode.removeChild(iFrame);
iframe = null;
}
通過查看phoneGap源碼的iOSExec方法舶赔,還有使用XMLHttpRequest或修改hash的方式來觸發(fā)方法攔截,但是因?yàn)橛衎ug或其他原因谦秧,不推薦竟纳。
native –> js
native調(diào)用js非常簡潔方便,只需要
1
[webView stringByEvaluatingJavaScriptFromString:@"alert('hello world!')"];
并且該方法是同步的疚鲤。
調(diào)試
雖然現(xiàn)在能直接用Safari的開發(fā)模式直接查看模擬器中的webView頁面锥累,但是經(jīng)過親自嘗試,最想要的也是最重要的js調(diào)試集歇,還是不支持桶略,不能進(jìn)行js斷點(diǎn)調(diào)試,還是要依賴console來弄……當(dāng)然css樣式調(diào)試支持的不錯(cuò)诲宇。
2014-04-09 update: 昨天發(fā)現(xiàn)Safari是可以對模擬器中的webView頁面進(jìn)行js斷點(diǎn)調(diào)試的际歼,之前是因?yàn)槲覜]有設(shè)置啟用所有斷點(diǎn)……
可以在模擬器進(jìn)入webView頁面后,打開Safari姑蓝,然后在 開發(fā)->iPhone simulator 菜單下進(jìn)行頁面選擇鹅心,進(jìn)入調(diào)試。
相關(guān)資料
唐巧-關(guān)于UIWebView和PhoneGap的總結(jié)
Github上的WebViewJavascriptBridge項(xiàng)目
大名鼎鼎的phonegap
轉(zhuǎn)載自:http://sjpsega.com/blog/2014/03/08/js-communicate-with-native-in-iOS/