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);
};
});
query メソッドは PermissionDescriptor オブジェクトを受け取ります。ここで、権限の名前を定義します。レスポンスは、PermissionStatus オブジェクトに解決される Promise です。このオブジェクトから、permissionStatus.state
を使用して「granted」、「denied」、「prompt」のステータスを確認できます。permissionStatus.onchange
のイベント ハンドラを実装して、権限状態の変更を処理することもできます。
サポートされている PermissionDescriptor
上記の例では、{name:'geolocation'}
という権限記述子を使用して、位置情報の権限状態をクエリする方法を示しています。
通知権限記述子は、名前属性 {name:'notifications'}
のみが必要であるという点で類似しています。
Push と midi には、それぞれ API に固有の追加パラメータがあります。
push 権限には、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 がこの API を実装した最初のブラウザであり、Mozilla もリリースを計画しており、Microsoft もこの API に関心を示しています。
既知の問題
- ユーザーが権限リクエストを閉じると、位置情報のプロンプトは再度表示されません。ただし、権限のステータスは「プロンプト」のままです。[bugs.chromium.org]