가속도계

W3C 후보 권고 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/CRD-accelerometer-20250212/
최신 공개 버전:
https://www.w3.org/TR/accelerometer/
편집자 초안:
https://w3c.github.io/accelerometer/
이전 버전:
히스토리:
https://www.w3.org/standards/history/accelerometer/
피드백:
public-device-apis@w3.org 제목 줄 “[accelerometer] … 메시지 주제 …” 포함 (아카이브)
GitHub
구현 보고서:
https://www.w3.org/wiki/DAS/Implementations
테스트 스위트:
https://github.com/web-platform-tests/wpt/tree/main/accelerometer
편집자:
Anssi Kostiainen (Intel Corporation)
이전 편집자:
Alexander Shalamov (Intel Corporation)

개요

이 명세서는 가속도계, 선형가속도센서중력센서 인터페이스를 정의하며, 센서를 탑재한 기기의 X, Y, Z 축에 가해지는 가속도 정보를 얻기 위해 사용됩니다.

이 문서의 상태

이 섹션은 본 문서가 발행된 시점에서의 상태를 설명합니다. 현재 W3C 발간 문서와 기술 보고서의 최신 버전 목록은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/에서 확인할 수 있습니다.

본 문서는 기기 및 센서 워킹그룹에서 추천 경로(Recommendation track)로 발행한 후보 권고 초안입니다. 본 문서는 W3C 권고가 될 예정입니다.

문서 관련 의견이 있으시면 public-device-apis@w3.org (구독, 아카이브) 으로 보내주시기 바랍니다. 이메일 제목에 “accelerometer”라는 단어를 포함해주세요, 예시: “[accelerometer] …의견 요약…”. 모든 의견을 환영합니다.

후보 권고로서의 발행이 W3C 및 회원들의 지지를 의미하는 것은 아닙니다. 후보 권고 초안은 워킹그룹이 다음 권고 스냅샷에 포함하려는 이전 후보 권고의 변경사항을 통합합니다. 이 문서는 초안이며 언제든 업데이트, 대체, 폐기될 수 있습니다. 진행 중인 작업 외에는 인용하기에 부적합합니다.

본 문서가 제안 권고(Proposed Recommendation) 단계로 진입하기 위한 조건은, 본 명세의 모든 기능을 구현한 최소 두 가지 독립적이고 상호운용 가능한 사용자 에이전트를 갖추는 것입니다. 이는 워킹그룹이 작성한 테스트 스위트로 사용자 에이전트 테스트를 통과함으로써 결정됩니다. 워킹그룹은 진행 상황을 추적하기 위해 구현 보고서를 준비할 예정입니다.

본 문서는 W3C 특허 정책 하에 운영되는 그룹에 의해 제작되었습니다. W3C는 본 그룹 산출물과 관련된 공개 특허 목록을 유지하고 있습니다. 해당 페이지에는 특허 공개 방법 안내도 포함되어 있습니다. 누군가가 핵심 청구(Essential Claim(s))를 포함한 특허를 알고 있다면, W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

본 문서는 2023년 11월 3일 W3C 프로세스 문서를 따릅니다.

본 문서는 수시로 유지·갱신됩니다. 일부 내용은 진행 중인 작업입니다.

1. 소개

Accelerometer, LinearAccelerationSensorGravitySensor API는 Generic Sensor API [GENERIC-SENSOR] 인터페이스를 확장하여, 디바이스의 가속도 정보를, 디바이스가 정의하는 로컬 좌표계 기준 X, Y, Z 축에 적용된 값을 제공합니다.

2. 예시

let sensor = new Accelerometer();
sensor.start();

sensor.onreading = () => {
    console.log("Acceleration along X-axis: " + sensor.x);
    console.log("Acceleration along Y-axis: " + sensor.y);
    console.log("Acceleration along Z-axis: " + sensor.z);
}

sensor.onerror = event => console.log(event.error.name, event.error.message);
다음 예시는 스크린 좌표계의 측정값을 제공하는 중력 센서 사용법을 보여줍니다. 아래 코드는 dom screen이 지면에 수직이고 웹페이지의 바닥이 아래를 향할 때 콘솔에 메시지를 출력합니다.
let sensor = new GravitySensor({frequency: 5, referenceFrame: "screen"});

