Permissions API للويب

إذا سبق لك استخدام Geolocation 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 ومعالجة التغييرات في حالة الأذونات.

عناصر PermissionDescriptor المتوافقة

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