app1.js 5.88 KB
/**
 * Created by DEV005 on 2017/4/13.
 */

function  XnAppNative(options) {
    "use strict";
    if (window.WebViewJavascriptBridge) { return }

    var messagingIframe;
    var sendMessageQueue = [];
    var receiveMessageQueue = [];
    var messageHandlers = {};

    var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme';
    var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__';

    var responseCallbacks = {};
    var uniqueId = 1;
    var flag = true;

    function _createQueueReadyIframe(doc) {
        messagingIframe = doc.createElement('iframe');
        messagingIframe.style.display = 'none';
        doc.documentElement.appendChild(messagingIframe);
    }

    function init(messageHandler) {
        if (WebViewJavascriptBridge._messageHandler) {
            throw new Error('WebViewJavascriptBridge.init called twice')
        }
        WebViewJavascriptBridge._messageHandler = messageHandler;
        var receivedMessages = receiveMessageQueue;
        receiveMessageQueue = null;
        for (var i=0; i<receivedMessages.length; i++) {
            _dispatchMessageFromObjC(receivedMessages[i]);
        }
    }

    function send(data, responseCallback) {
        _doSend({ data:data }, responseCallback);
    }

    function registerHandler(handlerName, handler) {
        messageHandlers[handlerName] = handler;
    }

    function callHandler(handlerName, data, responseCallback) {
        _doSend({ handlerName:handlerName, data:data }, responseCallback);
    }

    function _doSend(message, responseCallback) {
        if (responseCallback) {
            var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime();
            responseCallbacks[callbackId] = responseCallback;
            message['callbackId'] = callbackId;
        }
        sendMessageQueue.push(message);
        messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
    }

    function _fetchQueue() {
        var messageQueueString = JSON.stringify(sendMessageQueue);
        sendMessageQueue = [];
        return messageQueueString;
    }

    function _dispatchMessageFromObjC(messageJSON) {
        setTimeout(function _timeoutDispatchMessageFromObjC() {
            var message = JSON.parse(messageJSON);
            var messageHandler;

            if (message.responseId) {
                var responseCallback = responseCallbacks[message.responseId];
                if (!responseCallback) { return; }
                responseCallback(message.responseData);
                delete responseCallbacks[message.responseId];
            } else {
                var responseCallback;
                if (message.callbackId) {
                    var callbackResponseId = message.callbackId;
                    responseCallback = function(responseData) {
                        _doSend({ responseId:callbackResponseId, responseData:responseData });
                    }
                }

                var handler = WebViewJavascriptBridge._messageHandler;
                if (message.handlerName) {
                    handler = messageHandlers[message.handlerName]
                }

                try {
                    handler(message.data, responseCallback)
                } catch(exception) {
                    if (typeof console != 'undefined') {
                        console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", message, exception)
                    }
                }
            }
        })
    }

    function _handleMessageFromObjC(messageJSON) {
        if (receiveMessageQueue) {
            receiveMessageQueue.push(messageJSON);
        } else {
            _dispatchMessageFromObjC(messageJSON);
        }
    }

    window.WebViewJavascriptBridge = {
        init: init,
        send: send,
        registerHandler: registerHandler,
        callHandler: callHandler,
        _fetchQueue: _fetchQueue,
        _handleMessageFromObjC: _handleMessageFromObjC
    };

    var doc = document;
    _createQueueReadyIframe(doc);
    var readyEvent = doc.createEvent('Events');
    readyEvent.initEvent('WebViewJavascriptBridgeReady');
    readyEvent.bridge = WebViewJavascriptBridge;
    doc.dispatchEvent(readyEvent);


    var callAppMethod = function(methodName,callback,data){
        if (window.WebViewJavascriptBridge) {
            connectWebViewJavascriptBridge(WebViewJavascriptBridge,methodName,callback)
        } else {
            document.addEventListener('WebViewJavascriptBridgeReady', function() {
                connectWebViewJavascriptBridge(WebViewJavascriptBridge,methodName,callback)
            }, false)
        }
        function connectWebViewJavascriptBridge(bridge,methodName,callback) {
            if(flag){
                bridge.init(function(methodName, callback) {});
                flag = false;
            }
            bridge.callHandler(methodName,data,function(response) {
                callback(response);
            })

        }
    };



    "use strict";
    var options={

    }

    var appNative=new Object;
    appNative.version="1.0.0";

    appNative.init=function () {
        return _name;
    };
    return appNative;
}


(function( window, undefined ) {
    // 构造 jQuery 对象
    var xnAppNative = (function() {
        var xnAppNative = function( selector, context ) {
            return new xnAppNative.fn.init( selector, context, rootjQuery );
        };
        // 一堆局部变量声明
        xnAppNative.fn = xnAppNative.prototype = {
            constructor: xnAppNative,
            init: function( selector, context, rootjQuery ) {
                console.log(11111111111)
            }
            // 一堆原型属性和方法
        };
        xnAppNative.fn.init.prototype = xnAppNative.fn;

        xnAppNative.extend = xnAppNative.fn.extend = function() {};
        xnAppNative.extend({
            // 一堆静态属性和方法
        });
        return xnAppNative;
    })();
    // 省略其他模块的代码 ...
    window.xnAppNative = xnAppNative;
})( window);