0Pricing
Swift Academy · บทเรียน

การรับตำแหน่งของผู้ใช้

รับการอัปเดตตำแหน่งด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การขออนุญาตเข้าถึงตำแหน่ง
  2. การรับตำแหน่งของผู้ใช้
  3. การแสดงแผนที่ใน SwiftUI
  4. การแปลงพิกัดเป็นที่อยู่และภูมิภาค
← กลับไปที่ Swift Academy