การรับตำแหน่งของผู้ใช้
รับการอัปเดตตำแหน่งด้วย CLLocationManager
การรับตำแหน่งของผู้ใช้ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเริ่มอัปเดตตำแหน่งที่ตั้ง
เมื่อได้รับอนุญาตแล้ว ให้เรียก startUpdatingLocation() เพื่อเริ่มรับค่าตำแหน่งอย่างต่อเนื่อง manager จะส่งค่าเหล่านี้ผ่านผู้รับมอบหมาย ให้เรียก stopUpdatingLocation() เสมอเมื่อไม่ต้องการใช้งานต่อ เพื่อประหยัดแบตเตอรี่
manager.startUpdatingLocation()
// ... later
manager.stopUpdatingLocation()การรับตำแหน่งที่ตั้งในผู้รับมอบหมาย
ค่าตำแหน่งใหม่จะมาถึงใน locationManager(_:didUpdateLocations:) อาร์เรย์เรียงจากเก่าที่สุดไปใหม่ที่สุด ดังนั้นสมาชิกตัวสุดท้ายคือตำแหน่งที่ใหม่ที่สุด
func locationManager(_ m: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
guard let latest = locations.last else { return }
print(latest.coordinate.latitude, latest.coordinate.longitude)
}อ็อบเจ็กต์ CLLocation
ค่าตำแหน่งแต่ละค่าคือ CLLocation ซึ่งมีข้อมูลมากกว่าพิกัดมาก ได้แก่ coordinate, altitude, speed, course, timestamp และค่าความแม่นยำต่าง ๆ ให้ตรวจสอบข้อมูลเหล่านี้เพื่อพิจารณาว่าค่าตำแหน่งนั้นดีพอหรือไม่
func describe(_ loc: CLLocation) {
print("lat:", loc.coordinate.latitude)
print("lon:", loc.coordinate.longitude)
print("alt:", loc.altitude)
print("when:", loc.timestamp)
}ความแม่นยำที่ต้องการ
ตั้งค่า desiredAccuracy เพื่อบอก Core Location ว่าคุณต้องการค่าตำแหน่งที่แม่นยำเพียงใด ความแม่นยำที่สูงขึ้นใช้พลังงานมากขึ้น ค่าคงที่ที่มีให้ใช้ ได้แก่ kCLLocationAccuracyBest, kCLLocationAccuracyNearestTenMeters, kCLLocationAccuracyHundredMeters และ kCLLocationAccuracyKilometer
manager.desiredAccuracy = kCLLocationAccuracyNearestTenMetersตัวกรองระยะทาง
ใช้ distanceFilter เพื่อระงับการอัปเดตจนกว่าอุปกรณ์จะเคลื่อนที่อย่างน้อยตามจำนวน meters ที่กำหนด วิธีนี้ลดสัญญาณรบกวนและประหยัดพลังงานสำหรับกรณีใช้งานที่ไม่จำเป็นต้องรับทุกการเคลื่อนไหวเล็ก ๆ
manager.distanceFilter = 50 // metersการประเมินคุณภาพของค่าตำแหน่ง
พร็อพเพอร์ตี้ horizontalAccuracy คือรัศมีความเชื่อมั่นที่วัดเป็น meters หากมีค่าติดลบ แสดงว่าค่าตำแหน่งไม่ถูกต้อง นอกจากนี้ ให้ปฏิเสธค่าตำแหน่งที่เก่าเกินไปด้วยการตรวจสอบว่า timestamp เกิดขึ้นมานานเท่าใดแล้ว
func isUsable(_ loc: CLLocation) -> Bool {
guard loc.horizontalAccuracy >= 0 else { return false }
let age = -loc.timestamp.timeIntervalSinceNow
return age < 15 && loc.horizontalAccuracy < 100
}การขอตำแหน่งที่ตั้งเพียงครั้งเดียว
หากต้องการค่าตำแหน่งเพียงครั้งเดียว ไม่ใช่ข้อมูลต่อเนื่อง ให้เรียก requestLocation() manager จะส่งตำแหน่งหนึ่งค่าไปยังผู้รับมอบหมาย แล้วหยุดทำงานโดยอัตโนมัติ วิธีนี้ประหยัดแบตเตอรี่มากกว่าการเริ่มอัปเดตอย่างต่อเนื่อง
manager.requestLocation()การจัดการข้อผิดพลาดของตำแหน่งที่ตั้ง
ข้อผิดพลาดจะมาถึงใน locationManager(_:didFailWithError:) ข้อผิดพลาดที่พบบ่อยคือ CLError.locationUnknown ซึ่งมักเกิดขึ้นชั่วคราว ให้รอต่อไป ส่วน CLError.denied หมายถึงการอนุญาตถูกเพิกถอนแล้ว และคุณควรหยุดทำงาน
func locationManager(_ m: CLLocationManager,
didFailWithError error: Error) {
if let clErr = error as? CLError, clErr.code == .denied {
m.stopUpdatingLocation()
}
}การตรวจสอบการเปลี่ยนแปลงที่สำคัญ
สำหรับการติดตามแบบหยาบที่ใช้พลังงานต่ำและสามารถปลุกแอปใน background ได้ ให้ใช้ startMonitoringSignificantLocationChanges() ระบบจะเรียกใช้งานเมื่ออุปกรณ์เคลื่อนที่ประมาณ 500 meters และเหมาะอย่างยิ่งสำหรับฟีเจอร์ที่อิงตามพื้นที่
manager.startMonitoringSignificantLocationChanges()ทิศทางการหันและเส้นทางการเคลื่อนที่
สำหรับฟีเจอร์เข็มทิศ startUpdatingHeading() จะส่งทิศทางแม่เหล็กหรือทิศทางจริงผ่าน locationManager(_:didUpdateHeading:) โปรดทราบว่า CLLocation.course ซึ่งหมายถึงทิศทางการเดินทาง แตกต่างจากทิศทางการหัน ซึ่งหมายถึงทิศทางที่อุปกรณ์หันอยู่
func locationManager(_ m: CLLocationManager,
didUpdateHeading newHeading: CLHeading) {
print("Heading:", newHeading.trueHeading)
}การคำนวณ distance ระหว่างจุด
CLLocation สามารถวัด distance แบบเส้นตรงไปยังตำแหน่งที่ตั้งอื่นด้วย distance(from:) โดยคืนค่าเป็น meters วิธีนี้มีประโยชน์สำหรับตรรกะตรวจสอบระยะใกล้โดยไม่ต้องมีส่วนติดต่อผู้ใช้ของแผนที่
let a = CLLocation(latitude: 41.0, longitude: 28.9)
let b = CLLocation(latitude: 41.1, longitude: 29.0)
let meters = a.distance(from: b)
print("Distance:", meters)แบบทดสอบสั้น: การรับตำแหน่งที่ตั้ง
ตรวจสอบความเข้าใจของคุณเกี่ยวกับการรับค่าตำแหน่ง
ทบทวน: การรับตำแหน่งที่ตั้งของผู้ใช้
ตอนนี้คุณทราบวิธีรับพิกัดแล้ว:
startUpdatingLocation()สำหรับข้อมูลต่อเนื่อง และrequestLocation()สำหรับค่าตำแหน่งหนึ่งค่า- อ่านค่าตำแหน่งล่าสุดจาก
locations.lastในผู้รับมอบหมาย - ปรับ
desiredAccuracyและdistanceFilterเพื่อหาสมดุลระหว่างพลังงานกับความแม่นยำ - ตรวจสอบ
horizontalAccuracyและtimestampก่อนนำค่าตำแหน่งไปใช้
คำถามที่พบบ่อย
บทเรียน “การรับตำแหน่งของผู้ใช้” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การรับตำแหน่งของผู้ใช้” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การรับตำแหน่งของผู้ใช้”
รับการอัปเดตตำแหน่งด้วย CLLocationManager คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การรับตำแหน่งของผู้ใช้” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การขออนุญาตเข้าถึงตำแหน่ง
- การรับตำแหน่งของผู้ใช้
- การแสดงแผนที่ใน SwiftUI
- การแปลงพิกัดเป็นที่อยู่และภูมิภาค