การขออนุญาตเข้าถึงตำแหน่ง
จัดการสิทธิ์และความเป็นส่วนตัวอย่างถูกต้อง
การขออนุญาตเข้าถึงตำแหน่ง เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดตำแหน่งที่ตั้งจึงต้องได้รับอนุญาต
บนแพลตฟอร์มของ Apple การเข้าถึงตำแหน่งที่ตั้งของผู้ใช้เป็นการดำเนินการที่เกี่ยวข้องกับความเป็นส่วนตัว แอปของคุณต้องขอการอนุญาตอย่างชัดเจนก่อนที่ Core Location จะส่งพิกัดใด ๆ ให้ ระบบจะแสดงกล่องโต้ตอบขออนุญาตครั้งแรกที่คุณร้องขอ
- ผู้ใช้เป็นผู้อนุญาตให้แต่ละแอปโดยแยกจากกัน
- คุณไม่สามารถหลีกเลี่ยงการอนุญาตนี้ด้วยโปรแกรมได้
import CoreLocation
let manager = CLLocationManager()คีย์คำอธิบายการใช้งานของ Info.plist
ก่อนขอการอนุญาต คุณต้องเพิ่มสตริงคำอธิบายการใช้งานลงใน Info.plist ระบบจะแสดงสตริงเหล่านี้แก่ผู้ใช้ในกล่องโต้ตอบขออนุญาต คีย์สำคัญสองรายการคือ:
NSLocationWhenInUseUsageDescription— สำหรับการเข้าถึงเฉพาะใน foregroundNSLocationAlwaysAndWhenInUseUsageDescription— สำหรับการเข้าถึงใน background ด้วย
หากไม่ใส่คีย์ที่เกี่ยวข้อง คำขอจะล้มเหลวโดยไม่มีการแจ้งเตือนหรือทำให้แอปขัดข้อง
<!-- Info.plist -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby places.</string>การสร้าง CLLocationManager
CLLocationManager เป็นอ็อบเจ็กต์หลักที่ประสานงานบริการตำแหน่งที่ตั้ง คุณสร้างอินสแตนซ์หนึ่งรายการ เก็บการอ้างอิงแบบ strong ไว้ และกำหนดผู้รับมอบหมายเพื่อรับการเรียกกลับ
final class LocationService: NSObject {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
}
}การขอการอนุญาตขณะใช้งาน
เรียก requestWhenInUseAuthorization() เพื่อขอสิทธิ์เข้าถึงใน foreground ระบบจะแสดงกล่องโต้ตอบเพียงครั้งเดียว หลังจากนั้นระบบจะจดจำตัวเลือกไว้ หากตัดสินใจเรื่องการอนุญาตไปแล้ว การเรียกนี้จะไม่ทำอะไร
func requestPermission() {
manager.requestWhenInUseAuthorization()
}การขอการอนุญาตตลอดเวลา
สำหรับการอัปเดตใน background เช่น การกำหนดขอบเขตภูมิศาสตร์และการติดตามอย่างต่อเนื่อง ให้เรียก requestAlwaysAuthorization() Apple กำหนดให้คุณต้องขอการอนุญาตขณะใช้งานก่อน แล้วจึงยกระดับเป็นการอนุญาตตลอดเวลา ควรใช้อย่างจำกัดและอธิบายเหตุผลไว้ในคำอธิบายการใช้งาน
func requestAlways() {
manager.requestAlwaysAuthorization()
}การอ่านสถานะการอนุญาต
สถานะการอนุญาตปัจจุบันอยู่ใน manager.authorizationStatus ซึ่งเป็นพร็อพเพอร์ตี้ของอินสแตนซ์บน iOS 14 ขึ้นไป ค่าที่เป็นไปได้ได้แก่ .notDetermined, .denied, .restricted, .authorizedWhenInUse และ .authorizedAlways
let status = manager.authorizationStatus
switch status {
case .notDetermined: print("Ask the user")
case .denied, .restricted: print("No access")
case .authorizedWhenInUse, .authorizedAlways: print("Good to go")
@unknown default: break
}CLLocationManagerDelegate
การเปลี่ยนแปลงการอนุญาตจะถูกส่งแบบไม่พร้อมกันผ่านผู้รับมอบหมาย ให้ใช้งาน locationManagerDidChangeAuthorization(_:) เพื่อตอบสนองเมื่อผู้ใช้เลือกแล้ว อย่าคิดว่าการอนุญาตจะได้รับทันทีหลังเรียกคำขอ
extension LocationService: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
manager.startUpdatingLocation()
default:
print("Not authorized")
}
}
}การจัดการกรณีปฏิเสธหรือจำกัดสิทธิ์
หากผู้ใช้ปฏิเสธการเข้าถึง คุณจะขอซ้ำไม่ได้ แต่ให้ตรวจพบ .denied แล้วแนะนำผู้ใช้ไปที่การตั้งค่า ส่วน .restricted หมายถึงการเข้าถึงถูกบล็อกโดยการควบคุมโดยผู้ปกครองหรือโปรไฟล์ MDM และไม่สามารถแก้ไขจากภายในแอปได้เช่นกัน
func handle(_ status: CLAuthorizationStatus) {
if status == .denied {
// Deep-link the user to Settings > Privacy > Location
print("Open Settings to enable location")
}
}การอนุญาตด้านความแม่นยำ (แม่นยำเทียบกับลดลง)
ตั้งแต่ iOS 14 เป็นต้นมา ผู้ใช้สามารถอนุญาตความแม่นยำได้เพียงระดับลดลง (โดยประมาณ)เท่านั้น ให้ตรวจสอบ manager.accuracyAuthorization หากจำเป็นต้องใช้ข้อมูลที่แม่นยำจริง ๆ เช่น การนำทางแบบเลี้ยวต่อเลี้ยว ให้เรียก requestTemporaryFullAccuracyAuthorization(withPurposeKey:) พร้อมคีย์ที่กำหนดไว้ใน Info.plist
if manager.accuracyAuthorization == .reducedAccuracy {
manager.requestTemporaryFullAccuracyAuthorization(
withPurposeKey: "PreciseForNavigation"
)
}การตรวจสอบว่าเปิดใช้บริการตำแหน่งที่ตั้งอยู่หรือไม่
นอกเหนือจากการอนุญาตรายแอปแล้ว สวิตช์บริการตำแหน่งที่ตั้งของทั้งอุปกรณ์ก็อาจปิดอยู่ได้ ให้ตรวจสอบ CLLocationManager.locationServicesEnabled() บนคิวเบื้องหลัง เพราะการเรียกบนเธรดหลักอาจทำให้การทำงานหยุดรอ หากปิดใช้งานอยู่ จะไม่มีแอปใดได้รับตำแหน่งที่ตั้ง
DispatchQueue.global().async {
if CLLocationManager.locationServicesEnabled() {
print("System location is on")
} else {
print("System location is off")
}
}ลำดับการขอการอนุญาตที่สมบูรณ์
final class LocationService: NSObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ m: CLLocationManager) {
if m.authorizationStatus == .authorizedWhenInUse {
m.startUpdatingLocation()
}
}
}แบบทดสอบสั้น: การอนุญาต
ทดสอบความเข้าใจเกี่ยวกับลำดับการขอการอนุญาต
ทบทวน: การขอการอนุญาต
คุณได้เรียนรู้วิธีขอการอนุญาตใช้ตำแหน่งที่ตั้งอย่างปลอดภัยแล้ว:
- เพิ่ม
NSLocationWhenInUseUsageDescriptionและรูปแบบ Always หากจำเป็น ลงใน Info.plist - สร้าง
CLLocationManagerเก็บการอ้างอิงแบบ strong ไว้ และตั้งผู้รับมอบหมาย - เรียก
requestWhenInUseAuthorization()แล้วยกระดับเป็น Always เฉพาะเมื่อจำเป็น - ตอบสนองใน
locationManagerDidChangeAuthorization(_:)และจัดการกรณีปฏิเสธ จำกัดสิทธิ์ หรือความแม่นยำลดลง
คำถามที่พบบ่อย
บทเรียน “การขออนุญาตเข้าถึงตำแหน่ง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การขออนุญาตเข้าถึงตำแหน่ง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การขออนุญาตเข้าถึงตำแหน่ง”
จัดการสิทธิ์และความเป็นส่วนตัวอย่างถูกต้อง คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การขออนุญาตเข้าถึงตำแหน่ง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การขออนุญาตเข้าถึงตำแหน่ง
- การรับตำแหน่งของผู้ใช้
- การแสดงแผนที่ใน SwiftUI
- การแปลงพิกัดเป็นที่อยู่และภูมิภาค