배터리 상태 API

W3C 작업 초안

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2024/WD-battery-status-20241024/
최신 공표 버전:
https://www.w3.org/TR/battery-status/
최신 편집자 초안:
https://w3c.github.io/battery/
히스토리:
https://www.w3.org/standards/history/battery-status/
커밋 히스토리
테스트 스위트:
https://wpt.live/battery-status/
구현 보고서:
https://wpt.fyi/results/battery-status
편집자:
Anssi Kostiainen (Intel Corporation)
이전 편집자:
Raphael Kubo da Costa (Intel Corporation)
Mounir Lamouri (Google Inc.) (이전 Mozilla)
피드백:
GitHub w3c/battery (풀 리퀘스트, 새 이슈, 오픈 이슈)
public-device-apis@w3.org 제목에 [battery-status] … 메시지 주제 … 포함 (아카이브)

요약

이 명세서는 호스트 장치의 배터리 상태 정보를 제공하는 API를 정의합니다.

문서 현황

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

Devices and Sensors 워킹 그룹은 이 명세서에 편집적 현대화를 적용하고, API의 보안 및 프라이버시 측면에 대한 자체 검토 및 수정 작업을 거쳐 수평 검토를 요청할 예정입니다. 기존 보안 및 프라이버시 이슈가 공개되어 있습니다.

이 문서는 Devices and Sensors 워킹 그룹에서 권고안 트랙을 사용하여 작업 초안으로 발행되었습니다.

작업 초안으로 발행된다고 해서 W3C 및 그 회원의 지지를 의미하지는 않습니다.

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

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

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

1. 소개

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

배터리 상태 API 명세는 웹 개발자가 호스트 장치의 배터리 상태를 프로그래밍 방식으로 확인할 수 있는 방법을 정의합니다. 장치의 배터리 상태를 알지 못하면, 웹 개발자는 특정 작업에 충분한 배터리 잔량이 있다고 가정하고 웹 애플리케이션을 설계해야 합니다. 이로 인해 개발자가 배터리 상태를 기반으로 의사결정을 내리지 못해 장치의 배터리가 원치 않게 빨리 소모될 수 있습니다. 배터리 상태를 알게 되면, 웹 개발자는 효율적으로 전력을 사용하는 웹 콘텐츠 및 애플리케이션을 제작할 수 있어 사용자 경험이 향상됩니다. 단, 이 API의 단순한 구현은 오히려 배터리 수명에 악영향을 줄 수 있다는 점을 저자들은 인지해야 합니다.

배터리 상태 API는 장치가 충전 중이 아니거나 배터리 잔량이 적을 때 작업을 연기하거나 축소하는 데 사용할 수 있습니다. 예를 들어, 고급 웹 애플리케이션의 전형인 웹 기반 이메일 클라이언트는 장치가 충전 중일 때는 몇 초마다 서버에 새 이메일을 확인할 수 있지만, 충전 중이 아니거나 배터리 잔량이 적을 때는 확인 빈도를 줄일 수 있습니다. 또 다른 예로, 웹 기반 워드 프로세서는 배터리 잔량을 모니터링하여 배터리가 소진되기 전에 변경 사항을 저장함으로써 데이터 손실을 방지할 수 있습니다.

2. 적합성

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

이 문서의 MAY, MUST, SHOULD와 같은 주요 용어들은 BCP 14 [RFC2119] [RFC8174] 에서 설명된 대로 해석되어야 하며, 오직 이 문서에서 대문자로 표시된 경우에만 해당합니다.

이 명세서는 하나의 제품에 적용되는 적합성 기준을 정의합니다. 즉, 명세서에 포함된 인터페이스를 구현하는 사용자 에이전트에 적용됩니다.

3. 보안 및 프라이버시 고려사항

이 명세서에서 정의된 API는 호스트 장치의 배터리 상태를 확인하는 데 사용됩니다.

사용자 에이전트는 배터리 상태 정보를 너무 정밀하게 노출해서 새로운 지문 인식 벡터가 생기지 않도록 SHOULD 합니다.

사용자 에이전트는 사용자에게 배터리 상태 정보 접근을 요청하거나, 또는 프라이빗 브라우징 모드에서 사용자 권한 요구를 강제할 수 있습니다(MAY).

