1. Mục đích
Bài viết này hướng dẫn cách xử lý quyền truy cập vị trí trong mini-program WeChat và WeCom sử dụng framework Taro. Khi người dùng chưa cấp quyền, hệ thống sẽ hướng dẫn họ thực hiện các bước để cấp quyền một cách phù hợp.
2. Các trường hợp cần xử lý
Có ba trường hợp chính cần kiểm tra và xử lý khi người dùng chưa cấp quyền vị trí:
2.1. Hệ thống thiết bị chưa bật định vị
Trường hợp này không thể chuyển hướng người dùng đến trang cài đặt hệ thống thông qua mã.
2.2. Ứng dụng WeChat/WeCom chưa được cấp quyền
Trường hợp này có thể sử dụng mã để chuyển hướng người dùng đến trang cài đặt ứng dụng.
2.3. Mini-program chưa được cấp quyền
Trường hợp này có thể sử dụng mã để chuyển hướng người dùng đến trang cài đặt mini-program.
3. Mã nguồn
Dưới đây là một hàm xử lý quyền vị trí, bạn có thể tích hợp vào dự án của mình. Hãy thay thế hàm hienThiHopThoaiHeThong bằng component dialog thực tế của dự án.
/**
* Hàm kiểm tra và yêu cầu quyền truy cập vị trí.
* @returns {Promise<boolean>} Trả về true nếu đã có quyền, false nếu không.
*/
async function xuLyQuyenViTri(): Promise<boolean> {
try {
// Bước 1: Kiểm tra cài đặt định vị của hệ thống
const thongTinHeThong = await taro.getSystemInfo();
if (!thongTinHeThong.locationEnabled) {
// Hiển thị thông báo yêu cầu người dùng bật định vị trong cài đặt hệ thống
hienThiHopThoaiHeThong(
'Cảnh báo',
'Hệ thống của bạn chưa bật định vị. Vui lòng vào Cài đặt để bật tính năng này.'
);
return false;
}
// Bước 2: Kiểm tra cài đặt ủy quyền của ứng dụng WeChat/WeCom
const thietLapUngDung = await taro.getAppAuthorizeSetting();
if (thietLapUngDung.locationAuthorized !== 'authorized') {
// Hiển thị thông báo yêu cầu người dùng bật định vị trong cài đặt ứng dụng
hienThiHopThoaiHeThong(
'Cảnh báo',
'Ứng dụng WeChat/WeCom chưa được cấp quyền định vị. Vui lòng vào Cài đặt để cấp quyền.'
);
// Mở trang cài đặt ủy quyền của ứng dụng
await taro.openAppAuthorizeSetting();
return false;
}
// Bước 3: Kiểm tra cài đặt ủy quyền của mini-program
const thietLapMiniProgram = await taro.getSetting();
const quyenViTriMiniProgram = thietLapMiniProgram.authSetting['scope.userLocation'];
if (quyenViTriMiniProgram === undefined) {
// Trường hợp chưa từng yêu cầu quyền, hãy yêu cầu ngay
const ketQua = await taro.authorize({ scope: 'scope.userLocation' });
if (ketQua.errMsg === 'authorize:ok') {
// Thành công, có thể thực hiện các thao tác cần thiết với vị trí
return true;
} else {
// Người dùng từ chối, có thể xử lý logic ở đây
return false;
}
} else if (!quyenViTriMiniProgram) {
// Trường hợp đã từ chối trước đó, hướng dẫn mở cài đặt mini-program
hienThiHopThoaiHeThong(
'Cảnh báo',
'Mini-program chưa được cấp quyền truy cập vị trí. Vui lòng cấp quyền trong Cài đặt.'
);
await taro.openSetting();
return false;
}
// Nếu đến đây, có nghĩa là đã có quyền truy cập vị trí
return true;
} catch (error) {
console.error('Đã xảy ra lỗi khi xử lý quyền vị trí:', error);
return false;
}
}
/**
* Hàm trợ giúp để hiển thị hộp thoại.
* @param {string} tieuDe Tiêu đề của hộp thoại.
* @param {string} noiDung Nội dung của hộp thoại.
*/
function hienThiHopThoaiHeThong(tieuDe: string, noiDung: string) {
// Thay thế bằng component dialog thực tế của dự án, ví dụ: $dialog, Taro.UI.Dialog, etc.
console.log(`[Hộp thoại] ${tieuDe}: ${noiDung}`);
// Ví dụ:
// $dialog({
// title: tieuDe,
// render: () => noiDung,
// confirmButton: true,
// handleConfirm: () => {}
// });
}
4. Cách sử dụng
Sau khi định nghĩa hàm, bạn có thể gọi nó trước khi thực hiện các chức năng cần quyền vị trí.
// Gọi hàm để kiểm tra và yêu cầu quyền
const coQuyenViTri = await xuLyQuyenViTri();
if (coQuyenViTri) {
// Thực hiện logic nghiệp vụ của bạn ở đây
// Ví dụ: Lấy tọa độ hiện tại, hiển thị bản đồ, v.v.
console.log('Đã có quyền vị trí, bắt đầu thực hiện chức năng.');
} else {
console.log('Không có quyền vị trí, không thể thực hiện chức năng.');
}