אם כבר עבדתם בעבר עם Geolocation API, סביר להניח שרציתם לבדוק אם יש לכם הרשאה להשתמש במיקום הגאוגרפי בלי להציג הודעה. פשוט לא ניתן היה לעשות זאת. הייתם צריכים לבקש את המיקום הנוכחי, והוא היה מציין את מצב ההרשאה או יגרום להצגת הנחיה למשתמש.
לא כל ממשקי ה-API פועלים כך. ל-Notifications API יש דרך משלו לאפשר לכם לבדוק את מצב ההרשאה הנוכחי באמצעות Notification.permission.
ככל שמספר ממשקי ה-API בפלטפורמת האינטרנט גדל, צריכה להיות דרך סטנדרטית אחת למפתחים לבדוק את סטטוס ההרשאה, במקום לזכור איך כל ממשק API פועל. Permission API, שזמין ב-גרסה 43 של Chrome, נועד להיות הדרך היחידה והסטנדרטית לבדוק את סטטוס ההרשאה של ממשק 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 שבו מגדירים את שם ההרשאה. התשובה היא Promise שמתמרה לאובייקט PermissionStatus. מהאובייקט הזה אפשר לבדוק את המצב באמצעות permissionStatus.state
כדי לקבל את הערכים 'granted', 'denied' או 'prompt'. אפשר גם להטמיע טיפול באירועים עבור permissionStatus.onchange
ולטפל בשינויים במצב ההרשאה.
PermissionDescriptors נתמכים
בדוגמה שלמעלה, הדגשנו איך לשלוח שאילתה לגבי מצב ההרשאה למיקום גיאוגרפי באמצעות מתאר ההרשאה הבא: {name:'geolocation'}
.
רכיב ה-descriptor של ההרשאה Notification דומה בכך שהוא מחייב רק מאפיין שם: {name:'notifications'}
.
ל-Push ול-midi יש פרמטר נוסף שספציפי ל-API הזה.
להרשאת ה-push, אפשר לספק פרמטר userVisibleOnly
.
ההגדרה הזו קובעת אם תוצג התראה לכל הודעת Push או אם תוכלו לשלוח התראות Push שקשות (כרגע, Chrome תומך רק בהתראות Push עם התראות). כך משתמשים בו:
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]