Cordova自定义插件TypeError: cordova.exec is not a function

前言

        这个坑很少有人遇到,墙内墙外都找了不少资料看,几乎没看到同样的问题~_~

背景

        项目有一个需求,结合Cordova和vue开发一个应用,app在离线的情况下启动时,需要首先去加载指定目录的文件读取数据,考虑到Android 6.0后权限时运行时申请赋予的,要加载文件肯定涉及文件存储的操作,所以依葫芦画瓢自定义了个插件(Cordova自定义插件 摸我),在js端访问权限授权的情况。

复盘

先贴我的代码 ,这是js侧访问权限的代码,Android原生的插件已确认没有问题

cordova.exec(success =>{
    
    if ('success' == success) {
        this.initData()
    }else{
        this.$toast('请先开启手机存储权限');
        setTimeout(()=>{
            this.requestPerimission()
        },100)
    }
    
}, fail =>{
    
}, "FileHandler", "requestpermission", [""]); 

再看错误日志

D/SystemWebChromeClient: file:///android_asset/www/static/js/vendor.04fb6f8bbd2e524de801.js: Line 12 : TypeError: cordova.exec is not a function
03-20 16:57:43.558 18085-18085/com.boil.csg I/chromium: [INFO:CONSOLE(12)] "TypeError: cordova.exec is not a function", source: file:///android_asset/www/static/js/vendor.04fb6f8bbd2e524de801.js (12)
D/NetworkManager: toLower : wifi
D/NetworkManager: wifi : wifi
Connection Type: wifi

        而这个问题在有的手机上会有,也有部分手机没有这个问题,这种问题神烦最难调,而且还有点赶时间,萌新的我一头扎进了百度,扎进了bing,扎进了stackFlow,哇靠就是没看到有人贴这个错误,真心在这上面废了好多时间,后面想想还是太年轻,缘木求鱼去了。

解决方案

        cordova.exec is not a function,我花了大部分时间去看这个exec是不是不存在,忽略了Cordova这个家伙是否已经加载好了呢(Cordova 原理详解摸我摸我),验证了下果然...

        为什么没有找到类似的问题呢,原因很简单,我在调用插件做事情的时候,Cordova还没有执行完毕,CordovaWebView还在做loadUrl的操作,Cordova.js应该没有被加载到,所以执行Cordova.exec就出问题了。还是自己的代码不严谨出的问题。

贴下最终解决的方案

document.addEventListener("deviceready", onDeviceReady =>{
    //cordova.exec 执行操作
}, false);

 

你可能感兴趣的:(android,vue)