사용자 에이전트는 스크립트에서 API를 사용할 때 사용자에게 방해가 되지 않는 방식으로 알리고 투명성을 높이며, 사용자가 API 접근을 취소할 수 있도록 SHOULD 합니다.

사용자 에이전트는 호스트 장치에 배터리가 없는지, 충전 중인지, 또는 허위 값을 노출하는지 저자가 직접 알 수 없도록 값을 난독화할 수 있습니다(MAY).

4. 개념

이 명세서에서 언급된 작업 소스(task source)배터리 상태 작업 소스입니다.

5. Navigator 인터페이스 확장

WebIDL[SecureContext]
partial interface Navigator {
  Promise<BatteryManager> getBattery();
};
참고

이 메서드는 PR #51 전까지 비보안 컨텍스트에 노출되었습니다.

5.1 내부 슬롯

내부 슬롯 초기값 설명
[[BatteryPromise]] null PromisegetBattery() 호출로 반환됩니다.
[[BatteryManager]] null BatteryManager 인스턴스는 해당 Navigator에서 getBattery()로 생성된 후 연관됩니다.

5.2 getBattery() 메서드

getBattery() 메서드의 단계는 다음과 같습니다:

  1. this.[[BatteryPromise]]null이면, 새 promisethis관련 realm에서 설정합니다.
  2. this관련 글로벌 객체연관 Document"battery" 정책 제어 기능을 사용할 수 없으면, reject this.[[BatteryPromise]]에 "NotAllowedError" DOMException을 반환합니다.
  3. 그 외의 경우:
    1. this.[[BatteryManager]]null이면, 새로운 BatteryManagerthis관련 realm에서 생성합니다.
    2. Resolve this.[[BatteryPromise]]this.[[BatteryManager]]를 사용합니다.
  4. this.[[BatteryPromise]]를 반환합니다.

6. BatteryManager 인터페이스

WebIDL[SecureContext, Exposed=Window]
interface BatteryManager : EventTarget {
    readonly        attribute boolean             charging;
    readonly        attribute unrestricted double chargingTime;
    readonly        attribute unrestricted double dischargingTime;
    readonly        attribute double              level;
                    attribute EventHandler        onchargingchange;
                    attribute EventHandler        onchargingtimechange;
                    attribute EventHandler        ondischargingtimechange;
                    attribute EventHandler        onlevelchange;
};

BatteryManager 인터페이스는 호스트 장치의 현재 배터리 상태 정보를 나타냅니다.

사용자 에이전트배터리 상태 정보를 보고할 수 없음으로 간주되는 경우는, 어떤 속성값도 보고할 수 없을 때(예: 사용자 또는 시스템 설정, 제한 등)입니다.

참고

6.1 내부 슬롯

BatteryManager 인스턴스는 다음과 같은 내부 슬롯으로 생성됩니다:

내부 슬롯 초기값
[[Charging]] true
[[ChargingTime]] 0
[[DischargingTime]] 양의 무한대
[[Level]] 1.0

6.1.1 [[Charging]] 내부 슬롯

[[Charging]] 내부 슬롯은 시스템 배터리의 충전 상태를 나타냅니다. 배터리가 방전 중이면 반드시 false로 설정되어야 하며, 배터리가 충전 중이거나, 구현체가 상태를 보고할 수 없거나, 시스템에 배터리가 없거나 그 밖의 경우에는 true로 설정되어야 합니다.

시스템 배터리의 충전 상태가 변경되면, 사용자 에이전트는 배터리 상태 업데이트 및 알림 알고리즘을 [[Charging]], true 또는 false(배터리 충전/방전 여부에 따라) 그리고 "chargingchange"로 실행해야 합니다.

6.1.2 [[ChargingTime]] 내부 슬롯

[[ChargingTime]] 내부 슬롯은 시스템 배터리가 완전히 충전될 때까지 남은 시간을 초 단위로 나타냅니다. 배터리가 가득 찼거나 시스템에 배터리가 없으면 반드시 0으로 설정되어야 하며, 배터리가 방전 중이거나, 구현체가 남은 충전 시간을 보고할 수 없거나 그 밖의 경우에는 양의 무한대로 설정되어야 합니다.

