クライアントがページにインストールする小さなスクリプトを作成しています。位置情報は必須ではありませんが、存在する場合はあると便利です。クライアント ページが地理位置情報を要求したかどうか、およびユーザーが別のプロンプトを作成せずに緯度と経度の取得を許可するかどうかを確認する方法はありますか?
5 に答える
geolocation API では不可能ですが、新しい許可 API では可能です
このコードは、座標を取得したいが、座標はそれほど重要ではなく、geoIP にフォールバックする可能性があるため、プロンプト ダイアログでユーザーを煩わせたくない場合に役立ちます。
function getCoords() {
return new Promise((resolve, reject) =>
navigator.permissions ?
// Permission API is implemented
navigator.permissions.query({
name: 'geolocation'
}).then(permission =>
// is geolocation granted?
permission.state === "granted"
? navigator.geolocation.getCurrentPosition(pos => resolve(pos.coords))
: resolve(null)
) :
// Permission API was not implemented
reject(new Error("Permission API is not supported"))
)
}
getCoords().then(coords => console.log(coords))
これは、許可が与えられていない場合は null に解決され、一部の JavaScript コードがブラウザーでサポートされていない場合はエラーがキャストされ、許可されている場合は座標に解決されます。
ウィンドウ オブジェクトを調べることで、機能が存在するかどうかを検出できます。
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition(...);
}
これにより、単一のユーザー プロンプトが表示され、ページと位置情報を共有するかどうかをユーザーに尋ねます。
ブラウザで地理位置情報が利用できない場合、これはまったく実行されません。
**編集** 地理位置情報へのアクセスを許可するために、この *ページ読み込み* でユーザーに既にプロンプトを表示している場合は、再度プロンプトを表示することはありません。ユーザーが移動してこのページに戻ると、再度プロンプトが表示されます。
その後、そのページ セッション中にプロンプトを表示せずに API を呼び出すことができます。
プロンプトが表示されるかどうかは、ブラウザとその「プライバシー」設定に依存するようです。Safari 6 には 3 つの設定があります。サイトごとに 1 回プロンプト、サイトごとに 1 日 1 回プロンプト、および拒否です。Chrome 23 には 3 つの設定があります。すべて許可、確認、すべて拒否です。ユーザーを煩わすことなく、既に許可されているかどうかを確認する方法があれば、確かにうまくいくでしょう。