【问题标题】:Detect screen size and pixel density on the server-side?在服务器端检测屏幕尺寸和像素密度?
【发布时间】:2011-09-29 11:40:03
【问题描述】:

我一直在做一些研究,我想我已经知道答案了,但我想知道是否有任何方法可以在不使用 javascript 或依赖 CSS3 媒体的情况下获得设备的屏幕尺寸和像素密度查询。

基本上,我正在研究如何获得屏幕分辨率和像素密度,以便服务器可以决定在 URI 请求中提供哪个图像。

到目前为止,我还没有发现任何说这甚至是可能的,但我想,嘿,为什么不问呢?

【问题讨论】:

    标签: ruby-on-rails ruby device-detection


    【解决方案1】:

    我不完全同意上述正确答案。实际上,这个答案在许多情况下是正确的……但理论上它不是。向 Web 服务器发出的请求通常包含一个 User-Agent 字段,理论上,该字段可用于识别有关设备屏幕分辨率和属性的信息。

    Web 请求不会首先通过客户端。它们传递给服务器,然后服务器为客户端提供页面,因此服务器首先获取请求......例如,Ruby on Rails 通过动作控制器接收对资源的请求,然后为响应提供页面。

    查看一个示例 UA 解析器,例如:https://github.com/visionmedia/user-agent

    我的计算机发送的示例用户代理是:

      User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like  enter code here`Gecko) Chrome/17.0.963.83 Safari/535.11
    

    我认为通过服务器提供该信息非常有可能很好地猜测我的屏幕分辨率(DPI 等)。当然,您需要一个设备信息表来参考。

    对于移动设备,它变得更加容易。如果 User-Agent 是 iPad 的移动 safari:

      Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML,   like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10
    

    您可以非常确定地知道服务器上的屏幕分辨率。您甚至可以通过该信息了解浏览器的高度和宽度。我怀疑 Android 或 Win Mo 等许多移动设备也是如此。

    总而言之,我同意这样做不切实际,但我也不同意。

    我相信 Facebook 已经承担了一项重大项目,对设备和屏幕分辨率进行分类并将其开源,因为他们在创建 facebook 移动应用程序时遇到了类似的问题,例如他们必须对所有移动浏览器渲染器之间的所有差异进行分类,以便他们可以针对每个案例定制客户端应用程序。也许那个项目可能有必要的信息来做到这一点……理论上。

    【讨论】:

    • 那么您在 3-4 MBP 和两个具有任意显示器大小的桌面上运行 OSX?除非您运行的是 iOS 设备,否则在移动设备上并没有那么容易。嗯。
    • (鉴于现在可用的分辨率过多,我对 iOS 设备的警告不再适用。)
    【解决方案2】:

    Ruby 在服务器端运行——没有从客户端获取信息,它无法知道任何客户端功能。

    【讨论】:

    • 我就是这么想的。我现在正在努力思考漏洞。
    • 我不确定有没有——除非客户告诉你,我不知道怎么做,这意味着通过 JavaScript 获取一些信息(可能)。您也许能够通过用户代理收集微量的信息,但这基本上没用。
    • 欢迎评论反对投票,尤其是正确答案。确定屏幕尺寸和密度必然依赖于客户信息,这是无可争辩的。获取准确信息非常困难
    【解决方案3】:

    对于不可能的事情,看起来 Mobvious 做得不错:

    Mobvious 检测您的应用/网站是否正在被 手机、平板电脑或个人电脑。然后你可以使用 整个应用程序中的这些信息。 (例如 fork 你的前端代码 关于设备类型。有一个用于 Ruby on Rails 的插件 帮助你解决这个问题。)

    https://github.com/jistr/mobvious

    【讨论】:

    • Mobvious 不看屏幕大小,只看用户代理、URL 或 cookie。
    【解决方案4】:

    我遇到了同样的问题,并使用 getter 和 setter 路由作为窗口高度解决了它。如果 $height 变量为 0,则提供 get_heigt.erb,否则提供 index.erb 这是一个单用户应用程序,因此我使用全局变量,对于不同的用户,您必须将该信息保存在 cookie 中。 这里是重要的代码。

    控制器:

    get "/" do
      if $height == 0
        erb :get_height
      else
        erb :index
      end
    end
    
    get "/get_height" do
      erb :get_height
    end
    
    get "/set_height" do
      $height = params[:height]
      redirect "/"
    end
    

    get_height.erb

    <script type="text/javascript">
      function send_message(message) {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
          document.location.reload(true);
        }
        xhttp.open("GET", "http://localhost:4567/" + message + "?height=" + window.innerHeight, true);
        xhttp.send();
      }
    
      send_message('set_height');
    </script>
    

    【讨论】:

      【解决方案5】:

      您可以使用Ahoy。 current_visit 方法包含以下信息。

      当有人访问您的网站时,Ahoy 会创建一个包含大量 有用的信息。

      流量来源 - 引荐来源网址、引荐域名、登录页面、搜索
      关键字位置 - 国家、地区和城市技术 - 浏览器、操作系统、 和设备类型
      utm 参数 - 来源、媒介、术语、内容、 广告系列

      【讨论】:

      • 嗨@Kartikluke,不确定我们是否获得了屏幕分辨率,是否有解决您的问题?
      【解决方案6】:

      不确定构建起来有多现实,但您可以构建一个数据库,它将您可以从服务器端的用户代理获取的特定设备类型映射到已知的屏幕尺寸。它仍然不允许像窗口大小这样的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多