배터리 충전 시간이 갱신되면, 사용자 에이전트는 배터리 상태 업데이트 및 알림 알고리즘을 [[ChargingTime]], 새 충전 시간(초), "chargingtimechange"로 실행해야 합니다.

6.1.3 [[DischargingTime]] 내부 슬롯

[[DischargingTime]] 속성은 시스템 배터리가 완전히 방전되어 시스템이 중단되기까지 남은 시간을 초 단위로 나타냅니다. 배터리가 충전 중이거나, 구현체가 남은 방전 시간을 보고할 수 없거나, 시스템에 배터리가 없거나 그 밖의 경우에는 반드시 양의 무한대로 설정되어야 합니다.

배터리 방전 시간이 갱신되면, 사용자 에이전트는 배터리 상태 업데이트 및 알림 알고리즘을 [[DischargingTime]], 새 방전 시간(초), "dischargingtimechange"로 실행해야 합니다.

6.1.4 [[Level]] 내부 슬롯

[[Level]] 내부 슬롯은 시스템 배터리의 레벨을 나타냅니다. 시스템 배터리가 모두 소진되어 중단이 임박하면 반드시 0으로 설정되고, 배터리가 가득 찼거나, 구현체가 배터리 레벨을 보고할 수 없거나, 시스템에 배터리가 없을 경우에는 1.0으로 설정되어야 합니다.

배터리 레벨이 갱신되면, 사용자 에이전트는 배터리 상태 업데이트 및 알림 알고리즘을 [[Level]], 새 배터리 레벨, "levelchange"로 실행해야 합니다.

참고

"chargingtimechange", "dischargingtimechange", 그리고 "levelchange" 이벤트가 얼마나 자주 발생하는지에 대한 정의는 구현에 맡깁니다.

6.2 charging 속성

charging getter 단계는 this.[[Charging]]를 반환합니다.

6.3 chargingTime 속성

chargingTime getter 단계는 this.[[ChargingTime]]를 반환합니다.

6.4 dischargingTime 속성

dischargingTime getter 단계는 this.[[DischargingTime]]를 반환합니다.

6.5 level 속성

level getter 단계는 this.[[Level]]를 반환합니다.

6.6 이벤트 핸들러

아래는 이벤트 핸들러(및 해당 이벤트 핸들러 이벤트 타입)로, BatteryManager 객체에서 반드시 속성으로 지원되어야 합니다:

이벤트 핸들러 이벤트 핸들러 이벤트 타입
onchargingchange chargingchange
onchargingtimechange chargingtimechange
ondischargingtimechange dischargingtimechange
onlevelchange levelchange

6.7 알고리즘

내부 슬롯 slot, value, eventName이 주어졌을 때 배터리 상태 업데이트 및 알림을 실행하려면 다음 단계를 수행합니다:

  1. global현재 글로벌 객체로 설정합니다.
  2. globalWindow가 아니면, 이 단계를 중단합니다.
  3. navigatorglobal의 연관 Navigator로 설정합니다.
  4. batteryManagernavigator[[BatteryManager]] 값으로 설정합니다.
  5. batteryManagernull이면 이 단계를 중단합니다.
  6. 글로벌 작업 큐에 추가배터리 상태 작업 소스global을 사용하여 다음 단계를 실행합니다:
    1. batteryManager.slotvalue로 설정합니다.
    2. 이벤트 발생eventNamebatteryManager로 실행합니다.

6.8 다중 배터리

호스트 장치에 배터리가 여러 개 있는 경우, BatteryManager통합된 뷰를 제공해야 합니다.

[[Charging]] 내부 슬롯은 위에서 설명한 대로 적어도 하나의 배터리가 true 상태라면 반드시 true로 설정되어야 합니다. 그렇지 않으면 반드시 false여야 합니다.

[[ChargingTime]] 내부 슬롯은 병렬 충전일 때 각 배터리의 최대 충전 시간, 직렬 충전일 때 각 배터리의 합산 충전 시간으로 설정할 수 있습니다.

[[DischargingTime]] 내부 슬롯은 병렬 방전일 때 각 배터리의 최대 방전 시간, 직렬 방전일 때 각 배터리의 합산 방전 시간으로 설정할 수 있습니다.

