진동 API

W3C 후보 권고 초안

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/CRD-vibration-20250212/
최신 공개 버전:
https://www.w3.org/TR/vibration/
최신 편집자 초안:
https://w3c.github.io/vibration/
히스토리:
https://www.w3.org/standards/history/vibration/
커밋 히스토리
테스트 스위트:
https://wpt.live/vibration/
구현 보고서:
https://wpt.fyi/results/vibration
편집자:
Anssi Kostiainen (Intel)
피드백:
GitHub w3c/vibration (풀 리퀘스트, 새 이슈, 오픈 이슈)
public-device-apis@w3.org 제목 [vibration] … 메시지 주제 … (아카이브)
번역
简体中文

요약

이 명세서는 호스팅 디바이스의 진동 메커니즘에 접근할 수 있는 API를 정의합니다. 진동은 촉각 피드백의 한 형태입니다.

문서의 상태

이 섹션은 문서가 공개된 시점에서의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 색인에서 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 Vibration API의 범위와 기능에 대해 그룹의 합의된 내용을 나타냅니다. 그룹은 이 첫 번째 버전으로는 실현할 수 없는 더 발전된 사용 사례가 있다는 점을 인지하고 있습니다. 이러한 사례들은 향후 개정판에서 다룰 예정입니다.

이전 버전에서 변경 사항의 이력이 제공됩니다.

이 문서는 디바이스 및 센서 워킹 그룹에서 권고안 트랙을 통해 후보 권고 초안으로 공개되었습니다.

후보 권고로 공개되었다고 해서 W3C 및 회원사의 지지를 의미하지는 않습니다. 후보 권고 초안에는 워킹 그룹이 추후 후보 권고 스냅샷에 포함할 계획인 이전 후보 권고의 변경 사항이 통합됩니다.

이 문서는 초안이며 언제든지 다른 문서에 의해 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 이 문서를 인용하는 것은 적절하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C공개 특허 공개 목록을 그룹의 산출물과 관련하여 유지하고 있습니다. 해당 페이지에는 특허 공개에 대한 안내도 포함되어 있습니다. 특정 특허가 필수 청구항을 포함한다고 실제로 아는 개인은 W3C 특허 정책 섹션 6에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서에 따라 관리됩니다.

1. 소개

이 섹션은 비규범적입니다.

이 API는 단순한 촉각 피드백만을 필요로 하는 사용 사례를 위해 특별히 설계되었습니다. 더 세밀한 제어가 필요한 사용 사례는 이 명세의 범위에 포함되지 않습니다. 이 API는 일반적인 알림 메커니즘으로 사용하기 위한 것이 아닙니다. 이러한 사용 사례는 Notifications API [NOTIFICATIONS] 명세를 통해 처리할 수 있습니다. 또한 진동이 활성화되어 있는지 여부를 확인하는 것은 이 명세의 범위에 포함되지 않습니다.

2. 적합성

비규범적으로 표시된 섹션뿐만 아니라, 이 명세서의 모든 작성 지침, 도표, 예시, 주석은 비규범적입니다. 그 외의 모든 내용은 규범적입니다.

이 문서의 MAY, MUST, SHOULD라는 키워드는 BCP 14 [RFC2119] [RFC8174] 에 설명된 대로, 그리고 반드시 대문자로 표시된 경우에만 해석됩니다.

이 명세는 하나의 제품에 적용되는 적합성 기준을 정의합니다: 이 명세에 포함된 인터페이스를 구현하는 user agent입니다.

이 명세에서 정의된 API를 ECMAScript로 구현하는 경우, Web IDL 명세 [WEBIDL-1]에 정의된 ECMAScript 바인딩에 따라 구현해야 합니다. 이 명세서는 해당 명세와 용어를 사용합니다.

3. 진동 인터페이스

WebIDLtypedef (unsigned long or sequence<unsigned long>) VibratePattern;

partial interface Navigator {
    boolean vibrate (VibratePattern pattern);
};

vibrate() 메서드는 진동 패턴 처리 알고리즘을 실행합니다. 진동 패턴VibratePattern 객체로 표현됩니다.

진동 패턴 처리의 규칙은 다음 알고리즘에 따릅니다:

  1. patternvibrate() 메서드의 첫 번째 인자로 지정합니다.
  2. valid patternpattern검증 및 정규화에 전달한 결과로 지정합니다.
  3. documentvisibility statevisible이 아니면 false를 반환하고 종료합니다.
    참고
    운영체제의 기능과 긴밀히 통합된 신뢰할 수 있는(특권을 가진) 애플리케이션은 해당 애플리케이션이 전혀 보이지 않는 경우에도 디바이스를 진동시킬 수 있으며, 이전 단계를 무시할 수 있습니다.
  4. 진동 수행this관련 글로벌 객체valid pattern과 함께 실행합니다.

검증 및 정규화진동 패턴 pattern에 대해 수행하려면, 다음 단계로 진행합니다:

  1. pattern이 리스트라면 다음 단계로 진행합니다. 아니라면 아래 하위 단계를 실행합니다:
    1. list를 빈 리스트로 만들고 patternlist에 추가합니다.
    2. patternlist로 설정합니다.
  2. max length를 10으로 지정합니다.
  3. pattern의 길이가 max length보다 크면, pattern을 잘라내어 처음 max length 항목만 남깁니다.
    참고
    pattern의 길이가 짝수이고 0이 아니라면, 패턴의 마지막 항목은 효과가 없으므로 구현체는 이 단계에서 이를 pattern에서 제거할 수 있습니다.
  4. max duration을 10000으로 지정합니다.
  5. pattern의 각 항목 값이 max duration보다 크면, 해당 항목의 값을 max duration으로 설정합니다.
  6. pattern을 반환합니다.

