美文网首页
Hybrid开发 Vue和Native交互

Hybrid开发 Vue和Native交互

作者: 妖苔 | 来源:发表于2019-06-19 10:48 被阅读0次

Native调用H5

  • 双方暂约定方法名称为scanResult('参数')该方法要求传入一个参数,为扫描结果。Native调用代码如下:

      mWebView.evaluateJavascript("javascript:scanResult('扫描结果')", s -> {
          Log.e("xxx", "返回了点啥啊");
      });
    

其中javascript:scanResult('扫描结果')", s -> {Log.e("xxx", "返回了点啥啊")javascript为固定前缀,scanResult为Vue/Js提供的方法,第二个参数为lamd表达式完整写法如下

    webView.evaluateJavascript("javascript:scanResult('扫描结果')", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String s) {
            //处理逻辑
        }
    });

若要将Vue/Js中方法暴露给Native调用需要在Vue/Js中使用mounted组件注入方法具体使用方法如下

    <script type="text/javascript">
    var vm = new Vue({
        el: '#app',
        data: {
            counter: 1
        },
        //Native调用Vue:第二步:注入方法
        mounted() {
            window.scanResult = this.scanResult
        },
         //Native调用Vue:第一步:创建方法
        methods: {
            scanResult (str) {
                alert('zz')
                return "js调用成功"
            }
        }
    });
    vm.$watch('counter', function(nval, oval) {
        alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');
    });
    setTimeout(
        function(){
            vm.counter += 20;
        },10000
    );
    </script>

至此Native则可以通过evaluateJavascript方法调用Vue/Js中方法

H5调用Native

  • 点击H5某个按钮时调用该放方法,约定方法名为getCamera(),由H5主动调用,无参数要求,调用格式为window.Android.getCamera(),格式示意如下:交互所有操作要求挂在到window下,AndroidmWebView.addJavascriptInterface(new JSInterface(), "Android");注入的对象,getCamera()为对象中方法,完成代码如下

      private class JSInterface {
          @JavascriptInterface
          public void preShare(String openUrl, String shareTile, String shareDetails, String shareNetImg) {
              Log.e("xxx", "xxxx" + openUrl + shareDetails + shareDetails);
          }
    
          /*
          点击H5某个按钮时调用该放方法,由H5主动调用,无参数要求调用格式为window.Android.getCamera(),格式示意如下
          交互所有操作要求挂在到window下,Android为" mWebView.addJavascriptInterface(new JSInterface(), "Android");"注入的对象,getCamera()为对象中方法
           */
          @JavascriptInterface
          public void getCamera() {
              requestCamera();
          }
    
          @JavascriptInterface
          public void test() {
              Toast.makeText(BrowserActivity.this, "有这么难吗?", Toast.LENGTH_SHORT).show();
          }
    
      }
    

Native再通过mWebView.addJavascriptInterface(new JSInterface(), "Android");注入,则该Native接口中方法均可在H5中调用。
以上所有内容成立的前提是WebView进行了JS支持等设置。
调用示例

    <div id="app" @click="window.Android.getCamera()" style="font-size:25px;">
      <p style="font-size:25px;">计数器: {{ counter }}</p>
      <button>点我</button>
    </div>

额 好像没法上传文件呢(⊙o⊙)?\

补充:若Native调用Js中某个方法,而该Js方法又调用了Native方法,那么Native调用Js成功而Js调用Native中方法将失败。
解决方法:将Js中调用Native的部分代码单独抽取成一个Js方法。
可能原因:类似Js调用Native,相当于将某个对象注入Window下,相同的Native调用Native可能也是将该方法当成整体对象拿了过来故无法找到Native中方法。

相关文章

网友评论

      本文标题:Hybrid开发 Vue和Native交互

      本文链接:https://www.haomeiwen.com/subject/ayraoqtx.html