GPS และบริการระบุตำแหน่งในแอปพลิเคชันมือถือคือ API สำหรับกำหนดตำแหน่งทางกายภาพของอุปกรณ์โดยใช้ดาวเทียม Wi-Fi และเครือข่ายมือถือ ตาม Google Android Location Guide (2025) แอปพลิเคชันมือถือมากกว่า 60% ใช้ข้อมูลตำแหน่งเพื่อปรับแต่งเนื้อหา Fused Location Provider บน Android รวมหลายแหล่งเพื่อปรับปรุงความแม่นยำและลดการใช้พลังงาน
ประเด็นสำคัญ
GPS (ระบบกำหนดตำแหน่งทั่วโลก) คือระบบนำทางด้วยดาวเทียมที่ประกอบด้วยดาวเทียมที่ใช้งานอยู่ 31 ดวงในวงโคจรที่ความสูงประมาณ 20,200 กม. บนอุปกรณ์มือถือ ชิป GPS จะรับสัญญาณจากดาวเทียมและคำนวณพิกัดโดยใช้การวัดแบบไตรภาค — การวัดเวลาการเดินทางของสัญญาณจากดาวเทียมหลายดวง บริการระบุตำแหน่งในระบบปฏิบัติการมือถือจะเพิ่มข้อมูลจากจุดเชื่อมต่อ Wi-Fi และเสาสัญญาณโทรศัพท์มือถือเข้ากับ GPS เพื่อการระบุตำแหน่งที่เร็วขึ้น (A-GPS) และความแม่นยำภายในอาคารที่ดีขึ้น ตาม GPS.gov (2024) ความแม่นยำของ GPS พลเรือนคือ 3-5 เมตรในสภาพท้องฟ้าแจ่มใส และสูงถึง 15 เมตรในพื้นที่เมืองหนาแน่น
อุปกรณ์มือถือสมัยใหม่ไม่เพียงรองรับระบบ GPS ของอเมริกาเท่านั้น แต่ยังรองรับ ระบบนำทางด้วยดาวเทียมทั่วโลก อื่นๆ ได้แก่ GLONASS ของรัสเซีย (24 ดวง), Galileo ของยุโรป (28 ดวง) และ BeiDou ของจีน การรองรับหลายระบบพร้อมกันช่วยปรับปรุงความแม่นยำและความเร็วในการระบุตำแหน่ง — อุปกรณ์สามารถใช้ดาวเทียมสูงสุด 40 ดวงจากระบบต่างๆ เพื่อคำนวณตำแหน่งของมัน บน iOS และ Android การเลือกระบบดาวเทียมจะดำเนินการโดยอัตโนมัติที่ระดับชิปฮาร์ดแวร์ นักพัฒนาไม่จำเป็นต้องจัดการเรื่องนี้
กระบวนการระบุตำแหน่งบนอุปกรณ์มือถือประกอบด้วยหลายขั้นตอน: การรวบรวมข้อมูลจากแหล่งที่มา (ดาวเทียม, Wi-Fi, เซลล์), การกรองและแก้ไขข้อผิดพลาด, การคำนวณพิกัด และการส่งผลลัพธ์ไปยังแอป ระบบปฏิบัติการจัดการกระบวนการนี้ผ่านบริการระบุตำแหน่งแบบรวมศูนย์ที่ปรับปรุงแหล่งที่มาทั้งหมดเพื่อประหยัดแบตเตอรี่ ด้านล่างนี้คือแหล่งข้อมูลตำแหน่งหลักสามแหล่ง
การนำทางด้วยดาวเทียม ให้ความแม่นยำสูงสุด (3-5 เมตร) แต่ต้องการทัศนวิสัยที่ชัดเจนของท้องฟ้า ภายในอาคารหรือในพื้นที่เมืองหนาแน่น สัญญาณ GPS อาจอ่อนลงหรือหายไปโดยสิ้นเชิง เวลาการระบุตำแหน่งครั้งแรก (TTFF) คือ 30-60 วินาทีสำหรับการเริ่มต้นแบบเย็น และ 5-10 วินาทีสำหรับการเริ่มต้นแบบร้อน A-GPS (GPS แบบช่วยเหลือ) ช่วยเร่งการเริ่มต้นโดยดาวน์โหลดข้อมูล ephemeris ของดาวเทียมผ่านอินเทอร์เน็ตแทนที่จะรอข้อมูลจากดาวเทียม
Wi-Fi ระบุตำแหน่งใช้ฐานข้อมูลที่อยู่ MAC ของจุดเชื่อมต่อที่มีพิกัดทราบ ความแม่นยำคือ 10-50 เมตรภายในพื้นที่ครอบคลุม Wi-Fi เสาสัญญาณโทรศัพท์มือถือให้ความแม่นยำตั้งแต่ 100 เมตรถึงหลายกิโลเมตรขึ้นอยู่กับความหนาแน่นของเสา การรวมแหล่งที่มาทั้งหมด (Fused Location) ช่วยให้ได้รับพิกัดด้วยความแม่นยำที่สมเหตุสมผลโดยใช้พลังงานน้อยที่สุด — โดยเฉพาะอย่างยิ่งเมื่อชิป GPS ปิดอยู่หรือสัญญาณดาวเทียมไม่พร้อมใช้งาน
บนทั้งสองแพลตฟอร์ม บริการระบุตำแหน่ง ถูกนำไปใช้ผ่าน API ของระบบในระดับนามธรรมที่แตกต่างกัน Android ใช้ FusedLocationProviderClient จาก Google Play Services, iOS ใช้ CLLocationManager จาก Core Location API ทั้งสองอนุญาตให้ขอตำแหน่งครั้งเดียวหรือสมัครรับการอัปเดตเป็นประจำ ด้านล่างนี้คือตัวอย่างการรับพิกัดบน Android โดยใช้ Fused Location Provider ใน Kotlin
val fusedClient = LocationServices.getFusedLocationProviderClient(this)
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY
)
.setIntervalMillis(5000)
.setMinUpdateIntervalMillis(2000)
.build()
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { location ->
Log.d("ตำแหน่ง", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
ในตัวอย่าง LocationRequest ถูกกำหนดค่าด้วย PRIORITY_HIGH_ACCURACY — ซึ่งจะเปิด GPS เพื่อความแม่นยำสูงสุด setIntervalMillis กำหนดช่วงเวลาการอัปเดตที่ต้องการ (5 วินาที), setMinUpdateIntervalMillis กำหนดช่วงเวลาขั้นต่ำ (2 วินาที) Callback onLocationResult จะถูกเรียกทุกครั้งที่ระบบได้รับพิกัดใหม่ สิ่งสำคัญคือต้องตรวจสอบสิทธิ์ก่อนเรียก requestLocationUpdates — มิฉะนั้นแอปจะหยุดทำงานด้วย SecurityException
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// เครื่องหมาย: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
บน iOS desiredAccuracy กำหนดความแม่นยำของคำขอ: kCLLocationAccuracyBest ใช้แหล่งที่มาที่มีอยู่ทั้งหมด (GPS + Wi-Fi + เซลล์) หลังจากขอสิทธิ์ผ่าน requestWhenInUseAuthorization ระบบจะแสดงกล่องโต้ตอบให้ผู้ใช้ ตัวแทน didUpdateLocations รับอาร์เรย์ของออบเจ็กต์ CLLocation พร้อมพิกัด ระดับความสูง ความเร็ว และทิศทาง หากต้องการหยุดการอัปเดต ให้เรียก stopUpdatingLocation เพื่อประหยัดแบตเตอรี่
การเข้าถึงการระบุตำแหน่งต้องได้รับอนุญาตอย่างชัดแจ้งจากผู้ใช้บนทั้งสองแพลตฟอร์ม บน Android ใช้สิทธิ์ ACCESS_FINE_LOCATION (GPS) และ ACCESS_COARSE_LOCATION (Wi-Fi/เซลล์) ตั้งแต่ Android 10 เป็นต้นไป การเข้าถึงพื้นหลังต้องใช้สิทธิ์แยกต่างหาก ACCESS_BACKGROUND_LOCATION บน iOS มีสามระดับให้เลือก: requestWhenInUseAuthorization (เฉพาะเมื่อแอปทำงาน), requestAlwaysAuthorization (ในพื้นหลัง) และประทับเวลาชั่วคราวสำหรับการระบุตำแหน่งที่แม่นยำ Apple ต้องการคำอธิบายบังคับใน Info.plist: NSLocationWhenInUseUsageDescription หรือ NSLocationAlwaysAndWhenInUseUsageDescription หากไม่มีคีย์เหล่านี้ คำขอสิทธิ์จะถูกมองข้าม
การใช้ GPS อย่างต่อเนื่องทำให้แบตเตอรี่หมดอย่างมาก — มากถึง 30% ต่อชั่วโมงของการทำงานต่อเนื่องที่ความแม่นยำสูงสุด เพื่อปรับปรุงการใช้พลังงาน ขอแนะนำให้ใช้การระบุตำแหน่งเมื่อจำเป็นเท่านั้นและหยุดการอัปเดตเมื่อแอปเข้าสู่พื้นหลัง บน Android FusedLocationProviderClient จะสลับระหว่าง GPS และแหล่งเครือข่ายโดยอัตโนมัติขึ้นอยู่กับความพร้อมใช้งานและลำดับความสำคัญของคำขอ บน iOS ให้ใช้บริการเปลี่ยนตำแหน่งที่มีนัยสำคัญ (startMonitoringSignificantLocationChanges) สำหรับการอัปเดตโดยใช้พลังงานน้อยที่สุด — ความแม่นยำต่ำกว่า (สูงถึง 500 เมตร) แต่แบตเตอรี่แทบไม่หมด นอกจากนี้ ให้ปฏิบัติการประมวลผลแบบกลุ่ม: รวบรวมพิกัดในช่วงเวลา 5-10 นาทีและส่งไปยังเซิร์ฟเวอร์ในคำขอเดียวผ่าน WorkManager บน Android หรือ BGTaskScheduler บน iOS การลดความถี่ของคำขอจาก 1 วินาทีเป็น 30 วินาทีช่วยลดการใช้พลังงานของการระบุตำแหน่งลง 85%
การระบุตำแหน่ง ถูกใช้ในแอปพลิเคชันมือถือที่หลากหลาย: จากแอปนำทางไปจนถึงบริการจัดส่ง สถานการณ์ที่พบบ่อยที่สุดรวมถึงการแสดงผู้ใช้บนแผนที่ การโฆษณาตามพื้นที่ การติดตามผู้ส่งสาร การสร้างรั้วรอบขอบชิดสำหรับการแจ้งเตือนแบบพุช และการติดตามกิจกรรมฟิตเนส แต่ละสถานการณ์ต้องการแนวทางเฉพาะสำหรับความแม่นยำและความถี่ในการอัปเดต ด้านล่างนี้คือตารางพร้อมคำแนะนำการกำหนดค่าสำหรับแอปประเภทต่างๆ
| ประเภทแอป | ความแม่นยำ | ช่วงเวลา | โหมดพื้นหลัง |
|---|---|---|---|
| นำทาง | HIGH (GPS) | 1-2 วินาที | ใช่ |
| จัดส่ง | BALANCED (GPS+Wi-Fi) | 10-30 วินาที | ใช่ |
| สภาพอากาศ | LOW (Wi-Fi/เซลล์) | ครั้งเดียว | ไม่ |
| โซเชียลเน็ตเวิร์ก | BALANCED | เมื่อเปิด | ไม่ |
| ฟิตเนส | HIGH (GPS) | 5-10 วินาที | ใช่ |
เมื่อออกแบบฟังก์ชันการระบุตำแหน่ง สิ่งสำคัญคือต้องพิจารณาว่าผู้ใช้สามารถเพิกถอนสิทธิ์ได้ทุกเมื่อผ่านการตั้งค่าระบบ แอปควรจัดการสถานการณ์ที่ไม่สามารถระบุตำแหน่งได้อย่างถูกต้องและแสดงคำอธิบายที่ชัดเจนว่าทำไมฟังก์ชันจึงถูกจำกัด
Geofencing คือเทคโนโลยีสำหรับสร้างขอบเขตเสมือนบนแผนที่ เมื่อขอบเขตเหล่านี้ถูกข้าม แอปจะได้รับการแจ้งเตือน บน Android รั้วรอบขอบชิดถูกนำไปใช้ผ่าน GeofencingClient จาก Google Play Services บน iOS — ผ่าน CLCircularRegion จาก Core Location เมื่อเข้าหรือออกจากโซน ระบบจะปลุกแอปและส่งเหตุการณ์แม้ว่าแอปจะถูกปิดหรือย่อเล็กสุด วิธีนี้ใช้สำหรับการแจ้งเตือนแบบพุชเมื่อเข้าใกล้ร้านค้า การเตือนงานตามตำแหน่ง และระบบอัตโนมัติของอุปกรณ์ IoT จำนวนสูงสุดของรั้วรอบขอบชิดถูกจำกัด: บน Android 100, บน iOS 20 พร้อมกัน รัศมีโซนขั้นต่ำคือ 50 เมตรบนทั้งสองแพลตฟอร์ม — มิฉะนั้นระบบอาจไม่ทำงานเนื่องจากความคลาดเคลื่อนของการระบุตำแหน่ง เมื่อเข้าสู่โซน ระบบจะเริ่ม Intent บน Android หรือเรียกตัวแทน locationManager:didEnterRegion บน iOS
คำถามที่พบบ่อย
GPS ในสมาร์ทโฟนคือตัวรับสัญญาณในตัวของระบบนำทางด้วยดาวเทียมที่กำหนดพิกัดด้วยความแม่นยำ 3-5 เมตร อุปกรณ์ยังรองรับ GLONASS, Galileo และ BeiDou เพื่อปรับปรุงความแม่นยำและความเร็วในการระบุตำแหน่ง
GPS เป็นเพียงวิธีการใช้ดาวเทียมในการกำหนดพิกัด บริการระบุตำแหน่งรวม GPS, การระบุตำแหน่งผ่าน Wi-Fi และข้อมูลเสาสัญญาณโทรศัพท์มือถือเพื่อการระบุตำแหน่งที่เร็วและประหยัดพลังงานมากขึ้น โดยเฉพาะภายในอาคาร
เรียก requestWhenInUseAuthorization() หรือ requestAlwaysAuthorization() บนอินสแตนซ์ของ CLLocationManager ก่อนอื่น เพิ่ม NSLocationWhenInUseUsageDescription ใน Info.plist พร้อมคำอธิบายที่ชัดเจนว่าเหตุใดจึงจำเป็นต้องระบุตำแหน่ง
ใช้ FusedLocationProviderClient บน Android และบริการเปลี่ยนตำแหน่งที่มีนัยสำคัญบน iOS เพิ่มช่วงเวลาระหว่างคำขอเป็น 10-30 วินาที ปิดการอัปเดตเมื่อหน้าจอปิด และใช้การส่งพิกัดแบบกลุ่มไปยังเซิร์ฟเวอร์
ได้ หากไม่มี GPS คุณสามารถระบุตำแหน่งโดยประมาณได้โดยใช้จุดเชื่อมต่อ Wi-Fi (ความแม่นยำ 10-50 เมตร) หรือเสาสัญญาณโทรศัพท์มือถือ (ความแม่นยำ 100-5000 เมตร) บน Android ใช้ ACCESS_COARSE_LOCATION เพื่อการนี้
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม