zoukankan      html  css  js  c++  java
  • vue 项目使用JSbrideg.js与app通信

    一、建立JSbrideg.js文件

    var jsBridge = {
        isAndroid: null,
        isIOS: null,
        callHandlerFunc: function(json_data){
            var that = this;
            var res_data = null;
            var nv = null;
            // alert("callHandlerFunc");
            var u = navigator.userAgent;
            that.isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
            that.isIOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端

            if(that.isIOS){
                // alert("ios");
                nv = window.GCWebviewJSBridge;
            }else{
                nv = window.WebViewJavascriptBridge;
            }
            nv.callHandler('getOS', json_data, function (response) {
                res_data = response;
            });
            return res_data;
        },
        initJsBridge: function(readyCallback){
            var that = this;
            var u = navigator.userAgent;
            var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
            var isIOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
            // 注册jsbridge

            function connectWebViewJavascriptBridge(callback) {
                if (isAndroid) {
                    if (window.WebViewJavascriptBridge) {
                        callback(WebViewJavascriptBridge)
                    } else {
                        document.addEventListener(
                            'WebViewJavascriptBridgeReady'
                            , function () {
                                callback(WebViewJavascriptBridge)
                            },
                            false
                        );
                    }
                    return;
                }
                if (isIOS) {
                    // alert("ios2222");
                    if (window.GCWebviewJSBridge) {
                        return callback(GCWebviewJSBridge);
                    }
                    if (window.GCWVJSBCallBacks) {
                        return window.GCWVJSBCallBacks.push(callback);
                    }

                    window.GCWVJSBCallBacks = [callback];
                    var GCWVJSBIframe = document.createElement('iframe');
                    GCWVJSBIframe.style.display = 'none';
                    GCWVJSBIframe.src = 'gcwvjsbscheme://__GC_BRIDGE_LOADED__';
                    document.documentElement.appendChild(GCWVJSBIframe);
                    setTimeout(function() { document.documentElement.removeChild(GCWVJSBIframe)
                    }, 0);
                }
            }
            // 调用注册方法
            connectWebViewJavascriptBridge(function (bridge) {
                if (isAndroid) {
                    bridge.init(function (message, responseCallback) {
                        console.log('JS got a message', message);
                        responseCallback(data);
                    });
                }
                // 只有在这里注册过的方法,在原声代码里才能用callHandler的方式调��?
               //jsbridge_getJsMessage 是与app定义的方法,前端定义好参数传递,通过此方法响应回传给前端想要的数据data
                bridge.registerHandler('jsbridge_getJsMessage', function (data, responseCallback){
                    var jsdata = JSON.parse(data);
                  
                    responseCallback('native 传过来的是 2:' + data);
                });

                readyCallback();
            });
        }
    }
    jsBridge.initJsBridge();

    export  default {
     
        //发送数据给原生Native App
         callHandler(data) {
         let json = data;

        return jsBridge.callHandlerFunc(json);
    },

    }

    二、注意:在man.js注册使用 
    import bridge  from 'components/JSbridge'
    Vue.prototype.$bridge = bridge;
    当需要与app通信获取用户信息,来在前端做路由权限控制时候,不可以在 
    router.beforeEach((to, from, next) => {})中调用,因为此时 页面未加载,
    window.WebViewJavascriptBridge或者
    window.GCWebviewJSBridge 都不存在。
    本人处理是在 App.vue中  
        watch:{//监测
                '$route'(to,from){
                 
                    let app = window.localStorage.getItem('isapp'); //获取是否app进入
                    let useid = window.localStorage.getItem('user_id'); //获取useid
                    if(app){
                        if(!useid){
                            if(to.path == '/' || to.path == '/c' || to.path == '/a' ||  to.path == '/b'){
                                return;
                            }
                     }else{
                       
                          var json= {"type":101,"videoId":""};
                          this.$bridge.callHandler(JSON.stringify(json));向app通信,会在注册方法中得到用户信息,把用户id(用户信息)记录缓存中

                     }
               
                 }}











  • 相关阅读:
    C语言面向对象编程(五):单链表实现(转)
    pthread_barrier_init,pthread_barrier_wait简介(转)
    Linux信号(signal) 机制分析(转)
    Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)
    Linux 多线程环境下 进程线程终止函数小结(转)
    批量杀进程 ps awk grep
    C++中的INL(转)
    gdb调试多进程和多线程命令(转)
    转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
    转:全栈工程师的知识栈列表
  • 原文地址:https://www.cnblogs.com/wenqylh/p/12105787.html
Copyright © 2011-2022 走看看