Posted at

Chrome 43から各種Permissionの状態を問い合わせるPermissions APIが提供されます

More than 3 years have passed since last update.

Webブラウザが提供するAPIの中には、事前にユーザが許可しなければ結果を得られないAPIがいくつかあります。GeolocationやNotificationなどがそうなのですが、ユーザから権限を取得するための方法や、権限を得たのかどうか問い合わせるための仕組みが、今まではAPIごとに異なるやり方になっていました。これを改善するために、Permissions APIがChrome 43から提供されます。そのアナウンスがHTML5Rockの更新情報として流れていましたので、さっそく日本語訳してみました。そのようなAPIを利用されている方々は、ぜひ下記の内容を読んで、今後の実装作業の参考にしてください。

原文: http://updates.html5rocks.com/2015/04/permissions-api-for-the-web


Permissions API for the Web

もしあなたが過去にGeolocation API( https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/Using_geolocation )を使って仕事をしたことがあったら、たぶんプロンプトが引き起こされることなしに緯度経度情報を使うための権利を持っているかどうかをチェックしたかったでしょう。これは単純に可能ではありませんでした。あなたは現在位置を要求し、そしてこれは権限状態を示すか、またはユーザに表示されるプロンプトを引き起こしていました。

全てのAPIがこの方法で動作するわけではありません。Notification APIは、Notification.permission( https://notifications.spec.whatwg.org/#permission )を経由してあなたが現在の権限状況をチェックすることができる独自の方法を持っています。

APIにおいてWebプラットフォームが成長する際には、全てのAPIがそれぞれどのように機能するかを覚えなければならない状況よりも、開発者に権限の状況をチェックするための単一で標準的な方法が求められます。Chromeバージョン43( https://www.chromestatus.com/feature/6376494003650560 )にて利用可能になるPermission API( https://w3c.github.io/permissions/ )は、APIの権限状況をチェックするための単一で標準的な方法となることが計画されています。


permissions.query()

permissions.query()メソッドを利用して、権限状況をチェックします。これはgranted(権限を持っている)、denied(APIのアクセスをブロックした)、またはprompt(ユーザに問い合わせが必要)の状況( https://w3c.github.io/permissions/#h-status-of-a-permission )を返すでしょう。例です:

// Check for Geolocation API permissions  

navigator.permissions.query({name:'geolocation'}).then(function(permissionStatus)
{
console.log('geolocation permission status is ', permissionStatus.status);
permissionStatus.onchange = function() {
console.log('geolocation permission status has changed to ', this.status);
};
});

queryメソッドは、権限の名前を定義したPermissionDescriptor( https://w3c.github.io/permissions/#h-permission-descriptor )オブジェクトを受け取ります。その結果は、PermissionStatus( https://w3c.github.io/permissions/#idl-def-PermissionStatus )オブジェクトを解決するPromiseです。このオブジェクトから、あなたはpermissionStatus.statusを使って'granted', 'denied', または'prompt'のいずれかの状況をチェックすることが可能です。また、permissionStatus.onchangeイベントハンドラを実装することができ、APIの権限状況の変更を扱うことも可能です。


サポートされるPermissionDescriptor

上記の例において、緯度経度情報のために{name: 'geolocation'}というpermission descriptorを使って権限状況を問い合わせた方法について注目してみます。

Notification permission descriptorは、{name: 'notification'}というように名前の属性のみが求められる点で、上記と似ています。

Push( https://w3c.github.io/permissions/#h-push )とmidi( https://w3c.github.io/permissions/#h-midi )は、それぞれそのAPIに特有な追加パラメータを持ちます。

Push権限に対して、あなたはuserVisibleパラメータを与えることができます。これは、全てのプッシュメッセージの通知を表示するか、もしくはサイレントプッシュ通知を送ることができるようになるかを指示します(現在は通知のプッシュメッセージはChromeのみがサポートします)。以下のように使用することができるでしょう:

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

Midiはsysexパラメータを許可します。これは、システム排他メッセージを受け取る必要があるかどうかを指示します。Midiに対してこれは以下のようになるでしょう:

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


権限の要求

ユーザからの権限の要求は、特定のAPIに依存します。例えば、あなたがgetCurrentPosition()を呼び出すと、geolocationは権限プロンプトを表示するでしょう。

navigator.geolocation.getCurrentPosition(function(position) {  

console.log('Geolocation permissions granted');
console.log('Latitude:' + position.coords.latitude);
console.log('Longitude:' + position.coords.longitude);
});

一方では、notificationは、あなたが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');
});

ここでのポイントは、現在のWeb上のAPIの範囲をサポートしながらも、Permission APIは権限の状況を監視するための一貫的な方法を提供するということです。

この大きな利点は、あなたがユーザに対してより良い体験を構築することができるということです。なぜあなたが追加の権限を必要とするかがユーザに明らかである時のみプロンプトを表示する ことができ、あなたが権限を得たことを知った際にはこれらのAPIの全ての利点を得るでしょう。

あなたはここで全てのサンプル集を見つけることができます( https://googlechrome.github.io/samples/permissions/ )。


ブラウザサポート

Chromeがこれを実装する最初のブラウザです。Mozillaはこれを入れることを検討しています。MicrosoftはこのAPIに興味を示しています。


既知のバグ

ユーザが権限要求を拒否した場合、Geolocationはプロンプトを再表示しません。しかし、権限状況は'prompt'のままです。[ http://crbug.com/476509 ]