Geolocation API ช่วยให้คุณค้นหาตำแหน่งของผู้ใช้ได้เมื่อได้รับความยินยอมจากผู้ใช้
Geolocation API ช่วยให้คุณค้นพบตำแหน่งของผู้ใช้ได้โดยได้รับความยินยอมจากผู้ใช้ คุณสามารถใช้ฟังก์ชันนี้เพื่อดำเนินการต่างๆ เช่น นำทางผู้ใช้ไปยังจุดหมาย และติดแท็กภูมิศาสตร์ให้กับเนื้อหาที่ผู้ใช้สร้างขึ้น เช่น การทำเครื่องหมายสถานที่ที่ถ่ายภาพ
นอกจากนี้ Geolocation API ยังช่วยให้คุณเห็นตำแหน่งของผู้ใช้และติดตามผู้ใช้ขณะที่เคลื่อนที่ไปมา โดยต้องได้รับความยินยอมจากผู้ใช้เสมอ (และเฉพาะขณะที่หน้าเว็บเปิดอยู่เท่านั้น) ซึ่งทำให้เกิด Use Case ที่น่าสนใจมากมาย เช่น การผสานรวมกับระบบแบ็กเอนด์เพื่อเตรียมคำสั่งซื้อสำหรับการรับสินค้าหากผู้ใช้อยู่ใกล้ๆ
คุณต้องคำนึงถึงหลายสิ่งหลายอย่างเมื่อใช้ Geolocation API คู่มือนี้จะอธิบายกรณีการใช้งานและโซลูชันที่พบบ่อย
สรุป
- ใช้ตำแหน่งทางภูมิศาสตร์เมื่อเป็นประโยชน์ต่อผู้ใช้
- ขอสิทธิ์เพื่อตอบสนองต่อท่าทางผู้ใช้อย่างชัดเจน
- ใช้การตรวจหาฟีเจอร์ในกรณีที่เบราว์เซอร์ของผู้ใช้ไม่รองรับตำแหน่งทางภูมิศาสตร์
- อย่าเพียงแค่เรียนรู้วิธีใช้ตำแหน่งทางภูมิศาสตร์ แต่ให้เรียนรู้วิธีใช้ตำแหน่งทางภูมิศาสตร์ที่ดีที่สุด
- ทดสอบตำแหน่งทางภูมิศาสตร์กับเว็บไซต์ของคุณ
กรณีที่ควรใช้ตำแหน่งทางภูมิศาสตร์
- ค้นหาตำแหน่งที่ผู้ใช้อยู่ใกล้กับสถานที่ตั้งจริงที่เฉพาะเจาะจงมากที่สุดเพื่อปรับแต่งประสบการณ์ของผู้ใช้
- ปรับแต่งข้อมูล (เช่น ข่าว) ตามตำแหน่งของผู้ใช้
- แสดงตำแหน่งของผู้ใช้บนแผนที่
- ติดแท็กข้อมูลที่สร้างขึ้นภายในแอปพลิเคชันด้วยตำแหน่งของผู้ใช้ (เช่น ติดแท็กภูมิศาสตร์ให้กับรูปภาพ)
ขออนุญาตอย่างมีความรับผิดชอบ
การศึกษาผู้ใช้เมื่อเร็วๆ นี้แสดงให้เห็นว่าผู้ใช้ไม่ไว้วางใจเว็บไซต์ที่แจ้งให้ผู้ใช้ระบุตำแหน่งของตนเมื่อโหลดหน้าเว็บ แล้วแนวทางปฏิบัติแนะนำมีอะไรบ้าง
สมมติว่าผู้ใช้จะไม่ให้ข้อมูลตำแหน่งแก่คุณ
ผู้ใช้หลายคนอาจไม่ต้องการให้ข้อมูลตำแหน่งแก่คุณ ดังนั้นคุณจึงต้องใช้รูปแบบการพัฒนาเชิงป้องกัน
- จัดการข้อผิดพลาดทั้งหมดจาก Geolocation API เพื่อให้คุณปรับเว็บไซต์ให้เข้ากับเงื่อนไขนี้ได้
- อธิบายความจำเป็นในการใช้ตำแหน่งอย่างชัดเจนและตรงไปตรงมา
- ใช้โซลูชันสำรองหากจำเป็น
ใช้การสำรองหากจำเป็นต้องใช้ตำแหน่งทางภูมิศาสตร์
เราขอแนะนำว่าเว็บไซต์หรือแอปพลิเคชันของคุณไม่ควรต้องเข้าถึงตำแหน่งปัจจุบันของผู้ใช้ อย่างไรก็ตาม หากเว็บไซต์หรือแอปพลิเคชันของคุณต้องการตำแหน่งปัจจุบันของผู้ใช้ ก็มีโซลูชันของบุคคลที่สามที่ช่วยให้คุณคาดเดาตำแหน่งปัจจุบันของผู้ใช้ได้ดีที่สุด
โซลูชันเหล่านี้มักทำงานโดยดูที่อยู่ IP ของผู้ใช้และจับคู่กับที่อยู่จริงที่ลงทะเบียนไว้กับฐานข้อมูล RIPE ตำแหน่งเหล่านี้มักไม่แม่นยำนัก โดยปกติแล้วจะให้ตำแหน่งของศูนย์กลางโทรคมนาคมหรือเสาสัญญาณโทรศัพท์มือถือที่อยู่ใกล้กับผู้ใช้มากที่สุด ในหลายกรณี ข้อมูลอาจไม่ถูกต้องด้วยซ้ำ โดยเฉพาะอย่างยิ่งหากผู้ใช้ใช้ VPN หรือบริการพร็อกซีอื่นๆ
ขอสิทธิ์เข้าถึงตำแหน่งเสมอเมื่อมีท่าทางผู้ใช้
ตรวจสอบว่าผู้ใช้เข้าใจเหตุผลที่คุณขอตำแหน่งของตน และประโยชน์ที่ผู้ใช้จะได้รับ การขอสิทธิ์ทันทีในหน้าแรกขณะที่เว็บไซต์โหลดจะส่งผลให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี
แต่ให้แสดงคำกระตุ้นให้ดำเนินการ (Call-To-Action) ที่ชัดเจนหรือข้อความที่ระบุว่าการดำเนินการนั้นต้องเข้าถึงตำแหน่งของผู้ใช้ จากนั้นผู้ใช้จะเชื่อมโยงข้อความแจ้งของระบบสำหรับการเข้าถึงกับการดำเนินการที่เพิ่งเริ่มต้นได้ง่ายขึ้น
ระบุอย่างชัดเจนว่าการดำเนินการจะขอตำแหน่งของผู้ใช้
ในการศึกษาโดยทีม Google Ads เมื่อผู้ใช้ถูกขอให้จองห้องพักโรงแรมในบอสตันสำหรับการประชุมที่กำลังจะมาถึง ในเว็บไซต์โรงแรมแห่งหนึ่ง ผู้ใช้ได้รับข้อความแจ้งให้แชร์ตำแหน่ง GPS ทันทีหลังจากแตะคำกระตุ้นให้ดำเนินการ (Call-To-Action) "ค้นหาและจอง" ในหน้าแรก
ในบางกรณี ผู้ใช้รู้สึกหงุดหงิดเพราะไม่เข้าใจว่าทำไมระบบจึงแสดงโรงแรมในซานฟรานซิสโกเมื่อต้องการจองห้องพักในบอสตัน
ประสบการณ์ที่ดีกว่าคือการตรวจสอบว่าผู้ใช้เข้าใจเหตุผลที่คุณขอตำแหน่งของตน เพิ่มตัวระบุที่เป็นที่รู้จักซึ่งใช้กันโดยทั่วไปในอุปกรณ์ต่างๆ เช่น เครื่องวัดระยะ หรือคำกระตุ้นให้ดำเนินการ (Call-To-Action) ที่ชัดเจน เช่น "ค้นหาใกล้ฉัน"
แจ้งเตือนผู้ใช้เบาๆ เพื่อให้สิทธิ์เข้าถึงตำแหน่ง
คุณไม่มีสิทธิ์เข้าถึงสิ่งที่ผู้ใช้กำลังทำอยู่ คุณจะทราบอย่างแน่ชัดเมื่อผู้ใช้ไม่อนุญาตให้เข้าถึงตำแหน่ง แต่จะไม่ทราบเมื่อผู้ใช้อนุญาตให้เข้าถึง คุณจะทราบเพียงว่าได้รับสิทธิ์เข้าถึงเมื่อผลลัพธ์ปรากฏขึ้น
แนวทางปฏิบัติแนะนำคือการ "กระตุ้น" ให้ผู้ใช้ดำเนินการหากคุณต้องการให้ผู้ใช้ดำเนินการให้เสร็จสมบูรณ์
เราขอแนะนำให้คุณดำเนินการดังต่อไปนี้
- ตั้งค่าตัวจับเวลาที่ทริกเกอร์หลังจากผ่านไปช่วงสั้นๆ โดย 5 วินาทีเป็นค่าที่เหมาะสม
- หากได้รับข้อความแสดงข้อผิดพลาด ให้แสดงข้อความต่อผู้ใช้
- หากได้รับการตอบกลับเป็นบวก ให้ปิดใช้ตัวจับเวลาและประมวลผลผลลัพธ์
- หากไม่ได้รับการตอบกลับในเชิงบวกหลังจากหมดเวลา ให้แสดงการแจ้งเตือนแก่ผู้ใช้
- หากการตอบกลับมาถึงในภายหลังและการแจ้งเตือนยังคงอยู่ ให้นำการแจ้งเตือนออกจากหน้าจอ
button.onclick = function () {
var startPos;
var nudge = document.getElementById('nudge');
var showNudgeBanner = function () {
nudge.style.display = 'block';
};
var hideNudgeBanner = function () {
nudge.style.display = 'none';
};
var nudgeTimeoutId = setTimeout(showNudgeBanner, 5000);
var geoSuccess = function (position) {
hideNudgeBanner();
// We have the location, don't display banner
clearTimeout(nudgeTimeoutId);
// Do magic with location
startPos = position;
document.getElementById('startLat').innerHTML = startPos.coords.latitude;
document.getElementById('startLon').innerHTML = startPos.coords.longitude;
};
var geoError = function (error) {
switch (error.code) {
case error.TIMEOUT:
// The user didn't accept the callout
showNudgeBanner();
break;
}
};
navigator.geolocation.getCurrentPosition(geoSuccess, geoError);
};
การสนับสนุนเบราว์เซอร์
เบราว์เซอร์ส่วนใหญ่รองรับ Geolocation API แล้ว แต่แนวทางปฏิบัติแนะนำคือให้ตรวจสอบการรองรับก่อนดำเนินการใดๆ เสมอ
คุณสามารถตรวจสอบความเข้ากันได้ง่ายๆ โดยทดสอบว่ามีออบเจ็กต์ตำแหน่งทางภูมิศาสตร์อยู่หรือไม่
// check for Geolocation support
if (navigator.geolocation) {
console.log('Geolocation is supported!');
} else {
console.log('Geolocation is not supported for this Browser/OS.');
}
การระบุตำแหน่งปัจจุบันของผู้ใช้
Geolocation API มีเมธอด "แบบครั้งเดียว" ที่ง่ายดายในการรับตำแหน่งของผู้ใช้: getCurrentPosition() การเรียกใช้เมธอดนี้แบบอะซิงโครนัสจะรายงานตำแหน่งปัจจุบันของผู้ใช้
window.onload = function () {
var startPos;
var geoSuccess = function (position) {
startPos = position;
document.getElementById('startLat').innerHTML = startPos.coords.latitude;
document.getElementById('startLon').innerHTML = startPos.coords.longitude;
};
navigator.geolocation.getCurrentPosition(geoSuccess);
};
หากนี่เป็นครั้งแรกที่แอปพลิเคชันในโดเมนนี้ขอสิทธิ์ โดยปกติแล้วเบราว์เซอร์จะตรวจสอบความยินยอมของผู้ใช้ นอกจากนี้ เบราว์เซอร์บางรุ่นอาจมีค่ากำหนดให้อนุญาตเสมอหรือไม่อนุญาตการค้นหาสิทธิ์ ซึ่งในกรณีนี้ ระบบจะข้ามกระบวนการยืนยันไป
ออบเจ็กต์ตำแหน่งอาจมีข้อมูลมากกว่าแค่ละติจูดและลองจิจูด ทั้งนี้ขึ้นอยู่กับอุปกรณ์ตำแหน่งที่เบราว์เซอร์ใช้ เช่น อาจรวมถึงระดับความสูงหรือทิศทาง คุณจะไม่ทราบว่าระบบตำแหน่งใช้ข้อมูลเพิ่มเติมใดจนกว่าจะแสดงผลข้อมูลจริง
กำลังดูตำแหน่งของผู้ใช้
Geolocation API ช่วยให้คุณทราบตำแหน่งของผู้ใช้ (โดยได้รับความยินยอมจากผู้ใช้) ด้วยการเรียก getCurrentPosition() เพียงครั้งเดียว
หากต้องการตรวจสอบตำแหน่งของผู้ใช้อย่างต่อเนื่อง ให้ใช้วิธี Geolocation API watchPosition() ซึ่งทำงานคล้ายกับ getCurrentPosition() แต่จะเริ่มทำงานหลายครั้งในฐานะซอฟต์แวร์ระบุตำแหน่ง ดังนี้
- ล็อกผู้ใช้ได้แม่นยำยิ่งขึ้น
- ระบุว่าตำแหน่งของผู้ใช้มีการเปลี่ยนแปลง
var watchId = navigator.geolocation.watchPosition(function (position) {
document.getElementById('currentLat').innerHTML = position.coords.latitude;
document.getElementById('currentLon').innerHTML = position.coords.longitude;
});
กรณีที่ควรใช้ตำแหน่งทางภูมิศาสตร์เพื่อดูตำแหน่งของผู้ใช้
- คุณต้องการระบุตำแหน่งของผู้ใช้ให้แม่นยำยิ่งขึ้น
- แอปพลิเคชันของคุณต้องอัปเดตอินเทอร์เฟซผู้ใช้ตามข้อมูลตำแหน่งใหม่
- แอปพลิเคชันของคุณต้องอัปเดตตรรกะทางธุรกิจเมื่อผู้ใช้เข้าสู่โซนที่กำหนดไว้
แนวทางปฏิบัติแนะนำเมื่อใช้ตำแหน่งทางภูมิศาสตร์
ล้างข้อมูลและประหยัดแบตเตอรี่อยู่เสมอ
การเฝ้าดูการเปลี่ยนแปลงตำแหน่งทางภูมิศาสตร์ไม่ใช่การดำเนินการที่ไม่มีค่าใช้จ่าย แม้ว่าระบบปฏิบัติการอาจเปิดตัวฟีเจอร์แพลตฟอร์มเพื่อให้แอปพลิเคชันเชื่อมต่อกับระบบย่อยทางภูมิศาสตร์ได้ แต่ในฐานะนักพัฒนาเว็บ คุณไม่ทราบว่าอุปกรณ์ของผู้ใช้รองรับการตรวจสอบตำแหน่งของผู้ใช้หรือไม่ และขณะที่กำลังดูตำแหน่ง คุณกำลังทำให้อุปกรณ์ต้องประมวลผลเพิ่มเติมจำนวนมาก
หลังจากไม่จำเป็นต้องติดตามตำแหน่งของผู้ใช้อีกต่อไป ให้เรียกใช้ clearWatch เพื่อปิดระบบตำแหน่งทางภูมิศาสตร์
จัดการข้อผิดพลาดอย่างราบรื่น
แต่การค้นหาตำแหน่งอาจไม่สำเร็จเสมอไป อาจเป็นเพราะไม่พบ GPS หรือผู้ใช้ปิดใช้การค้นหาตำแหน่งโดยฉับพลัน ในกรณีที่เกิดข้อผิดพลาด ระบบจะเรียกใช้อาร์กิวเมนต์ที่ 2 (ไม่บังคับ) ของ getCurrentPosition() เพื่อให้คุณแจ้งผู้ใช้ภายใน Callback ได้ ดังนี้
window.onload = function () {
var startPos;
var geoSuccess = function (position) {
startPos = position;
document.getElementById('startLat').innerHTML = startPos.coords.latitude;
document.getElementById('startLon').innerHTML = startPos.coords.longitude;
};
var geoError = function (error) {
console.log('Error occurred. Error code: ' + error.code);
// error.code can be:
// 0: unknown error
// 1: permission denied
// 2: position unavailable (error response from location provider)
// 3: timed out
};
navigator.geolocation.getCurrentPosition(geoSuccess, geoError);
};
ลดความจำเป็นในการเริ่มใช้ฮาร์ดแวร์ตำแหน่งทางภูมิศาสตร์
ในกรณีการใช้งานหลายกรณี คุณไม่จำเป็นต้องใช้ตำแหน่งล่าสุดของผู้ใช้ แต่ต้องการเพียงการประมาณคร่าวๆ เท่านั้น
ใช้พร็อพเพอร์ตี้ maximumAge ที่ไม่บังคับเพื่อบอกให้เบราว์เซอร์ใช้ผลลัพธ์ตำแหน่งทางภูมิศาสตร์ที่ได้รับล่าสุด ซึ่งไม่เพียงแต่จะแสดงผลได้เร็วขึ้นหากผู้ใช้เคยขอข้อมูลมาก่อน แต่ยังป้องกันไม่ให้เบราว์เซอร์เริ่มอินเทอร์เฟซฮาร์ดแวร์ตำแหน่งทางภูมิศาสตร์ เช่น การระบุตำแหน่งด้วย Wi-Fi หรือ GPS
window.onload = function () {
var startPos;
var geoOptions = {
maximumAge: 5 * 60 * 1000,
};
var geoSuccess = function (position) {
startPos = position;
document.getElementById('startLat').innerHTML = startPos.coords.latitude;
document.getElementById('startLon').innerHTML = startPos.coords.longitude;
};
var geoError = function (error) {
console.log('Error occurred. Error code: ' + error.code);
// error.code can be:
// 0: unknown error
// 1: permission denied
// 2: position unavailable (error response from location provider)
// 3: timed out
};
navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);
};
อย่าปล่อยให้ผู้ใช้รอ ให้ตั้งค่าการหมดเวลา
หากคุณไม่ได้ตั้งค่าระยะหมดเวลา คำขอตำแหน่งปัจจุบันอาจไม่แสดงผลลัพธ์ใดๆ
window.onload = function () {
var startPos;
var geoOptions = {
timeout: 10 * 1000,
};
var geoSuccess = function (position) {
startPos = position;
document.getElementById('startLat').innerHTML = startPos.coords.latitude;
document.getElementById('startLon').innerHTML = startPos.coords.longitude;
};
var geoError = function (error) {
console.log('Error occurred. Error code: ' + error.code);
// error.code can be:
// 0: unknown error
// 1: permission denied
// 2: position unavailable (error response from location provider)
// 3: timed out
};
navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);
};
เลือกตำแหน่งคร่าวๆ แทนตำแหน่งที่ละเอียด
หากต้องการค้นหาร้านค้าที่อยู่ใกล้ผู้ใช้มากที่สุด คุณไม่จำเป็นต้องใช้ความแม่นยำระดับ 1 เมตร API ได้รับการออกแบบมาเพื่อให้ตำแหน่งคร่าวๆ ที่แสดงผลได้เร็วที่สุด
หากต้องการความแม่นยำสูง คุณสามารถลบล้างการตั้งค่าเริ่มต้นด้วยตัวเลือก enableHighAccuracy ได้ ใช้ตัวเลือกนี้เท่าที่จำเป็น เนื่องจากจะใช้เวลาในการแก้ไขนานกว่าและใช้แบตเตอรี่มากกว่า
window.onload = function () {
var startPos;
var geoOptions = {
enableHighAccuracy: true,
};
var geoSuccess = function (position) {
startPos = position;
document.getElementById('startLat').innerHTML = startPos.coords.latitude;
document.getElementById('startLon').innerHTML = startPos.coords.longitude;
};
var geoError = function (error) {
console.log('Error occurred. Error code: ' + error.code);
// error.code can be:
// 0: unknown error
// 1: permission denied
// 2: position unavailable (error response from location provider)
// 3: timed out
};
navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);
};
จำลองตำแหน่งทางภูมิศาสตร์ด้วยเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
เมื่อตั้งค่าตำแหน่งทางภูมิศาสตร์แล้ว คุณจะต้องทำดังนี้
- ทดสอบวิธีการทำงานของแอปในตำแหน่งทางภูมิศาสตร์ต่างๆ
- ตรวจสอบว่าแอปของคุณลดระดับลงอย่างเหมาะสมเมื่อไม่มีตำแหน่งทางภูมิศาสตร์
คุณทำทั้ง 2 อย่างได้จากเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
- เปิดเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
- กด Esc เพื่อเปิดลิ้นชักคอนโซล
- เปิดเมนูลิ้นชักคอนโซล
- คลิกตัวเลือกเซ็นเซอร์เพื่อแสดงแท็บเซ็นเซอร์
จากตรงนี้ คุณสามารถลบล้างตำแหน่งเป็นเมืองใหญ่ที่กำหนดไว้ล่วงหน้า ป้อนตำแหน่งที่กำหนดเอง หรือปิดใช้ตำแหน่งทางภูมิศาสตร์โดยตั้งค่าการลบล้างเป็นตำแหน่งไม่พร้อมใช้งาน