sensor.onreading = () => {
  if (sensor.y >= 9.8) {
    console.log("Web page is perpendicular to the ground.");
  }
}

sensor.start();
다음 예시는 디바이스의 x축 방향 흔들기 동작을 방향에 상관없이 판별합니다. dom screen의 방향과 무관합니다.
const shakeThreshold = 25;

let sensor = new LinearAccelerationSensor({frequency: 60});

sensor.addEventListener('reading', () => {
  if (sensor.x > shakeThreshold) {
    console.log("Shake detected.");
  }
});

sensor.start();

3. 사용 사례 및 요구사항

사용 사례와 요구사항은 Motion Sensors Explainer Sensor use cases 문서에 나와 있습니다.

4. 보안 및 개인정보 고려사항

Sensor readings와 같이 관성 센서가 제공하는 정보는, 공격자에 의해 예를 들어서 키로깅, 위치 추적, 지문 식별사용자 식별 등 다양한 보안 위협을 노리는 데 활용될 수 있습니다.

예를 들어 [KEYSTROKEDEFENSE] 등의 보안 커뮤니티 연구 논문에 따르면, 빈도 제한만으로는 공격 성공 위험을 완전히 제거할 수 없지만, 제한은 센서 정당 활용 목적의 웹앱에도 큰 영향을 미칠 수 있다고 설명합니다.

[TOUCHSIGNATURES][ACCESSORY] 연구 논문에서는 관성 센서가 사용 중임을 시각적으로 알리거나, 센서 측정값에 접근할 때 명시적 사용자 동의를 받아야 한다는 대응책을 제시하고 있습니다. 이러한 완화 전략은 Generic Sensor API [GENERIC-SENSOR]에 정의된 일반적인 대응책을 보완합니다.

이 명세서는 가속도계 읽기 양자화 알고리즘을 정의하여(이 알고리즘은 가장 최근 측정값에서 값 얻기 연산에서 호출됨), 센서 보정값 기반 지문 식별 [SENSORID] 및 고정밀 센서 측정값을 기반으로 하는 공격에 대응합니다. 양자화 알고리즘의 구체 내용은 W3C 개인정보 이슈 그룹의 권고를 따릅니다.

5. 권한 정책 연동

이 명세는 정책 제어 기능을 사용합니다. 이 기능은 [DEVICE-ORIENTATION]에서 "accelerometer" 문자열로 정의되어 있습니다.

6. 모델

6.1. 가속도계

Accelerometer 센서 유형에는 다음 데이터가 연관됩니다:

확장 센서 인터페이스

Accelerometer

센서 권한 이름

"accelerometer"

센서 기능 이름

"accelerometer"

권한 해제 알고리즘

일반 센서 권한 해제 알고리즘을 "accelerometer"와 함께 호출합니다.

기본 센서

디바이스의 주 가속도계 센서입니다.

가상 센서 유형

"accelerometer"

최신 측정값(Sensor)은 Accelerometer 센서 유형의 경우, "x", "y", "z" 세 항목와 각 축의 디바이스 가속도 값을 담습니다.

가속도는 시간에 따른 디바이스 속도 변화율입니다. 단위는 미터 매 제곱초(m/s2) [SI]입니다.

가속도 측정의 기준 프레임은 관성이어야 하며, 예를 들어 자유 낙하 중인 디바이스는 각 축별 0(m/s2) 가속도 값을 제공합니다.

가속도 부호는 로컬 좌표계의 오른손 법칙을 따라야 합니다(아래 그림 참조).

Accelerometer coordinate system.

6.2. 선형 가속도 센서

Linear Acceleration Sensor 센서 유형에는 다음 데이터가 연관됩니다:

확장 센서 인터페이스

LinearAccelerationSensor

센서 권한 이름

"accelerometer"

센서 기능 이름

"accelerometer"

권한 해제 알고리즘

일반 센서 권한 해제 알고리즘을 "accelerometer"와 함께 호출합니다.

가상 센서 유형

"linear-acceleration"

최신 측정값 (Sensor)은 Linear Acceleration Sensor 센서 유형의 경우, "x", "y", "z" 세 항목와 각 축의 디바이스 선형 가속도 값을 담습니다.

선형 가속도란, 센서가 탑재된 장치에 중력(gravity) 힘을 제외하고 가해지는 가속도입니다.

