1诗力、加載網(wǎng)頁(yè)頁(yè)面
2、
// Objective-C 語言
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSURL * url = [request URL];
if ([[url scheme] isEqualToString:@"gap"]) {
// 在這里做 js 調(diào) native 的事情
// ....
// 做完之后用如下方法調(diào)回 js
[webView stringByEvaluatingJavaScriptFromString:@"alert('done')"];
return NO;
}
return YES;
}
攔截url,執(zhí)行js調(diào)用native胜宇,操作完成后使用stringByEvaluatingJavaScriptFromString將結(jié)果返回給js。
具體表現(xiàn):
根據(jù)url拆分恢着,執(zhí)行本地oc代碼
nsstring拼接js代碼桐愉,使用stringByEvaluatingJavaScriptFromString方法執(zhí)行js代碼
3、js通知native的方法是讓js發(fā)起一次特殊的網(wǎng)絡(luò)請(qǐng)求掰派,根據(jù)需要自行拼接url从诲,使用加載一個(gè)隱藏的iframe實(shí)現(xiàn)。
不使用document.location方法靡羡,因?yàn)槭褂迷摲绞竭B續(xù)兩個(gè)js調(diào)用native后者會(huì)覆蓋前者的請(qǐng)求盏求。
4、參數(shù)傳遞
最簡(jiǎn)單直接的方式是將參數(shù)拼接在url后面亿眠,放到iframe的src里面碎罚,適用于簡(jiǎn)單的參數(shù)。
實(shí)現(xiàn)方案:
參數(shù)以JSON形式傳遞纳像,進(jìn)行相應(yīng)的編碼荆烈,除去非法字符
5、同步與異步
stringByEvaluatingJavaScriptFromString 方法通知 js竟趾,所以這是一個(gè)異步的調(diào)用憔购。
stringByEvaluatingJavaScriptFromString本身會(huì)返回一個(gè)NSString的執(zhí)行結(jié)果,這是一個(gè)同步調(diào)用岔帽。
也就是說js call native 是一個(gè)異步過程玫鸟,而native call js是一個(gè)同步過程。
6犀勒、How to let the UIWebView get focuesd and show keyboard in the UIWebView?
7屎飘、主線程問題
stringByEvaluatingJavaScriptFromString方法必須在主線程里面執(zhí)行,而執(zhí)行時(shí)間過長(zhǎng)就會(huì)導(dǎo)致主線程ui的卡頓贾费,應(yīng)該盡量讓stringByEvaluatingJavaScriptFromString的執(zhí)行時(shí)間短一點(diǎn)钦购。
項(xiàng)目實(shí)現(xiàn)方式
1、app-plugin.js定義各種不同類型的請(qǐng)求操作(插件)褂萧,拼接className押桃、methodName和params,iframe發(fā)送請(qǐng)求导犹。
2唱凯、webview攔截url羡忘,拆分url,通過PluginUtil解析派發(fā)給不同的類進(jìn)行native操作磕昼。
3壳坪、根據(jù)native執(zhí)行情況,拼接js掰烟,native call js爽蝴,頁(yè)面發(fā)生相應(yīng)改變。