1,需要拦截请求加入cordova.js
我们公司的cordova项目是需要拦截webView请求 然后添加cordova.js 文件,在CDVURLProtocol 类的startLoading方法里进行拦截.拦截请求重定向百度有很多可以参考.然后判断网络请求中url中含有corodva.js 的话 就添加
if([[url absoluteString] rangeOfString:@"/cordova.js"].location!=NSNotFound){
NSLog(@"----cordova.js----");
NSString *path=[[NSBundle mainBundle] pathForResource:@"cordova" ofType:@"js"];
if(!path) {
[self sendResponseWithResponseCode:401 data:nil mimeType:nil];//重要
return;
}
CFStringRefpathExtension = (__bridge_retainedCFStringRef)[pathpathExtension];
CFStringRef type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, NULL);
CFRelease(pathExtension);
// The UTI can be converted to a mime type:
NSString *mimeType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass(type, kUTTagClassMIMEType);
if(type !=NULL)
CFRelease(type);
// 加载替代数据
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建可缓存的响应
// NSURLResponse *response =[[NSURLResponse alloc]
// initWithURL:super.request.URL
// MIMEType:mimeType
// expectedContentLength:[data length]
// textEncodingName:nil];
[self sendResponseWithResponseCode:200 data:data mimeType:mimeType];
return;
}
不过对于不同公司可能设置不同,如果cordova插件没法调用的话可以看看
2,网页端添加一个空的iframe,iframe的src则指向gap://ready
正常的网页端向客户端调取流程应该是这样的
点击webviewH5触发事件
点击H5 plugin api
-->JSmethod execProxy
--> JSmethod cordovaExec
--> JSmethod iOSExec 配置生成事件唯一标示JSONString(successCallback, failCallback, service, action, actionArgs)
--> JSmethod massageArgsJsToNative
--> JSmethod pokeNative()
--> NativeMethod shouldStartLoadWithRequest (gap)
--> NativeMethod fetchCommandsFromJs
--> NativeMethod evaluateJavaScript
:js(cordova.require('cordova/exec').nativeFetchMessages())
--> JSmethod execProxy.nativeFetchMessages
--> 回调通知NativeMethod evaluateJavaScript completionHandler
--> NativeMethod enqueueCommandBatch
--> NativeMethod 转换成QHInvokedUrlCommand
--> NativeMethod- (BOOL)execute:(QHInvokedUrlCommand*)command
--> NativeMethod getCommandInstance registerPlugin init对应的object
--> NativeMethod 转换成QHPlugin
--> NativeMethod runtime 调用方法
--> 调用Native的plugin的Method方法。
如果有空的iframe的话 src指向gap://ready
decidePolicyForNavigationAction方法一直返回的url是gap://ready.正常的话是 url开始为gap://ready,进到图中所示的判断中,然后加载fetchCommandsFromJs方法,加载这段cordova.require('cordova/exec').nativeFetchMessages() js 但是如果iframe是空的话就会一直返回js加载失败,报错 js加载发生异常!
但是神奇的是安卓可以正常加载,这也是我纳闷的一个地方,有谁知道原因的可以评论区留言,共同探讨!