cordova 插件无法调用的问题

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


cordova 插件无法调用的问题_第1张图片

decidePolicyForNavigationAction方法一直返回的url是gap://ready.正常的话是 url开始为gap://ready,进到图中所示的判断中,然后加载fetchCommandsFromJs方法,加载这段cordova.require('cordova/exec').nativeFetchMessages() js  但是如果iframe是空的话就会一直返回js加载失败,报错 js加载发生异常!

但是神奇的是安卓可以正常加载,这也是我纳闷的一个地方,有谁知道原因的可以评论区留言,共同探讨!

你可能感兴趣的:(cordova 插件无法调用的问题)