Permissions API للويب

إذا كنت قد عملت باستخدام واجهة برمجة تطبيقات الموقع الجغرافي من قبل، فربما كنت تريد التحقق مما إذا كان لديك إذن باستخدام الموقع الجغرافي بدون إرسال طلب. لم يكن هذا ممكنا. كان عليك طلب الموضع الحالي، وسيشير ذلك إلى حالة الإذن أو يؤدي إلى عرض طلب للمستخدم.

لا تعمل جميع واجهات برمجة التطبيقات بهذه الطريقة. تتميز واجهة برمجة التطبيقات Notifications API بطريقتها الخاصة التي تتيح لك التحقّق من حالة الإذن الحالية من خلال Notification.permission.

مع تزايد النظام الأساسي للويب على واجهات برمجة التطبيقات، يجب أن تتوفر طريقة موحّدة وعادية للمطوّرين يمكنهم من خلالها التحقّق من حالة الإذن بدلاً من الحاجة إلى تذكُّر طريقة عمل كل واجهة برمجة تطبيقات. تم تصميم Permission API، المتوفّرة في الإصدار 43 من Chrome، لتكون هذه الطريقة العادية الوحيدة للتحقّق من حالة إذن واجهة برمجة التطبيقات.

permissions.query()

التحقّق من حالة الإذن باستخدام طريقة permissions.query() سيؤدي هذا إلى عرض حالة "ممنوح" (لديك إذن) أو رفض (تم حظرك من الوصول إلى واجهة برمجة التطبيقات) أو طلب (يجب أن يُطلب من المستخدم). مثال:

// 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 الذي تحدّد فيه اسم الإذن. الاستجابة هي حل وعد لكائن PermissionStatus. من خلال هذا العنصر، يمكنك التحقّق من الحالة باستخدام permissionStatus.state عن "تم منح الإذن" أو "مرفوض" أو "طلب". يمكنك أيضًا تنفيذ معالج أحداث في permissionStatus.onchange ومعالجة التغييرات في حالة الإذن.

أدوات وصف الأذونات المتوافقة

في المثال أعلاه، نسلط الضوء على كيفية الاستعلام عن حالة الإذن لرصد الموقع الجغرافي باستخدام واصف الأذونات التالي: {name:'geolocation'}.

يشبه واصف إذن إرسال الإشعارات في أنّه لا يتطلّب سوى سمة الاسم: {name:'notifications'}.

يحتوي كل من Push وmidi على معلَمة إضافية خاصة بواجهة برمجة التطبيقات هذه.

بالنسبة إلى إذن الدفع، يمكنك توفير مَعلمة userVisibleOnly. ويشير هذا إلى ما إذا كنت تريد عرض إشعار لكل رسالة فورية أو أن تكون قادرًا على إرسال إشعارات فورية صامتة (لا يدعم Chrome في الوقت الحالي سوى الرسائل الفورية التي تتضمن إشعارات). ستستخدمه على النحو التالي:

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

يتيح Midi استخدام مَعلمة sysex. يشير هذا إلى ما إذا كنت بحاجة إلى تلقّي رسائل حصرية للنظام و/أو تلقّيها. بالنسبة إلى جهاز midi، سيكون هذا النحو:

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

طلب الأذونات

يعتمد طلب الإذن من المستخدم على واجهة برمجة التطبيقات المحددة. على سبيل المثال، سيعرض رصد الموقع الجغرافي طلبًا للحصول على إذن عند استدعاء 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 تتيح طريقة متسقة لمراقبة حالة الأذونات مع القدرة على إتاحة مجموعة من واجهات برمجة التطبيقات المتوفّرة حاليًا على الويب.

الميزة الكبيرة لذلك هي أنها تتيح لك تقديم تجارب أفضل للمستخدمين، ولا تطلب ذلك إلا عندما يكون واضحًا للمستخدم سبب احتياجك إلى امتيازات إضافية، فضلاً عن الاستفادة الكاملة من واجهات برمجة التطبيقات هذه عند معرفة أنك حصلت على إذن.

يمكنك الاطّلاع على مجموعة كاملة من الأمثلة هنا.

التوافق مع المتصفح

Chrome هو أول متصفح يطبّق ذلك، وتخطط Mozilla لشحن هذا الحلّ، وقد أظهرت Microsoft اهتمامها بواجهة برمجة التطبيقات.

المشاكل المعروفة

  • لن يؤدي رصد الموقع الجغرافي إلى إعادة إظهار الطلب إذا رفض المستخدم طلب الإذن. في المقابل، تظل حالة الإذن "مطالبة". [bugs.chromium.org]