jsbrige 桥

;(function(window, document, adapterName) {

    adapterName = adapterName || "App";

    if (window.RYMJSBRIDGE) {
        return
    }

    var app = new Adapter();
    var slice = Array.prototype.slice;
    var toString = Object.prototype.toString;
    var callindex = 0;


    /**
     * 调用Native接口适配层的构造器
     * @constructor
     */
    function Adapter() {
        var ua = navigator.userAgent.toUpperCase()
        this.IS_ANDROID = ua.indexOf("ANDROID") !== -1;
        this.IS_IOS = ua.indexOf("IPHONE OS") !== -1;
        this.IS_MOCK = ua.indexOf("MOCK") !== -1;
        this.IS_ANYDOOR = ua.indexOf("ANYDOOR") !== -1;
    }

    /**
     * 调用一个Native方法
     * @param {Array.<string>   } name 方法名称
     * @param {}
     */
    Adapter.prototype.call = function(name) {
        // 获取传递给Native方法的参数
        var self = this;
        var args = slice.call(arguments, 1);
        var successCallback = '',
            errorCallback = '',
            item = null,
            returnArg;
        var methodName = name[name.length - 1];
        if (self.IS_ANDROID && self.IS_ANYDOOR) {
            if (window.HostApp) {
                var _str = "",
                    newArguments = [];
                for (var i = 0; i < args.length; i++) {
                    if (typeof args[i] === 'function') {
                        var callbackName = methodName + 'Callback' + callindex;
                        window[callbackName] = args[i];
                        newArguments.push(callbackName);
                        callindex++;
                    } else if (typeof args[i] === 'object') {
                        newArguments.push(JSON.stringify(args[i]));
                    } else {
                        newArguments.push(args[i]);
                    }
                }
                try {
                    HostApp[methodName].apply(window.HostApp, newArguments);
                } catch (e) {
                    var params = slice.call(arguments, 0);
                    setTimeout(function() {
                        app["call"].apply(app, params);
                    }, 300);
                }
            } else {
                var params = slice.call(arguments, 0);
                setTimeout(function() {
                    app["call"].apply(app, params);
                }, 1000);
            }
        } else if (self.IS_IOS && self.IS_ANYDOOR) {
            var newArguments = "",
                tempArgument = [];
            for (var i = 0; i < args.length; i++) {
                //                tempArgument = args[i];
                if (typeof args[i] === 'function') {
                    var callbackName = methodName + 'Callback' + callindex;
                    window[callbackName] = args[i];
                    tempArgument.push(callbackName);
                    callindex++;
                } else {
                    tempArgument.push(args[i]);
                }
            }
            callindex++;
            var iframe = document.createElement("iframe");
            console.log("tempArgument" + tempArgument);
            var _src = 'callnative://' + methodName + '/' + encodeURIComponent(JSON.stringify(tempArgument)) + '/' + callindex;
            console.log(_src);
            iframe.src = _src;
            iframe.style.display = "none";
            document.body.appendChild(iframe);
            iframe.parentNode.removeChild(iframe);
            iframe = null;
        } else {
            console.log("未知环境");
        }
    }

    /**
     * 调用物理返回按钮
     *
     * @return {undefined} 没有返回
     */
    Adapter.prototype.goBack = function() {
        if (this.IS_ANDROID && HostApp && HostApp.goBackOrForward) {
            this.call(["goBackOrForward"], function(res) {
                try {
                    res = JSON.parse(res);
                    var flag = res.result;
                    if (flag == "true") {
                        console.log("success back");
                    } else {
                        console.log("success error");
                    }
                } catch (e) {

                }
            }, function(err) {

            }, -1);
        } else {
            history.back();
        }
    }

    /**
     * 判断选择最新版本,用于判断当前版本是否在某一版本之后
     *
     * @param {string} version1 版本号
     * @param {string} version2 版本号
     * @return {string} 最新的版本号
     */
    Adapter.prototype.getLatestVersion = function(version1, version2) {
        if (version1 === version2) {
            return version1;
        }
        var verArr1 = version1.split(".");
        var verArr2 = version2.split(".");
        var len = verArr1.length > verArr2.length ? verArr1.length : verArr2.length;
        for (var i = 0; i < len; i++) {
            var num1 = parseInt(verArr1[i], 10);
            var num2 = parseInt(verArr2[i], 10);
            if (num1 > num2) {
                return version1;
            } else if (num1 < num2) {
                return version2;
            }
        }
        return version1;
    }

    /**
     * 部分插件的首地址为后台的.do服务,由SDK post参数过去后,由插件后台决定应该跳转到什么地址。
     * 这里模拟了SDK的post操作,一般活动集合页或插件跳转时用到
     *
     * @param {string} version1 版本号
     * @param {string} version2 版本号
     * @return {string} 最新的版本号
     */
    Adapter.prototype.postRedirectUrl = function(url, ticketData, deviceData) {
        var form = document.createElement("form");
        var itemMap = [
            '<input type="hidden" name="SHA1Value" id="SHA1Value" value="' + ticketData.signature + '" />',
            '<input type="hidden" name="signature" id="signature" value="' + ticketData.signature + '" />',
            '<input type="hidden" name="timestamp" id="timestamp" value="' + ticketData.timestamp + '" />',
            '<input type="hidden" name="SSOTicket" id="SSOTicket" value="' + ticketData.SSOTicket + '" />',
            '<input type="hidden" name="deviceId" id="deviceId" value="' + deviceData.deviceId + '" />',
            '<input type="hidden" name="deviceType" id="deviceType" value="' + deviceData.deviceType + '" />',
            '<input type="hidden" name="osVersion" id="osVersion" value="' + deviceData.osVersion + '" />',
            '<input type="hidden" name="anyDoorSdkVersion" id="anyDoorSdkVersion" value="' + deviceData.anyDoorSdkVersion + '" />',
            '<input type="hidden" name="sdkVersion" id="sdkVersion" value="' + deviceData.anyDoorSdkVersion + '" />',
            '<input type="hidden" name="appVersion" id="appVersion" value="' + deviceData.appVersion + '" />',
            '<input type="hidden" name="appId" id="appId" value="' + deviceData.appId + '" />'
        ];
        form.innerHTML = itemMap.join("");
        form.action = url;
        form.method = "POST";
        form.style["display"] = "none";
        document.body.appendChild(form);
        form.submit();
    }

    /**
     * 获取SSOTicket对象的Promise调用
     * @return {Promise} 一个Promise对象
     */
    Adapter.prototype.getSSOTicket = function() {
        var dfd = $.Deferred();
        var self = this;
        self.call(["sendMessage"], function(ticketInfo) {
            var ticket = JSON.parse(ticketInfo);
            if (ticket.SSOTicket) {
                dfd.resolve(ticket);
            } else {
                dfd.reject({});
            }
        }, function(error) {
            dfd.reject(error);
        }, ["getSSOTicket"]);
        return dfd;
    }

    /**
     * 获取设备信息的Promise调用,并缓存
     * @return {Promise} 一个Promise对象
     */
    Adapter.prototype.getDeviceInfo = function() {
        var dfd = $.Deferred();
        var self = this;
        if (self.deviceInfo) {
            setTimeout(function() {
                dfd.resolve(self.deviceInfo);
            }, 16);
            return dfd;
        } else {
            self.call(["sendMessage"], function(deviceData) {
                var deviceInfo = JSON.parse(deviceData);
                self.deviceInfo = deviceInfo;
                dfd.resolve(deviceInfo);
            }, function(error) {
                dfd.reject(error);
            }, ["getDeviceInfo"]);
        }
        return dfd;
    }

    /**
     * 调用宿主登录
     * @param {string} redirectURL
     * @return {undefined}
     */
    Adapter.prototype.getSSOLogin = function(redirectURL) {
        var self = this;
        self.call(["getSSOLogin"], function(msg) {
            console.log(msg);
        }, function(msg) {
            console.log(msg);
        }, {
            redirectURL: redirectURL || ""
        })
    }

    window[adapterName] = window.RYMJSBRIDGE = app;

})(window, document, "App")

猜你喜欢

转载自my.oschina.net/u/2456393/blog/1613895
今日推荐