最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 跨端小程序如何识别当前的容器(APP)

    正文概述 掘金(亦止辰)   2021-03-21   502

    1.index.js

    import detect from './detect';
    console.log(detect.app.name);
    

    2.detect.js

    import CheckApp from "./checkApp";
    var detect = {},
        NA_VERSION = "-1",
        userAgent = navigator.userAgent || "",
        appVersion = navigator.appVersion || "",
        vendor = navigator.vendor || "",
        external = window.external,
        re_msie = /\b(?:msie |ie |trident\/[0-9].*rv[ :])([0-9.]+)/;
    
    // var CheckApp = require('./checkApp');
    
    function toString(object) {
        return Object.prototype.toString.call(object);
    }
    
    function isObject(object) {
        return toString(object) === "[object Object]";
    }
    
    function isFunction(object) {
        return toString(object) === "[object Function]";
    }
    
    function each(object, factory, argument) {
        for (var i = 0, b, l = object.length; i < l; i++) {
            if (factory.call(object, object[i], i) === false) {
                break;
            }
        }
    }
    
    // 操作系统信息识别表达式
    var OS = [
        ["wp",
            function(ua) {
                if (ua.indexOf("windows phone ") !== -1) {
                    return /\bwindows phone (?:os )?([0-9.]+)/;
                } else if (ua.indexOf("xblwp") !== -1) {
                    return /\bxblwp([0-9.]+)/;
                } else if (ua.indexOf("zunewp") !== -1) {
                    return /\bzunewp([0-9.]+)/;
                }
                return "windows phone";
            }
        ],
        ["ios",
            function(ua) {
                if (/\bcpu(?: iphone)? os /.test(ua)) {
                    return /\bcpu(?: iphone)? os ([0-9._]+)/;
                } else if (ua.indexOf("iph os ") !== -1) {
                    return /\biph os ([0-9_]+)/;
                } else {
                    return /\bios\b/;
                }
            }
        ],
        ["yunos", /\baliyunos ([0-9.]+)/],
        ["android", /\bandroid[\/\- ]?([0-9.x]+)?/],
        ["linux", "linux"]
    ];
    
    var BROWSER = [
        ["qq", /\bm?qqbrowser\/([0-9.]+)/],
        // 后面会做修复版本号,这里只要能识别是 IE 即可。
        ["ie", re_msie],
        ["chrome", / (?:chrome|crios|crmo)\/([0-9.]+)/],
        // UC 浏览器,可能会被识别为 Android 浏览器,规则需要前置。
        ["uc",
            function(ua) {
                if (ua.indexOf("ucbrowser/") >= 0) {
                    return /\bucbrowser\/([0-9.]+)/;
                } else if (/\buc\/[0-9]/.test(ua)) {
                    return /\buc\/([0-9.]+)/;
                } else if (ua.indexOf("ucweb") >= 0) {
                    return /\bucweb[\/]?([0-9.]+)?/;
                } else {
                    return /\b(?:ucbrowser|uc)\b/;
                }
            }
        ],
        // Android 默认浏览器。该规则需要在 safari 之前。
        ["android",
            function(ua) {
                if (ua.indexOf("android") === -1) {
                    return;
                }
                return /\bversion\/([0-9.]+(?: beta)?)/;
            }
        ],
        ["safari", /\bversion\/([0-9.]+(?: beta)?)(?: mobile(?:\/[a-z0-9]+)?)? safari\//],
        // 如果不能被识别为 Safari,则猜测是 WebView。
        ["webview", /\bcpu(?: iphone)? os (?:[0-9._]+).+\bapplewebkit\b/]
    ];
    
    /**
     * UserAgent Detector.
     * @param {String} ua, userAgent.
     * @param {Object} expression
     * @return {Object}
     *    返回 null 表示当前表达式未匹配成功。
     */
    function detector(name, expression, ua) {
        var expr = isFunction(expression) ? expression.call(null, ua) : expression;
        if (!expr) {
            return null;
        }
        var info = {
            name: name,
            version: NA_VERSION,
            codename: ""
        };
    
        // 增减判断设备是phone还是pad的逻辑(android 和 ios)
        if (name === 'android') {
            //https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
            info.type = (ua.indexOf('Mobi') > -1 ? 'phone' : 'pad');
        }
    
        if (name === 'ios') {
            info.type = (ua.indexOf('iPhone') > -1 ? 'phone' : 'pad');
        }
    
        var t = toString(expr);
        if (expr === true) {
            return info;
        } else if (t === "[object String]") {
            if (ua.indexOf(expr) !== -1) {
                return info;
            }
        } else if (isObject(expr)) { // Object
            if (expr.hasOwnProperty("version")) {
                info.version = expr.version;
            }
            return info;
        } else if (expr.exec) { // RegExp
            var m = expr.exec(ua);
            if (m) {
                if (m.length >= 2 && m[1]) {
                    info.version = m[1].replace(/_/g, ".");
                } else {
                    info.version = NA_VERSION;
                }
                return info;
            }
        }
    }
    
    var na = {
        name: "na",
        version: NA_VERSION
    };
    // 初始化识别。
    function init(ua, patterns, factory, detect) {
        var detected = na;
        each(patterns, function(pattern) {
            var d = detector(pattern[0], pattern[1], ua);
            if (d) {
                detected = d;
                return false;
            }
        });
        factory.call(detect, detected.name, detected.version);
    }
    
    /**
     * 解析 UserAgent 字符串
     * @param {String} ua, userAgent string.
     * @return {Object}
     */
    var parse = function(ua) {
        ua = (ua || "").toLowerCase();
        var d = {};
    
        init(ua, OS, function(name, version) {
            var v = parseFloat(version);
            d.os = {
                name: name,
                version: v,
                fullVersion: version
            };
            d.os[name] = v;
        }, d);
    
        init(ua, BROWSER, function(name, version) {
            var v = parseFloat(version);
            d.browser = {
                name: name,
                version: v,
                fullVersion: version,
            };
            d.browser[name] = v;
        }, d);
        return d;
    };
    
    detect = parse(userAgent + " " + appVersion + " " + vendor);
    detect.parse = parse;
    
    detect._checkApp = CheckApp;
    detect.app = detect._checkApp(userAgent);
    
    module.exports = detect;
    
    

    3.checkApp.js

    /**
     * 解析 UserAgent 字符串
     * @param {String} ua, userAgent string.
     * @return {Object}
     *
     * "app": {
     *      "is": true,
     *      "name": "TB|TM|JU|LW|DD|ET|XM|...",  // 详见 http://velocity.alibaba-inc.com/projects/cross-end-web/wiki/App-ua
     *      "version": "9.0"
     *  }
     */
    var checkApp = function(ua) {
      var app = {
        is: false,
        name: "",
        version: ""
      };
      var aliApp = ua.match(/AliApp\S+\b\)/ig);
      app.is = /(T-UA)|(TBIOS)|(WindVane)|(AliApp)/i.test(ua) ? true : false;
    
      try {
        app.name = aliApp ? aliApp[0].match(/\(\w+\-*\w*/)[0].split("(")[1] : "";
        app.version = aliApp ? aliApp[0].match(/(\d+\.*)+/ig)[0] : "";
      } catch (_) {}
      return app;
    };
    
    module.exports = checkApp;
    
    

    起源地下载网 » 跨端小程序如何识别当前的容器(APP)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元