اگر قبلاً با Geolocation API کار کردهاید، به احتمال زیاد میخواستید بدون ایجاد درخواست، بررسی کنید که آیا مجوز استفاده از موقعیت جغرافیایی را دارید یا خیر. این به سادگی ممکن نبود. شما باید موقعیت فعلی را درخواست میکردید و این وضعیت مجوز را نشان میدهد یا باعث میشود یک درخواست به کاربر نشان داده شود.
همه API ها به این شکل کار نمی کنند. Notifications API راه خاص خود را دارد که به شما امکان می دهد وضعیت مجوز فعلی را از طریق Notification.permission بررسی کنید.
همانطور که پلتفرم وب در APIها رشد می کند، باید یک راه استاندارد و واحد برای توسعه دهندگان وجود داشته باشد تا وضعیت مجوز را به جای اینکه به یاد بیاورند هر API چگونه کار می کند، وجود داشته باشد. Permission API ، موجود در نسخه 43 کروم ، این راه استاندارد و واحد برای بررسی وضعیت مجوز یک 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 را می گیرد، جایی که شما نام مجوز را تعریف می کنید. پاسخ یک Promise است که به یک شی PermissionStatus حل می شود. از این شی، می توانید وضعیت را با permissionStatus.state
برای "granted"، "denied" یا "prompt" بررسی کنید. همچنین میتوانید یک رویداد کنترلکننده برای permissionStatus.onchange
پیادهسازی کنید و تغییرات در وضعیت مجوز را مدیریت کنید.
PermissionDescriptors پشتیبانی شده
در مثال بالا، نحوه پرس و جو کردن وضعیت مجوز برای موقعیت جغرافیایی با توصیف کننده مجوز زیر را برجسته می کنیم: {name:'geolocation'}
.
توصیف کننده مجوز اعلان از این نظر مشابه است که فقط به یک ویژگی نام نیاز دارد: {name:'notifications'}
.
Push و midi هر کدام یک پارامتر اضافی دارند که مختص آن 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ها استفاده کنید.
شما می توانید مجموعه کاملی از نمونه ها را در اینجا بیابید .
پشتیبانی مرورگر
کروم اولین مرورگری است که این را اجرا می کند، موزیلا در حال برنامه ریزی برای ارسال آن است و مایکروسافت به API علاقه نشان داده است.
مسائل شناخته شده
- اگر کاربر درخواست مجوز را رد کند، موقعیت جغرافیایی دوباره درخواستی را نشان نمی دهد. وضعیت مجوز با این حال "سریع" باقی می ماند. [ bugs.chromium.org ]