Add OS version and device model detection to UA::getBrowserInfo()

This commit is contained in:
Kijin Sung 2020-06-25 15:17:11 +09:00
parent 5a90f97f89
commit 3abaee5e2b
2 changed files with 52 additions and 0 deletions

View file

@ -14,6 +14,18 @@ class UA
protected static $_tablet_cache = array();
protected static $_robot_cache = array();
/**
* Windows version lookup table.
*/
protected static $_windows_versions = array(
'5.1' => 'XP',
'5.2' => 'XP',
'6.0' => 'Vista',
'6.1' => '7',
'6.2' => '8',
'6.3' => '8.1',
);
/**
* Check whether the current visitor is using a mobile device.
*
@ -181,6 +193,8 @@ class UA
'browser' => null,
'version' => null,
'os' => null,
'os_version' => null,
'device' => null,
'is_mobile' => null,
'is_tablet' => null,
'is_webview' => null,
@ -197,18 +211,36 @@ class UA
if ($matches[1] === 'Linux' && strpos($ua, 'Android') !== false)
{
$result->os = 'Android';
if (preg_match('#Android ([0-9\.]+);(?: ([^;]+) Build/)?#', $ua, $matches))
{
$result->os_version = $matches[1];
$result->device = $matches[2] ?: null;
}
}
elseif ($matches[1] === 'iPhone' || $matches[1] === 'iPad' || $matches[1] === 'iPod')
{
$result->os = 'iOS';
if (preg_match('#(i(?:Phone|P[ao]d)); (?:.+?) OS ([0-9_\.]+)#s', $ua, $matches))
{
$result->os_version = str_replace('_', '.', $matches[2]);
$result->device = $matches[1];
}
}
elseif ($matches[1] === 'Macintosh' || $matches[1] === 'OS X')
{
$result->os = 'macOS';
if (preg_match('#OS X ([0-9_\.]+)#', $ua, $matches))
{
$result->os_version = str_replace('_', '.', $matches[1]);
}
}
else
{
$result->os = $matches[1];
if (preg_match('#Windows NT ([0-9\.]+)#', $ua, $matches))
{
$result->os_version = isset(self::$_windows_versions[$matches[1]]) ? self::$_windows_versions[$matches[1]] : $matches[1];
}
}
}

View file

@ -54,6 +54,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('Android', $browser->browser);
$this->assertEquals('4.0', $browser->version);
$this->assertEquals('Android', $browser->os);
$this->assertEquals('4.0.3', $browser->os_version);
$this->assertTrue($browser->is_mobile);
$this->assertTrue($browser->is_tablet);
$this->assertFalse($browser->is_webview);
@ -63,6 +64,8 @@ class UATest extends \Codeception\TestCase\Test
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Linux; Android 4.4.4; One Build/KTU84L.H4) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36');
$this->assertEquals('Android', $browser->browser);
$this->assertEquals('4.4', $browser->version);
$this->assertEquals('4.4.4', $browser->os_version);
$this->assertEquals('One', $browser->device);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_tablet);
$this->assertFalse($browser->is_webview);
@ -72,6 +75,7 @@ class UATest extends \Codeception\TestCase\Test
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36');
$this->assertEquals('Android', $browser->browser);
$this->assertEquals('5.1', $browser->version);
$this->assertEquals('Nexus 5', $browser->device);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_tablet);
$this->assertTrue($browser->is_webview);
@ -91,6 +95,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('Chrome', $browser->browser);
$this->assertEquals('51.0', $browser->version);
$this->assertEquals('Windows', $browser->os);
$this->assertEquals('10.0', $browser->os_version);
$this->assertFalse($browser->is_mobile);
// Linux Chrome
@ -125,27 +130,36 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('IE', $browser->browser);
$this->assertEquals('11.0', $browser->version);
$this->assertEquals('Windows', $browser->os);
$this->assertEquals('10.0', $browser->os_version);
// IE 10 in compatibility mode
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)');
$this->assertEquals('IE', $browser->browser);
$this->assertEquals('10.0', $browser->version);
$this->assertEquals('Windows', $browser->os);
$this->assertEquals('XP', $browser->os_version);
// IE 9
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)');
$this->assertEquals('IE', $browser->browser);
$this->assertEquals('9.0', $browser->version);
$this->assertEquals('Windows', $browser->os);
$this->assertEquals('7', $browser->os_version);
// IE 8 in compatibility mode
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)');
$this->assertEquals('IE', $browser->browser);
$this->assertEquals('8.0', $browser->version);
$this->assertEquals('Windows', $browser->os);
$this->assertEquals('Vista', $browser->os_version);
// iOS Safari
$browser = Rhymix\Framework\UA::getBrowserInfo('iPad: Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3');
$this->assertEquals('Safari', $browser->browser);
$this->assertEquals('5.1', $browser->version);
$this->assertEquals('iOS', $browser->os);
$this->assertEquals('5.1', $browser->os_version);
$this->assertEquals('iPad', $browser->device);
$this->assertTrue($browser->is_mobile);
$this->assertTrue($browser->is_tablet);
@ -154,6 +168,8 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('Chrome', $browser->browser);
$this->assertEquals('19.0', $browser->version);
$this->assertEquals('iOS', $browser->os);
$this->assertEquals('5.1.1', $browser->os_version);
$this->assertEquals('iPhone', $browser->device);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_tablet);
@ -162,6 +178,8 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('Firefox', $browser->browser);
$this->assertEquals('1.0', $browser->version);
$this->assertEquals('iOS', $browser->os);
$this->assertEquals('8.3', $browser->os_version);
$this->assertEquals('iPad', $browser->device);
$this->assertTrue($browser->is_mobile);
$this->assertTrue($browser->is_tablet);
@ -170,6 +188,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('Safari', $browser->browser);
$this->assertEquals('8.0', $browser->version);
$this->assertEquals('macOS', $browser->os);
$this->assertEquals('10.10.2', $browser->os_version);
$this->assertFalse($browser->is_mobile);
// macOS (OS X) Chrome
@ -177,6 +196,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('Chrome', $browser->browser);
$this->assertEquals('41.0', $browser->version);
$this->assertEquals('macOS', $browser->os);
$this->assertEquals('10.10.1', $browser->os_version);
$this->assertFalse($browser->is_mobile);
// macOS (OS X) Firefox