1、加載網頁頁面
2、
// Objective-C 語言
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSURL * url = [request URL];
if ([[url scheme] isEqualToString:@"gap"]) {
// 在這里做 js 調 native 的事情
// ....
// 做完之后用如下方法調回 js
[webView stringByEvaluatingJavaScriptFromString:@"alert('done')"];
return NO;
}
return YES;
}
攔截url,執行js調用native,操作完成后使用stringByEvaluatingJavaScriptFromString將結果返回給js。
具體表現:
根據url拆分,執行本地oc代碼
nsstring拼接js代碼,使用stringByEvaluatingJavaScriptFromString方法執行js代碼
3、js通知native的方法是讓js發起一次特殊的網絡請求,根據需要自行拼接url,使用加載一個隱藏的iframe實現。
不使用document.location方法,因為使用該方式連續兩個js調用native后者會覆蓋前者的請求。
4、參數傳遞
最簡單直接的方式是將參數拼接在url后面,放到iframe的src里面,適用于簡單的參數。
實現方案:
參數以JSON形式傳遞,進行相應的編碼,除去非法字符
5、同步與異步
stringByEvaluatingJavaScriptFromString 方法通知 js,所以這是一個異步的調用。
stringByEvaluatingJavaScriptFromString本身會返回一個NSString的執行結果,這是一個同步調用。
也就是說js call native 是一個異步過程,而native call js是一個同步過程。
6、How to let the UIWebView get focuesd and show keyboard in the UIWebView?
7、主線程問題
stringByEvaluatingJavaScriptFromString方法必須在主線程里面執行,而執行時間過長就會導致主線程ui的卡頓,應該盡量讓stringByEvaluatingJavaScriptFromString的執行時間短一點。
項目實現方式
1、app-plugin.js定義各種不同類型的請求操作(插件),拼接className、methodName和params,iframe發送請求。
2、webview攔截url,拆分url,通過PluginUtil解析派發給不同的類進行native操作。
3、根據native執行情況,拼接js,native call js,頁面發生相應改變。