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,页面发生相应改变。