웹용 Permissions API

이전에 Geolocation API를 사용한 적이 있다면 메시지를 표시하지 않고 위치정보를 사용할 권한이 있는지 확인하고 싶을 것입니다. 불가능한 일이었습니다. 현재 위치를 요청해야 했는데 이렇게 하면 권한 상태를 나타내거나 사용자에게 메시지가 표시됩니다.

모든 API가 이러한 방식으로 작동하는 것은 아닙니다. Notifications API에는 Notification.permission을 통해 현재 권한 상태를 확인할 수 있는 자체 방법이 있습니다.

API의 웹 플랫폼이 성장함에 따라 개발자가 각 API의 작동 방식을 기억할 필요 없이 권한의 상태를 확인할 수 있는 하나의 표준 방법이 있어야 합니다. Chrome 버전 43에서 사용할 수 있는 Permission API는 API의 권한 상태를 확인하는 단일 표준 방법입니다.

permissions.query()

permissions.query() 메서드를 사용하여 권한 상태를 확인합니다. 그러면 부여됨 (권한이 있음), 거부됨 (API 액세스가 차단됨) 또는 메시지 (사용자에게 메시지를 표시해야 함)의 상태가 반환됩니다. 예를 들면 다음과 같습니다.

// Check for Geolocation API permissions
navigator.permissions.query({name:'geolocation'})
    .then(function(permissionStatus) {
    console.log('geolocation permission state is ', permissionStatus.state);

    permissionStatus.onchange = function() {
        console.log('geolocation permission state has changed to ', this.state);
    };
    });

쿼리 메서드는 권한 이름을 정의하는 PermissionDescriptor 객체를 사용합니다. 응답은 PermissionStatus 객체를 확인하는 Promise입니다. 이 객체에서 permissionStatus.state를 사용하여 'granted', 'denied' 또는 'prompt'의 상태를 확인할 수 있습니다. permissionStatus.onchange의 이벤트 핸들러를 구현하고 권한 상태의 변경사항을 처리할 수도 있습니다.

지원되는 PermissionDescriptor

위 예에서는 {name:'geolocation'} 권한 설명자를 사용하여 위치정보의 권한 상태를 쿼리하는 방법을 중점적으로 설명합니다.

알림 권한 설명어는 이름 속성({name:'notifications'})만 필요하다는 점에서 유사합니다.

Pushmidi에는 각각 해당 API와 관련된 추가 매개변수가 있습니다.

푸시 권한의 경우 userVisibleOnly 매개변수를 제공할 수 있습니다. 이는 모든 푸시 메시지에 대한 알림을 표시할지, 아니면 자동 푸시 알림을 보낼 수 있는지를 나타냅니다 (현재 Chrome에서는 알림이 있는 푸시 메시지만 지원). 다음과 같이 사용하면 됩니다.

navigator.permissions.query({name:'push', userVisibleOnly:true})

Midi는 sysex 매개변수를 허용합니다. 시스템 전용 메시지를 받아야 하는지 또는 수신해야 하는지를 나타냅니다. MIDI의 경우 다음과 같습니다.

navigator.permissions.query({name:'midi', sysex:true})

권한 요청

사용자에게 권한을 요청하는 방식은 API마다 다릅니다. 예를 들어 getCurrentPosition()를 호출할 때 위치정보에서 권한 메시지를 표시합니다.

navigator.geolocation.getCurrentPosition(function(position) {
    console.log('Geolocation permissions granted');
    console.log('Latitude:' + position.coords.latitude);
    console.log('Longitude:' + position.coords.longitude);
});

반면 알림은 requestPermission()를 호출할 때 사용자에게 메시지를 표시합니다.

Notification.requestPermission(function(result) {
    if (result === 'denied') {
    console.log('Permission wasn\'t granted. Allow a retry.');
    return;
    } else if (result === 'default') {
    console.log('The permission request was dismissed.');
    return;
    }
    console.log('Permission was granted for notifications');
});

여기서 요점은 Permission API를 사용하면 현재 웹에서 제공되는 API의 범위를 지원하면서 권한 상태를 모니터링하는 일관된 방법을 허용한다는 것입니다.

이 기능의 큰 장점은 사용자를 위해 더 나은 환경을 빌드할 수 있다는 것입니다. 추가 권한이 필요한 이유가 명확한 경우에만 사용자에게 메시지를 표시하고 권한이 부여된 것을 알았을 때 이러한 API를 최대한 활용할 수 있습니다.

전체 예는 여기에서 확인할 수 있습니다.

브라우저 지원

Chrome은 이를 구현한 첫 번째 브라우저이고, Mozilla는 이를 제공할 계획이며, Microsoft는 API에 관심을 보였습니다.

알려진 문제

  • 사용자가 권한 요청을 닫으면 위치정보에 메시지가 다시 표시되지 않습니다. 그러나 권한 상태는 여전히 '프롬프트'입니다. [bugs.chromium.org]