[[Level]] 내부 슬롯은 동일 용량 배터리의 평균값 또는 서로 다른 용량 배터리의 가중 평균값으로 설정할 수 있습니다.

7. Permissions Policy 통합

배터리 상태 API는 문자열 "battery"로 식별되는 정책 제어 기능입니다. 기본 허용 목록'self'입니다.

8. 예시

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

이 간단한 예시는 배터리 레벨이 변경될 때마다 콘솔에 출력합니다:

// 프라미스가 resolve될 때 초기값을 얻고 ...
navigator.getBattery().then(function(battery) {
  console.log(battery.level);
  // ... 이후의 모든 업데이트도.
  battery.onlevelchange = function() {
    console.log(this.level);
  };
});

또는 addEventListener() 메서드를 사용한 동일 예시:

navigator.getBattery().then(function(battery) {
  console.log(battery.level);
  battery.addEventListener('levelchange', function() {
    console.log(this.level);
  });
});

다음 예시는 충전 상태, 레벨, 남은 시간을 분 단위로 표시하는 인디케이터를 업데이트합니다:

<!DOCTYPE html>
<html>
<head>
  <title>Battery Status API Example</title>
  <script>
    window.onload = function () {
      function updateBatteryStatus(battery) {
        document.querySelector('#charging').textContent = battery.charging ? 'charging' : 'not charging';
        document.querySelector('#level').textContent = battery.level;
        document.querySelector('#dischargingTime').textContent = battery.dischargingTime / 60;
      }

      navigator.getBattery().then(function(battery) {
        // 프라미스가 resolve될 때 초기 배터리 상태를 업데이트 ...
        updateBatteryStatus(battery);

        // ... 이후의 모든 업데이트도.
        battery.onchargingchange = function () {
          updateBatteryStatus(battery);
        };

        battery.onlevelchange = function () {
          updateBatteryStatus(battery);
        };

        battery.ondischargingtimechange = function () {
          updateBatteryStatus(battery);
        };
      });
    };
  </script>
</head>
<body>
  <div id="charging">(충전 상태 알 수 없음)</div>
  <div id="level">(배터리 레벨 알 수 없음)</div>
  <div id="dischargingTime">(방전 시간 알 수 없음)</div>
</body>
</html>

A. 색인

A.1 이 명세서에서 정의된 용어

A.2 참조로 정의된 용어

B. IDL 색인

WebIDL[SecureContext]
partial interface Navigator {
  Promise<BatteryManager> getBattery();
};

[SecureContext, Exposed=Window]
interface BatteryManager : EventTarget {
    readonly        attribute boolean             charging;
    readonly        attribute unrestricted double chargingTime;
    readonly        attribute unrestricted double dischargingTime;
    readonly        attribute double              level;
                    attribute EventHandler        onchargingchange;
                    attribute EventHandler        onchargingtimechange;
                    attribute EventHandler        ondischargingtimechange;
                    attribute EventHandler        onlevelchange;
};

C. 감사의 글

그룹은 Mounir Lamouri, Jonas Sicking, 그리고 Mozilla WebAPI 팀 전체에 프로토타입 구현을 기반으로 한 소중한 피드백에 깊이 감사드립니다. System Information API와 Device Orientation Event 명세를 만든 분들께도 초기 영감에 감사드립니다. 또한 Page Visibility 명세를 가져와서, 실제로 가치 있는 웹 사용 사례들이 어떻게 이 명세에도 적용되는지를 소개장에서 다루도록 동기를 준 모든 분께 고마움을 전합니다. Device APIs 워킹 그룹의 모든 참가자와 실질적인 피드백을 보내주신 분들께, 그리고 그렇게 함으로써 모두를 위한 더 나은 웹을 만들어주신 분들께 특별히 감사드립니다. 마지막으로, Lukasz Olejnik, Gunes Acar, Claude Castelluccia, Claudia Diaz에게 이 API의 프라이버시 분석에 대한 감사를 전합니다.

D. 참고 문헌

D.1 규범적 참고 문헌

[dom]
DOM 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 언어 명세. Ecma International. URL: https://tc39.es/ecma262/multipage/
[html]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 2024년 9월 25일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions-policy-1/
[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]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/