참고: 중력선형 가속도 간의 관계에 대해서는 Motion Sensors Explainer § gravity-and-linear-acceleration에서 논의합니다.

6.3. 중력 센서

Gravity Sensor 센서 유형에는 다음 데이터가 연관됩니다:

확장 센서 인터페이스

GravitySensor

센서 권한 이름

"accelerometer"

센서 기능 이름

"accelerometer"

권한 해제 알고리즘

일반 센서 권한 해제 알고리즘을 "accelerometer"와 함께 호출합니다.

가상 센서 유형

"gravity"

최신 측정값(Sensor)은 Gravity Sensor 센서 유형의 경우, "x", "y", "z" 세 항목와 각 축의 중력에 의한 가속도 값을 담습니다.

중력은 디바이스의 속도가 주변 질량 쪽으로 증가하는 것을 방지하는 가속도 성분입니다. 자유 낙하가 일정 시간 이상 지속되면 디바이스는 중력값을 잘못 산출할 수 있습니다.

참고: 중력선형 가속도 간 관계는 Motion Sensors Explainer § gravity-and-linear-acceleration를 참고하세요.

6.4. 참고 기준(Reference Frame)

로컬 좌표계Accelerometer, LinearAccelerationSensor, GravitySensor 측정값의 기준 프레임을 의미합니다. 이는 장치 좌표계 또는 스크린 좌표계일 수 있습니다.

장치 좌표계는 3차원 데카르트 좌표계(x, y, z)로 정의되며, 물리적 장치와 결합되어 있습니다. 디스플레이가 있는 장치의 경우 장치 좌표계의 원점은 디바이스 디스플레이의 중심입니다. 장치를 기본 위치로 잡으면 Y축은 디스플레이의 위쪽, X축은 오른쪽, Z축은 X와 Y의 벡터곱으로 화면 기준 바깥쪽(사용자쪽)을 향합니다. 장치 좌표계dom screen 회전에 영향받지 않고 고정되어 있습니다(아래 그림 참고).

Device coordinate system.

스크린 좌표계는 3차원 데카르트 좌표계(x, y, z)로 정의되며 dom screen과 결합되어 있습니다. 스크린 좌표계의 원점은 dom screen의 중심입니다. Y축은 항상 dom screen 위쪽, X축은 dom screen 오른쪽, Z축은 X, Y의 벡터곱으로 스크린 바깥쪽, 즉 사용자쪽을 향합니다(아래 그림 참고).

Screen coordinate system.

장치 좌표계스크린 좌표계의 주요 차이는 스크린 좌표계는 항상 dom screen의 방향을 따르며, 예를 들어 현재 방향이 바뀌면 X, Y 축이 장치 기준에서 바뀔 수 있습니다. 반면 장치 좌표계는 장치에 대해 항상 고정됩니다.

7. API

7.1. Accelerometer 인터페이스

[SecureContext, Exposed=Window]
interface Accelerometer : Sensor {
  constructor(optional AccelerometerSensorOptions options = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum AccelerometerLocalCoordinateSystem { "device", "screen" };

dictionary AccelerometerSensorOptions : SensorOptions {
  AccelerometerLocalCoordinateSystem referenceFrame = "device";
};
new Accelerometer(options) 생성자 단계는 가속도계 객체 생성 추상 연산을 thisoptions와 함께 호출합니다.

Accelerometer의 지원 옵션은 "frequency", "referenceFrame"입니다.

7.1.1. Accelerometer.x

x 속성은 Accelerometer 인터페이스에서 가장 최근 측정값에서 값 얻기를 "x" 인자로 실행한 결과를 반환합니다. x축 가속도를 나타냅니다.

7.1.2. Accelerometer.y

y 속성은 Accelerometer 인터페이스에서 가장 최근 측정값에서 값 얻기를 "y" 인자로 실행한 결과를 반환합니다. y축 가속도를 나타냅니다.

7.1.3. Accelerometer.z

z 속성은 Accelerometer 인터페이스에서 가장 최근 측정값에서 값 얻기를 "z" 인자로 실행한 결과를 반환합니다. z축 가속도를 나타냅니다.

7.2. LinearAccelerationSensor 인터페이스

[SecureContext, Exposed=Window]
interface LinearAccelerationSensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};
new LinearAccelerationSensor(options) 생성자 단계는 가속도계 객체 생성 추상 연산을 thisoptions와 함께 호출합니다.

LinearAccelerationSensor의 지원 옵션은 "frequency", "referenceFrame"입니다.

7.2.1. LinearAccelerationSensor.x

x 속성은 LinearAccelerationSensor 인터페이스에서 가장 최근 측정값에서 값 얻기를 "x" 인자로 실행한 결과를 반환합니다. x축 선형가속도를 나타냅니다.

7.2.2. LinearAccelerationSensor.y

y 속성은 LinearAccelerationSensor 인터페이스에서 가장 최근 측정값에서 값 얻기를 "y" 인자로 실행한 결과를 반환합니다. y축 선형가속도를 나타냅니다.

7.2.3. LinearAccelerationSensor.z

z 속성은 LinearAccelerationSensor 인터페이스에서 가장 최근 측정값에서 값 얻기를 "z" 인자로 실행한 결과를 반환합니다. z축 선형가속도를 나타냅니다.

7.3. GravitySensor 인터페이스

[SecureContext, Exposed=Window]
interface GravitySensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};
new GravitySensor(options) 생성자 단계는 가속도계 객체 생성 추상 연산을 thisoptions와 함께 호출합니다.