진동 수행global object global진동 패턴 pattern을 사용하여 수행하려면, 다음 단계로 진행합니다:

  1. globalsticky activation을 갖지 않으면, false를 반환하고 종료합니다.
  2. 구현체는 MAY false를 반환하고 종료할 수 있습니다.
    참고
    예를 들어, 구현체는 진동 하드웨어가 없거나, 사용자가 특정 origin의 페이지에서 디바이스 진동을 비활성화하도록 설정했거나, 구현체가 페이지가 진동시킬 수 있는 총 시간을 제한하고 이를 초과하는 요청을 거부할 수 있기 때문에 알고리즘을 중단할 수 있습니다.
  3. 다른 진동 수행 알고리즘 인스턴스가 이미 실행 중이면, 아래 하위 단계를 실행합니다:
    1. 다른 진동 수행 알고리즘 인스턴스가 있다면 중단합니다.
    2. pattern이 빈 리스트이거나, 값이 0인 단일 항목이거나, 디바이스가 진동할 수 없으면 true를 반환하고 종료합니다.
  4. true를 반환하고, 이후 단계는 비동기로 계속 실행합니다.
  5. pattern의 각 time에 대해 아래 하위 단계를 실행합니다:
    1. time의 인덱스가 짝수(첫 항목은 0)면, 디바이스를 time 밀리초 동안 진동시킵니다.
    2. 그 외에는 time 밀리초 동안 대기합니다.

user agentvisibility statetop-level browsing contextDocument에서 변경되었다고 판단하면, 이미 실행 중인 진동 패턴 처리 알고리즘을 중단해야 합니다(MUST).

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

Vibration API 자체는 데이터를 생성하지 않으므로 웹에서 소비할 수 있는 데이터를 직접 제공하지 않습니다. 하지만 다른 API의 이벤트 소스로 활용될 수 있는 것이 알려져 있습니다. 특히, 가속도계나 자이로스코프와 같은 특정 센서는 제조 과정에서 미세한 불완전성을 가질 수 있습니다. 이로 인해 진동 API를 통해 생성된 진동 자극을 이용해 이러한 센서가 지문(surface)이 되어 정보가 악용될 수 있습니다. 이런 관점에서 Vibration API는 다른 메커니즘과 결합될 때 간접적으로 개인정보 위험을 제공합니다. 이는 예상치 못한 개인정보 위험(디바이스 간 추적, 통신 등)을 유발할 수 있습니다. 또한 진동 중인 디바이스는 외부 관찰자에게 물리적으로 식별될 수 있고, 사용자의 추적이 가능해질 수 있습니다.

이러한 이유로 user agent는 API가 사용될 때 사용자에게 알리고, API를 원천적으로(혹은 origin별로) 비활성화(실질적으로 아무 동작도 하지 않도록)할 수 있는 메커니즘을 제공할 수 있습니다(MAY).

user agent는 일정 기간(예: 1분 또는 1시간 등) 내에 진동 요청 횟수를 제한함으로써 과도한 사용을 방지하기 위해 글로벌 레이트 리미팅을 적용해야 합니다(SHOULD).

5. 예시

이 섹션은 비규범적입니다.

아래 예제에서는 디바이스가 1000밀리초(ms) 동안 진동합니다:

// 1000ms 동안 진동
navigator.vibrate(1000);

// 또는
navigator.vibrate([1000]);

다음 예제에서는 패턴에 따라 디바이스가 50ms 진동, 100ms 정지, 150ms 진동합니다:

navigator.vibrate([50, 100, 150]);

다음 예제는 기존의 모든 진동을 취소합니다:

// 기존 진동 취소
navigator.vibrate(0);

// 또는
navigator.vibrate([]);

A. 감사의 말씀

그룹은 Justin Lebar, Mounir Lamouri, Jonas Sicking, 그리고 Mozilla WebAPI 팀의 기여와 WebVibrator 프로토타입을 초기 입력으로 제공해주신 점에 깊이 감사드립니다. Anne van Kesteren께서는 명세가 다른 문맥에서도 재사용될 수 있도록 제안해주셨고, Lukasz Olejnik께서는 개인정보 보호 고려사항에 대해 도움을 주셨습니다. 마지막으로 Zhiqiang Zhang께서는 간체 중국어 번역에 감사드립니다.

B. 변경 사항

W3C 권고안 2016년 10월 18일 이후 변경 사항:

문서 해석에 기능적으로 영향을 미치지 않는 기타 변경 사항:

C. IDL 색인

WebIDLtypedef (unsigned long or sequence<unsigned long>) VibratePattern;

partial interface Navigator {
    boolean vibrate (VibratePattern pattern);
};

D. 참고 문헌

D.1 표준 참고 문헌

[dom]
DOM 표준. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[html]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
RFC에서 요구 사항 수준을 표시하기 위한 주요 단어. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 주요 단어에서 대문자와 소문자의 모호함. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL-1]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

D.2 안내 참고 문헌

[NOTIFICATIONS]
Notifications API 표준. Anne van Kesteren. WHATWG. Living Standard. URL: https://notifications.spec.whatwg.org/