API Quyền cho web

Nếu đã từng làm việc với API vị trí địa lý trước đây, thì bạn nên kiểm tra xem mình có được phép sử dụng Vị trí địa lý mà không tạo lời nhắc hay không. Đơn giản là điều này là không thể. Bạn phải yêu cầu vị trí hiện tại. Việc này sẽ cho biết trạng thái cấp quyền hoặc khiến người dùng nhìn thấy lời nhắc.

Không phải API nào cũng hoạt động theo cách này. API thông báo có cách riêng để cho phép bạn kiểm tra trạng thái quyền hiện tại thông qua Notification.permission.

Khi nền tảng web phát triển trong API, cần có một cách thức tiêu chuẩn duy nhất để nhà phát triển kiểm tra trạng thái của quyền thay vì phải nhớ cách hoạt động của từng API. Permissions API (API Quyền) (có trong Chrome phiên bản 43) là một công cụ tiêu chuẩn và duy nhất để kiểm tra trạng thái quyền của một API.

permissions.query()

Kiểm tra trạng thái của một quyền bằng phương thức permissions.query(). Thao tác này sẽ trả về trạng thái là đã cấp (bạn có quyền), bị từ chối (bạn bị chặn truy cập vào API) hoặc lời nhắc (người dùng cần được nhắc). Ví dụ:

// 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);
    };
    });

Phương thức truy vấn này sẽ lấy đối tượng PermissionDescriptor, nơi bạn xác định tên của quyền. Phản hồi là một Promise giải quyết cho đối tượng PermissionStatus. Từ đối tượng này, bạn có thể kiểm tra trạng thái với permissionStatus.state đối với "granted", "denied" hoặc "prompt". Bạn cũng có thể triển khai một trình xử lý sự kiện cho permissionStatus.onchange và xử lý các thay đổi đối với trạng thái cấp quyền.

Phần mô tả quyền được hỗ trợ

Trong ví dụ trên, chúng tôi làm nổi bật cách truy vấn trạng thái quyền cho tính năng định vị vị trí bằng chỉ số mô tả quyền sau đây: {name:'geolocation'}.

Bộ mô tả quyền Thông báo tương tự ở chỗ chỉ yêu cầu thuộc tính tên: {name:'notifications'}.

Mỗi hàm Push (Đẩy) và midi đều có một thông số bổ sung dành riêng cho API đó.

Đối với quyền đẩy, bạn có thể cung cấp tham số userVisibleOnly. Thuộc tính này cho biết bạn muốn hiện thông báo cho mọi thông báo đẩy hay gửi thông báo đẩy ở chế độ im lặng (Hiện tại, Chrome chỉ hỗ trợ thông báo đẩy có thông báo). Bạn sẽ sử dụng như sau:

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

Midi cho phép tham số sysex. Mã này cho biết liệu bạn có cần và/hoặc nhận thông báo dành riêng cho hệ thống hay không. Đối với midi, đây sẽ là:

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

Yêu cầu quyền

Việc yêu cầu người dùng cấp quyền sẽ phụ thuộc vào API cụ thể. Ví dụ: tính năng định vị vị trí sẽ hiển thị lời nhắc cấp quyền khi bạn gọi getCurrentPosition().

navigator.geolocation.getCurrentPosition(function(position) {
    console.log('Geolocation permissions granted');
    console.log('Latitude:' + position.coords.latitude);
    console.log('Longitude:' + position.coords.longitude);
});

Trong khi đó, thông báo sẽ nhắc người dùng khi bạn gọi 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');
});

Vấn đề ở đây là Permissions API cung cấp một cách nhất quán để theo dõi trạng thái của các quyền trong khi có thể hỗ trợ nhiều loại API hiện có trên web.

Ưu điểm lớn của việc này là cho phép bạn xây dựng trải nghiệm tốt hơn cho người dùng, chỉ nhắc khi người dùng biết rõ lý do bạn cần thêm đặc quyền và tận dụng tối đa các API này khi biết mình đã được cấp quyền.

Bạn có thể xem toàn bộ các ví dụ tại đây.

Hỗ trợ trình duyệt

Chrome là trình duyệt đầu tiên triển khai tính năng này, Mozilla đang lên kế hoạch về việc cung cấp trình duyệt này và Microsoft đã thể hiện sự quan tâm đến API.

Vấn đề đã biết

  • Vị trí địa lý sẽ không hiển thị lại lời nhắc nếu người dùng bỏ qua yêu cầu cấp quyền. Tuy nhiên, trạng thái cấp quyền vẫn là "lời nhắc". [bugs.chromium.org]