检测服务器上的OS X版本是否为10.4或更早版本

4
根据这里的内容,似乎很难完全正确地获取操作系统版本检测。然而,我正在寻找一个还算不错的方法,可以向使用OS X Tiger及以下版本的用户警告我的产品可能存在的兼容性问题。
我能想到的启发式方法是首先检测操作系统是否为Mac(相对简单),然后将用户代理与正则表达式10[/._][0-4]进行匹配,以便检测Tiger及以下版本。 我并不关心用户代理被修改的情况 - 我想要一个公平的命中率来检测OS X版本,而不是100%的解决方案。
有其他建议/推荐吗?
此外,如果可以指出一个工具,帮助我生成不同OS版本+浏览器版本组合的已知用户代理字符串来测试这个问题,那就更好了。
谢谢!

似乎我误解了你问题的一部分,因为我不是一个Mac用户,你介意发一些样本用户代理字符串吗(例如,在Mac上使用的Safari和Firefox)? - Alix Axel
Safari: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.18 (KHTML, like Gecko) Version/4.0.1 Safari/530.18FF: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 - psychotik
2个回答

1

嗯,我认为在这种情况下,使用最新的php_browscap.ini文件和get_browser()函数是最明智的选择,虽然不确定它是否会告诉您操作系统版本。

编辑:browscap.ini文件还提供了足够的用户代理字符串,如果您仍然决定自己完成所有解析工作。

编辑:似乎也有一个PHP实现不需要您修改php.ini文件

编辑:根据您提供给我的用户代理字符串,这是我认为最好的代码:

if (preg_match('~Mac OS X (.*?);~', $_SERVER['HTTP_USER_AGENT'], $matches) > 0)
{
    $version = preg_replace('~[^0-9]+~', '.', trim($matches[1]));

    if (version_compare($version, '10.5', '>=') === true)
    {
        // ok
    }

    else
    {
        // not ok
    }
}

else
{
    // not Mac OS X
}

这对于Windows客户端版本来说很好用 - 对于Mac OS版本来说就不太适用,除非我无论如何都做类似于我上面写的事情。不过还是谢谢 - 我不知道这个非常巧妙的PHP功能。 - psychotik
实际上,我认为如果您将version_compare()函数与get_browser()返回的版本索引一起使用,与仅使用正则表达式方法相比,您会更少犯错误。 - Alix Axel

0
有其他建议或推荐吗?
是的,不要这样做。也许这不是你想听到的,但你是对的,这最多是不可靠的。
作为天生懒惰的人,我会选择涉及最少工作量的解决方案。那就是在下载链接旁边放置一个大红色文本区域,说明如下:
请注意,此产品仅支持OS X 10.5或更高版本。请勿尝试在早期版本中使用。
然后让用户自己决定。
如果你想进一步保护他们,可以让你的可执行程序在运行时检查它自己所在的盒子。我收集了OS X上的uname,或者类似的工具,可以可靠地获取操作系统版本。如果此时不符合规格,您可以简单地退出并显示类似的消息:
我警告过你。但是,不,你不会听。还是要去下载我,是吧。好吧,现在我根本不会运行,你浪费了所有宝贵的带宽。傻瓜,现在走开。
当然,你的错误消息可能比我的更得体 :-)

不幸的是,我的应用程序甚至不能在Leopard之前加载,因此在第一次运行时显示错误涉及到使用10.4兼容的启动器进行引导,这是更加痛苦的路径。呃!而且我相信靠不太可靠的检测胜过用户的智能。许多运行OS X的人不知道他们正在运行哪个版本。我相信,以粗体红色文本警告他们不要在老于“Foo”的版本上使用此功能,只会使他们感到害怕。 - psychotik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接