GravitySensor의 지원 옵션은 "frequency", "referenceFrame"입니다.

7.3.1. GravitySensor.x

x 속성은 GravitySensor 인터페이스에서 가장 최근 측정값에서 값 얻기를 "x" 인자로 실행한 결과를 반환합니다. 중력에 의한 x축 가속도 효과를 나타냅니다.

7.3.2. GravitySensor.y

y 속성은 GravitySensor 인터페이스에서 가장 최근 측정값에서 값 얻기를 "y" 인자로 실행한 결과를 반환합니다. 중력에 의한 y축 가속도 효과를 나타냅니다.

7.3.3. GravitySensor.z

z 속성은 GravitySensor 인터페이스에서 가장 최근 측정값에서 값 얻기를 "z" 인자로 실행한 결과를 반환합니다. 중력에 의한 z축 가속도 효과를 나타냅니다.

8. 추상 연산

8.1. 가속도계 객체 생성

input

object, Accelerometer, LinearAccelerationSensor 또는 GravitySensor 객체

options, AccelerometerSensorOptions 객체

  1. allowed정책 제어 기능 확인object센서 유형으로 호출한 결과로 설정

  2. allowed가 false이면:

    1. Throw SecurityError DOMException

  3. 센서 객체 초기화object, options로 호출

  4. options.referenceFrame 이 "screen"이면:

    1. object로컬 좌표계스크린 좌표계로 지정

  5. 그 외에는 object로컬 좌표계장치 좌표계로 지정

8.2. 가속도계 읽기 양자화 알고리즘

Accelerometer 센서 유형은 다음 읽기 양자화 알고리즘을 정의합니다:

input

reading, 센서 측정값

output

센서 측정값

  1. quantizedReadingreading으로 설정

  2. quantizedReading["x"]가 null이 아니면 0.1 m/s2 단위로 근사

  3. quantizedReading["y"]가 null이 아니면 0.1 m/s2 단위로 근사

  4. quantizedReading["z"]가 null이 아니면 0.1 m/s2 단위로 근사

  5. quantizedReading 반환

9. 자동화

이 절은 Generic Sensor API § 9 Automation을 확장하여 Accelerometer에 특화된 가상 센서 메타데이터를 제공합니다. 본 명세서에서 사용하는 일부 가상 센서 유형[DEVICE-ORIENTATION]에 정의되어 있습니다.

9.1. 가속도계 자동화

accelerometer 가상 센서 타입과 이에 대응하는 타입별 가상 센서 메타데이터 map 항목은 Device Orientation and Motion § automation에 정의되어 있습니다.

9.2. 선형 가속도계 자동화

linear-acceleration 가상 센서 타입과 이에 대응하는 타입별 가상 센서 메타데이터 map 항목은 Device Orientation and Motion § automation에 정의되어 있습니다.

9.3. 중력 자동화

타입별 가상 센서 메타데이터 map 은 다음 entry를 가져야 합니다:

key

"gravity"

value

가상 센서 메타데이터로, reading parsing algorithmparse xyz reading입니다.

10. 감사의 글

Generic Sensor API 작업에 기여한 Tobie Langel.

