在不同位置(客户端的终端设备,服务端,项目代码中)判断设备类型(PC、手机、微信等)
判断设备类型的地方有很多,比如在服务端通过 Nginx 或 Apache 等判断,在项目中通过 UserAgent 判断。这个网站上有各种开源的解决方案
现在的移动设备类型比较一致了,只需要判断安卓、苹果两种类型即可。
1. 通过 JavaScript 判断设备类型
对于静态页面构成的项目(比如 GitHub 的个人首页,只能上传静态页面),如果需要判断设备类型,那就得在终端设备上通过 JavaScript 实现。
Navigator 对象 详细文档参考这里:
Navigator 对象表示浏览器的状态和标识,允许 JavaScript 脚本查询其中的信息。其中的 userAgent 属性是一个声明了浏览器用于 HTTP 请求的用户代理头的字符串。下图是 Chrome 浏览器的 console 打印出来的信息:
对比 UserAgent
可以通过判断 navigator.userAgent 里面是否有某些值来判断设备类型。比如苹果手机有 iPhone
字段,Windows 系统的 PC 有 Windows
字段。
- PC 版的 UserAgent 属性:
userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
- 模拟手机版的 UserAgent 属性:
serAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"
具体代码
通过正则表达式,可以把各种想识别的移动设备用 UserAgent 匹配出来。下面的例子(正则的 i 表示忽略大小写)匹配了安卓设备、苹果手机和平板、黑莓设备,如果终端确实是这些设备中的一种,则 is_pc 变量为 true,否则为 false。
var is_mobile = /Android|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);
也可以利用字符串的 indexOf 方法去判断。
2. 通过 Nginx 判断设备类型
如果不同版本的项目是不同的团队做的,那在服务器进行跳转就很合适了。
下面的例子中,在 Nginx 配置文件中增加一个变量 $is_mobile
标志设备类型,通过正则表达式匹配 UserAgent 实现设备类型的判断。
server { listen 80; set $is_mobile no; # 默认电脑版if ($http_user_agent ~* '(Android|iPhone|iPod|iPad)') {set $is_mobile yes;}location / {if ($is_mobile = yes) {root /html/mobile;} else {root /html/mobile;}}
}
3. 项目代码判断设备类型(以 PHP 为例)
PHP 通过 $_SERVER
储存各类客户设备的信息。其中的 $_SERVER['HTTP_USER_AGENT']
是客户设备的 UserAgent。
3.1 通过 UserAgent 判断
PHP 中通过 UserAgent 判断设备类型的方法和 JavaScript 类似,可以用正则表达式简单实现,设备类型匹配到后 $is_mobile
变量为 true:
$is_mobile = preg_match("/Android|iPhone|iPad|iPod|BlackBerry/i", $userAgent);
3.2 通过 HTTP_X_WAP_PROFILE 判断
如果 $_SERVER
中有 HTTP_X_WAP_PROFILE 则一定是移动设备。
$is_mobile = isset ($_SERVER['HTTP_X_WAP_PROFILE']);
3.3 生产环境中往往综合以上方法来判断
function isMobile() { // 如果有 HTTP_X_WAP_PROFILE 则一定是移动设备if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {return true;}// 判断手机发送的客户端标志 UserAgentif (isset ($_SERVER['HTTP_USER_AGENT'])) {return preg_match("/(" . implode('|', $clientkeywords) . ")/i", $_SERVER['HTTP_USER_AGENT'])) ? true : false;}
}
4. 判断是否在微信中
微信的 UserAgent 中有一个标志 MicroMessenger
,通过这个标识可以识别微信。
PHP 示例,在微信中时 $is_wx
为 true:
$is_wx = preg_match("/MicroMessenger/i", $_SERVER['HTTP_USER_AGENT']);
JavaScript 示例,在微信中时 is_wx
为 true:
var is_wx = /MicroMessenger/i.test(navigator.userAgent);
在不同位置(客户端的终端设备,服务端,项目代码中)判断设备类型(PC、手机、微信等)相关推荐
- pc 图片预览放大 端vue_企业为什么需要建设PC+手机微信三合一全网营销的网站呢...
随着信息时代的发展,手机一步步的进入了我们的生活,渐渐的有很多东西都在从pc端过渡到手机端,我们在网购的时候会发现一系列的活动,比如说下载手机客户端就能免减多少钱或者抽奖这样的活动,这样在一定的程度上 ...
- PhotonServer,客户端发送请求给服务端,服务端解析请求,发送回客户端响应,客户端再解析服务端发过来的响应。
1.(客户端发送给服务端)test中的构造参数并且发送 完整代码如下 test.cs using System; using System.Collections; using System.Coll ...
- grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用
上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...
- 附件统一处理starter,含附件客户端和附件服务端
文章目录 附件统一处理starter,可分别作为附件客户端和附件服务端使用 一 关于项目中附件的概述 二 概要描述 三 附件starter功能划分 3.1 附件服务器,真实的存储附件 3.1.1 为前 ...
- http 缓存分为客户端缓存和服务端缓存
http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...
- 解决android客户端上传图片到服务端时,图片损坏的问题
解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...
- Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息
目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...
- Linux Socket 两个客户端通信,服务端作为中转
Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...
- AjaxPro.NET使用,方便的在客户端直接调用服务端方法
(一). 运行效果如下: (二). AjaxPro.NET简介 AjaxPro.NET是一个优秀的Ajax框架, 在实际应用中只要添加其DLL引用并进行简单的配置, 即可以非常方便的在客户端直接调用服 ...
- C# 客户端Client与服务端Server通信
C# 客户端Client与服务端Server通信 服务端配置 服务端要先启动,等待客户端请求连接 客户端配置 客户端测试**(切记一定要先开启服务端,不然不能保证连接)**
最新文章
- 区分BundleVersion和BundleShortVersionString
- centos7安装tomcat8.5
- 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统
- 网页中启动QQ的 XX 命令
- html鼠标变成小手_HTML 点击的链接,也叫超链接
- jvm学习笔记(3)——java对象的内存分配和对象的回收(GC)
- OpenShift 4 - Knative教程(2) 基于Revision/Tag/Traffic实现蓝绿部署和恢复发布
- MySQL | MySQL 数据库系统(四)- 数据库的备份与恢复
- centos下 将(jgp、png)图片转换成webp格式
- Akka Actor Inbox_信箱
- 2017程序员综合素质调研测试
- 虚拟服务器连接监控,方案:浅谈虚拟化平台的监控管理
- LOTO示波器---1G采样率的USB示波器OSCH02的优势
- php7isapi,如何选择PHP套件中ISAPI和FastCGI模式的版本?_护卫神
- 关于java中method.invoked 传入类型不一样的问题
- 调用marathon rest API
- 真实烟雾效果PS笔刷
- 回归分析及实际案例:预测鲍鱼年龄
- 江苏秦淮河清淤工程每天捞出五六吨漂浮物
- NB-IoT信息收集
热门文章
- 荣耀30sr升级鸿蒙,华为荣耀30怎么升级鸿蒙系统?
- linux服务器防攻击脚本,防止服务器被攻击的妙招(推荐)
- 用HTML和CSS3做个鱼,如何使用CSS和D3实现小鱼游动的交互动画(附代码)
- 前端 vue + element + vux
- JVM(2):垃圾收集器与gc
- 不打开Excel文件直接读取数据
- 广义表((a,b),c,d)表头和表尾分别是什么?
- Esp8266(WIFI模块)刷阿里云固件
- 软技能之基本沟通技巧
- 阅读Disentangling and Unifying Graph Convolutions for Skeleton-Based Action Recognition(CVPR2020)