PHP로 iOS와 Android 구분하는 코드 다루기
PHP로 현재 브라우저가 모바일 장치 중에서 iOS에서 실행되는지 아니면 Android에서 실행되는지 체크하는 코드에 대해 다룹니다. 이는 모바일 환경에서 특정 운영체제에 따른 기능을 제공하거나 iOS 및 Android 사용자에게 다른 경험을 제공하는 웹사이트에서 유용할 수 있습니다.
일러두기
여기서 다루는 모바일을 체크하고 iOS와 Android에서 실행되는지 체크하는 방법은 정확성과 확장성 면에서 제한이 있을 수 있으므로, 정확성이나 확장성을 보장하거나 보증할 수 없습니다. 따라서, 모든 자료와 예제를 신뢰하기 전에 스스로의 판단에 따라 오류, 버그, 취약점이 없는지 신중하게 테스트하고 검토해야 합니다.
같이 보기
모바일 iOS와 Android 구분하는 함수
PHP로 모바일 장치의 iOS와 Android를 감지하는 것은 웹 개발에서 자주 필요한 작업 중 하나입니다. 사용자가 모바일 기기를 사용할 때마다 적절한 환경을 제공하기 위해 이러한 구분이 필요합니다. 이번 포스팅에서는 PHP로 모바일 장치를 감지하고, 그 중에서도 iOS와 Android를 구분하는 방법을 소개합니다.
다음은 모바일 iOS와 Android 구분하는 함수의 구조입니다.
/**
* PHP 8에서 소개된 str_contains() 함수를 polyfill로 대체하는 함수입니다.
* PHP 8 미만의 버전에서 str_contains() 함수를 사용하기 위해 사용됩니다.
*
* @param string $haystack 대상 문자열입니다.
* @param string $needle 찾고자 하는 부분 문자열입니다.
* @return bool 주어진 문자열이 부분 문자열을 포함하면 true를, 그렇지 않으면 false를 반환합니다.
*/
if (!function_exists('str_contains')) {
/*
* str_contains() 함수의 polyfill
* 출처: https://core.trac.wordpress.org/browser/trunk/src/wp-includes/compat.php#L423
*/
function str_contains($haystack, $needle) {
if ('' === $needle) {
return true;
}
return false !== strpos($haystack, $needle);
}
}
/**
* 모바일 장치를 감지하여 체크하는 함수입니다.
* HTTP_SEC_CH_UA_MOBILE 헤더를 확인하고, HTTP_USER_AGENT를 분석하여 모바일 장치인지 여부를 판단합니다.
*
* @return bool 모바일 장치가 감지되면 true를, 그렇지 않으면 false를 반환합니다.
*/
function is_mobile() {
if (isset($_SERVER['HTTP_SEC_CH_UA_MOBILE'])) {
// HTTP_SEC_CH_UA_MOBILE 헤더가 존재하고, 값이 '?1'인 경우 모바일로 판단합니다.
// 참조: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-UA-Mobile
return ( '?1' === $_SERVER['HTTP_SEC_CH_UA_MOBILE'] ); //
} elseif (!empty($_SERVER['HTTP_USER_AGENT'])) {
// HTTP_USER_AGENT를 분석하여 모바일 특징을 찾습니다.
$user_agent = $_SERVER['HTTP_USER_AGENT'];
return str_contains($user_agent, 'Mobile')
|| str_contains($user_agent, 'Android')
|| str_contains($user_agent, 'Silk/')
|| str_contains($user_agent, 'Kindle')
|| str_contains($user_agent, 'BlackBerry')
|| str_contains($user_agent, 'Opera Mini')
|| str_contains($user_agent, 'Opera Mobi');
} else {
// HTTP_SEC_CH_UA_MOBILE 헤더도 없고, HTTP_USER_AGENT도 없으면 모바일이 아닌 것으로 간주합니다.
return false;
}
}
/**
* iOS를 감지하여 체크하는 함수입니다.
*
* @return bool 모바일 장치가 iOS인 경우 true를, 그렇지 않은 경우 false를 반환합니다.
*/
function is_ios() {
return is_mobile() && preg_match('/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT']);
}
/**
* Android를 감지하여 체크하는 함수입니다.
*
* @return bool 모바일 장치가 Android인 경우 true를, 그렇지 않은 경우 false를 반환합니다.
*/
function is_android() {
return is_mobile() && preg_match('/Android/', $_SERVER['HTTP_USER_AGENT']);
}
/* iOS, Android 여부에 따라 다른 코드를 실행합니다. */
if (is_ios()) {
// iOS 환경에서 사용할 코드
} elseif(is_android()) {
// Android 환경에서 사용할 코드
} else {
// 그 밖의 환경에서 사용할 코드
}
위 코드에서 사용한 주요 함수입니다.
위 코드의 전개를 순서대로 간략히 설명하겠습니다.
str_contains()
함수의 polyfill:
PHP 8에서 도입된str_contains()
함수를 PHP 8 이전의 버전에서도 사용할 수 있도록 폴리필 함수를 정의했습니다. 이 함수는 문자열에 특정 문자열이 포함되어 있는지를 확인합니다. 이 함수는 모바일 장치를 감지하여 체크하는 함수 내에서 사용됩니다.- 모바일 장치를 감지하여 체크하는 함수 (
is_mobile()
):HTTP_SEC_CH_UA_MOBILE
헤더를 확인하거나HTTP_USER_AGENT
를 분석하여 모바일 장치인지 여부를 판단하는 함수입니다. 이 함수는 모바일 장치인 경우true
를 반환하고, 그렇지 않으면false
를 반환합니다. - iOS와 Android를 구분하는 함수 (
is_ios()
및is_android()
):
모바일 장치가 감지된 경우, 해당 장치가 iOS인지 Android인지를 판별하는 함수입니다. iOS인 경우에는HTTP_USER_AGENT
에 'iPad', 'iPod', 'iPhone' 등의 문자열이 포함되어 있는지를 확인하여 판별하고, Android인 경우에는 'Android' 문자열이 포함되어 있는지를 확인하여 판별합니다. - 조건문을 활용한 환경 분기:
감지된 환경에 따라 다른 코드를 실행하기 위해if-elseif-else
조건문을 사용합니다. iOS 환경이 감지된 경우에는 iOS 환경에서 실행할 코드를 실행하고, Android 환경이 감지된 경우에는 Android 환경에서 실행할 코드를 실행합니다. 그렇지 않은 경우에는 그 외의 환경에서 실행할 코드를 실행합니다. 이 조건문은 개발 환경이나 조건에 따라 편리하게 변경해서 사용하면 됩니다.
위 예시 코드의 한계점
이러한 과정을 통해 제공된 코드는 PHP로 모바일 장치의 iOS와 Android를 구분하고, 각 환경에 맞는 동작을 수행할 수 있는 유용한 기능을 제공합니다. 하지만, 위 예시 코드는 몇 가지 한계점을 가지고 있습니다. 여기에는 다음과 같은 사항들이 포함됩니다.
HTTP_USER_AGENT
의 한계성
사용자 에이전트 문자열을 분석하여 모바일 장치를 감지하는 것은 신뢰성이 낮을 수 있습니다. 사용자 에이전트는 사용자가 직접 휴대폰 브라우저에서도 데스크톱 모드로 변경할 수 있습니다. 따라서 이 코드는 사용자 에이전트에 대한 한계성을 가지고 있습니다. 또한 클라이언트 측 정보는 보안 관련 목적으로 활용할 경우에 추가적인 적절한 조치가 필요합니다.
새로운 모바일 디바이스 추가에 대한 확장성
코드는 모바일 장치를 감지하기 위해 HTTP_USER_AGENT
헤더를 분석합니다. 새로운 모바일 디바이스가 출시될 때마다 해당 장치의 사용자 에이전트 문자열 패턴을 고려하여 코드를 업데이트해야 합니다. 이는 새로운 모바일 디바이스가 추가되는 경우 유지보수를 요구할 수 있습니다.
캐싱된 사용자 에이전트 값의 불일치
캐싱이 적용된 경우, 동일한 사용자 에이전트 값을 가진 여러 사용자가 다른 디바이스에서 액세스할 때 문제가 발생할 수 있습니다. 캐시된 사용자 에이전트 값이 고정되어 있으면, 새로운 디바이스나 브라우저에서 액세스할 때 올바른 결과를 반환하지 못할 수 있습니다. 이는 사용자 경험을 저하시키고 잘못된 결과를 제공할 수 있습니다.
따라서 캐시를 구현할 때는 사용자 에이전트 값이 캐시되지 않도록 주의해야 합니다. 대신 사용자를 식별할 수 있는 안정적인 방법을 사용하여 캐시를 구성해야 합니다.