oc混合开发

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

你可能感兴趣的:(oc混合开发)