센서 보정값 지문 방지 방안 및 논의에 기여한 W3C Privacy Interest Group와 Paul Jensen.

적합성

문서 관례

적합성 요구사항은 설명적 진술과 RFC 2119 용어의 조합으로 표현됩니다. 본 문서의 규범 부분에 포함된 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 키워드는 RFC 2119에 기술된 바대로 해석되어야 합니다. 다만, 가독성을 위해 본 명세서에서는 이러한 단어들이 모두 대문자로 나타나지 않습니다.

명시적으로 비규범임을 밝히거나, 예시, 참고 사항으로 표시된 부분을 제외하고, 본 명세서의 모든 텍스트는 규범적입니다. [RFC2119]

본 명세서 내의 예시는 “예를 들어”라는 단어로 시작하거나, class="example"로 구분되어 표시됩니다, 아래와 같이:

이것은 비규범적 예시의 예입니다.

비규범적 참고 사항은 “참고”라는 단어로 시작하며, class="note"로 구분되어 표시됩니다, 아래와 같이:

참고, 이것은 비규범적 참고 사항입니다.

적합 알고리즘

알고리즘의 일부로서 명령형으로 작성된 요구사항(예: "앞의 공백 문자를 제거하라" 또는 "false를 반환하고 이 단계를 중단하라")은, 알고리즘의 서두에 사용된 키워드("must", "should", "may" 등)의 의미로 해석됩니다.

알고리즘 또는 구체적 단계로 표현된 적합성 요구사항은, 최종 결과가 동일하다면 어떻게 구현해도 무방합니다. 특히, 본 명세서의 알고리즘은 이해하기 쉽도록 설계되었으며, 효율성(성능)을 목적으로 한 것은 아닙니다. 구현자는 최적화를 권장합니다.

색인

이 명세서에서 정의된 용어

참조 용어

참고 문헌

규범적 참고문헌

[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. Device Orientation and Motion. URL: https://w3c.github.io/deviceorientation/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. URL: https://w3c.github.io/sensors/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SCREEN-ORIENTATION]
Marcos Caceres. Screen Orientation. URL: https://w3c.github.io/screen-orientation/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

비규범적 참고문헌

[ACCESSORY]
Owusu, Emmanuel, et al. ACCessory: password inference using accelerometers on smartphones. 2012. Informational. URL: https://dl.acm.org/citation.cfm?id=2162095
[KEYSTROKEDEFENSE]
Song, Yihang, et al. Two novel defenses against motion-based keystroke inference attacks. 2014. Informational. URL: https://arxiv.org/abs/1410.7746
[MOTION-SENSORS]
Kenneth Christiansen; Alexander Shalamov. Motion Sensors Explainer. URL: https://w3c.github.io/motion-sensors/
[SENSORID]
Zhang, Jiexin; Beresford, Alastair R.; Sheret, Ian. SensorID: Sensor Calibration Fingerprinting for Smartphones. 2019. URL: https://doi.org/10.1109/SP.2019.00072
[SI]
SI Brochure: The International System of Units (SI), 8th edition. 2014. 8th Edition. URL: http://www.bipm.org/en/publications/si-brochure/
[TOUCHSIGNATURES]
Mehrnezhad, Maryam, et al. Touchsignatures: identification of user touch actions and pins based on mobile sensor data via javascript. 2016. Informational. URL: https://arxiv.org/abs/1602.04115

IDL 인덱스

[SecureContext, Exposed=Window]
interface Accelerometer : Sensor {
  constructor(optional AccelerometerSensorOptions options = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum AccelerometerLocalCoordinateSystem { "device", "screen" };

dictionary AccelerometerSensorOptions : SensorOptions {
  AccelerometerLocalCoordinateSystem referenceFrame = "device";
};

[SecureContext, Exposed=Window]
interface LinearAccelerationSensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};

[SecureContext, Exposed=Window]
interface GravitySensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};

MDN

Accelerometer/Accelerometer

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer/x

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer/y

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer/z

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

GravitySensor/GravitySensor

In only one current engine.

FirefoxNoneSafariNoneChrome91+
Opera?Edge91+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

GravitySensor

In only one current engine.

FirefoxNoneSafariNoneChrome91+
Opera?Edge91+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

LinearAccelerationSensor/LinearAccelerationSensor

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

LinearAccelerationSensor

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Headers/Feature-Policy/accelerometer

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?