เจาะลึกตำแหน่งหลักใน iOS: Geofencing (การตรวจสอบภูมิภาค)

นี่เป็นส่วนหนึ่งของชุดบทความเกี่ยวกับ Deep Dive Into Core Location
- ขอตำแหน่งผู้ใช้
- Geofencing (การตรวจสอบภูมิภาค) (ที่นี่)
- ตรวจสอบสถานที่เยี่ยมชมของผู้ใช้
- การแนะนำ
- ขออนุญาตสถานที่
- การตั้งค่า Geofencing
- การจัดการข้อผิดพลาด Geofencing
- การดีบักในโปรแกรมจำลอง
- บทสรุป
Geofencing (การตรวจสอบภูมิภาค) เป็นขอบเขตเสมือนจริงรอบพื้นที่ทางภูมิศาสตร์ในโลกแห่งความเป็นจริง Geofencing เป็นวิธีการแจ้งแอปพลิเคชันของเราเมื่ออุปกรณ์เข้าหรือออกจากพื้นที่ทางภูมิศาสตร์ที่กำหนดค่าไว้ ตัวอย่างเช่น แอปนี้ช่วยให้เราสร้างแอปที่สามารถส่งการแจ้งเตือนเพื่อบอกผู้ปกครองว่าบุตรหลานออกจากหรือเข้าสู่พื้นที่ใดพื้นที่หนึ่ง หรือแอปที่สามารถเปิดหรือปิดคุณสมบัติเมื่อเข้าหรือออกจากภูมิภาค
แม้ว่า Geofencing เป็นคุณสมบัติอันทรงพลังที่สามารถเพิ่มคุณค่าที่สำคัญให้กับแอพ iOS ได้ แต่ก็มีข้อเสียบางประการที่ควรพิจารณาเช่นกัน:
- Geofencing ต้องการการอนุมัติจากผู้ใช้ หากผู้ใช้ปฏิเสธบริการระบุตำแหน่ง Geofencing จะไม่ทำงาน
- Geofencing ต้องการการตรวจสอบตำแหน่งอย่างต่อเนื่อง ซึ่งอาจนำไปสู่การระบายแบตเตอรี่อย่างมาก
- Geofencing ขึ้นอยู่กับความสามารถเฉพาะของฮาร์ดแวร์
- Geofencing จำเป็นต้องเข้าถึงข้อมูลตำแหน่งของผู้ใช้ ซึ่งอาจทำให้เกิดข้อกังวลด้านความเป็นส่วนตัวหากจัดการอย่างไม่เหมาะสม
เนื่องจากคุณสมบัติ geofencing จำเป็นต้องเข้าถึงตำแหน่งของผู้ใช้ เราจำเป็นต้องขออนุญาตตำแหน่งของผู้ใช้จากผู้ใช้ เพื่อให้เรารับการอัปเดตตำแหน่งเมื่อผู้ใช้อยู่ในเบื้องหลังและเบื้องหน้า หากเราต้องการให้ geofencing ทำงานเมื่อแอปพลิเคชันอยู่ในพื้นหลัง เราจำเป็นต้องขออนุญาตตำแหน่งเพื่ออนุญาตเสมอ
ขั้นตอนที่ 1: ตั้งค่า Info.plist สำหรับความเป็นส่วนตัวของตำแหน่ง
ในการรับข้อมูลเกี่ยวกับตำแหน่งของผู้ใช้ เราจำเป็นต้องเพิ่มสตริงในไฟล์info.plist ข้อความสตริงนี้จะแสดงเมื่อแอปพลิเคชันขออนุญาต
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app need your location to provide best feature based on location</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app need your location to provide best feature based on location</string>
</dict>
เนื่องจากเราต้องการสนับสนุน Geofencing เพื่อดึงข้อมูลตำแหน่งในสถานะพื้นหลัง เราจำเป็นต้องตรวจสอบให้แน่ใจว่าLocation updates
ได้เลือกตัวเลือกในBackground Modes
แท็บแล้ว

ขั้นตอนที่ 3: ขออนุญาตทุกครั้ง
เราสามารถใช้requestAlwaysAuthorization()
เพื่อรับสิทธิ์ในการอนุญาตให้แอปพลิเคชันของเรารับการอัปเดตตำแหน่งเมื่อแอปพลิเคชันของเราอยู่ในพื้นหลัง แต่โปรดจำไว้ว่าเพื่อให้ได้รับ การอนุญาต เสมอแอปของเราต้องขออนุญาตเมื่อใช้งาน ก่อน ตามด้วยrequestAlwaysAuthorization()
import UIKit
import CoreLocation
class ViewController: UIViewController {
var locationManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
setupLocationManager()
}
private func setupLocationManager() {
locationManager = CLLocationManager()
locationManager?.delegate = self
// Request When In Use user permission
locationManager?.requestWhenInUseAuthorization()
}
}
extension ViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .notDetermined:
print("When user did not yet determined")
case .restricted:
print("Restricted by parental control")
case .denied:
print("When user select option Dont't Allow")
case .authorizedAlways:
print("Geofencing feature has user permission")
case .authorizedWhenInUse:
// Request Always Allow permission
// after we obtain When In Use permission
locationManager?.requestAlwaysAuthorization()
default:
print("default")
}
}
}
ขั้นตอนที่ 1: สร้างภูมิภาคที่เราต้องการตรวจสอบ
ในการทำงานกับฟีเจอร์ Geofencing ใน Core Location ก่อนอื่นเราต้องสร้างภูมิภาคที่แอปพลิเคชันของเราจะตรวจสอบ เราสามารถกำหนดพื้นที่ของเราให้อยู่กึ่งกลางของพิกัดที่เราต้องการตรวจสอบ และระบุขนาดของพื้นที่ได้โดยกำหนดรัศมี
จากเอกสารกล่าวว่า:
เมื่อพิจารณาว่ามีการข้ามเขตหรือไม่ ระบบจะรอให้แน่ใจก่อนที่จะส่งการแจ้งเตือน โดยเฉพาะอย่างยิ่ง ผู้ใช้ต้องเดินทางข้ามเขตแดนเป็นระยะทางขั้นต่ำและอยู่บนฝั่งเดียวกันของเขตแดนเป็นเวลาอย่างน้อย 20 วินาที เงื่อนไขเหล่านี้ช่วยกำจัดการเรียกปลอมไปยังเมธอดของวัตถุผู้รับมอบสิทธิ์ของคุณ
เราจำเป็นต้องกำหนดพื้นที่โดยใช้พิกัดศูนย์กลางและรัศมี จากนั้น เราสามารถใช้ geofencing API ของ Core Location เพื่อตรวจสอบภูมิภาคได้ เมื่อผู้ใช้เข้าหรือออกจากภูมิภาค แอปของคุณจะได้รับการแจ้งเตือน
เมื่อผู้ใช้เข้าหรือออกจากภูมิภาค แอปของคุณจะได้รับการแจ้งเตือน ระบบจะรอให้ผู้ใช้ข้ามเขตและอยู่อีกฝั่งเป็นเวลาอย่างน้อย 20 วินาทีก่อนที่จะส่งการแจ้งเตือนเพื่อหลีกเลี่ยงการแจ้งเตือนที่ไม่จำเป็น
class ViewController: UIViewController {
private func setupGeofencing() {
guard CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) else {
showAlert(message: "Geofencing is not supported on this device")
return
}
guard locationManager?.authorizationStatus == .authorizedAlways else {
showAlert(message: "App does not have correct location authorization")
return
}
startMonitoring()
}
private func startMonitoring() {
let regionCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 37.3346438, longitude: -122.008972)
let geofenceRegion: CLCircularRegion = CLCircularRegion(
center: regionCoordinate,
radius: 100, // Radius in Meter
identifier: "apple_park" // unique identifier
)
geofenceRegion.notifyOnEntry = true
geofenceRegion.notifyOnExit = true
// Start monitoring
locationManager?.startMonitoring(for: geofenceRegion)
}
private func showAlert(message: String) {
let alertController = UIAlertController(title: "Information", message: message, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .cancel))
self.present(alertController, animated: true, completion: nil)
}
}
setupGeofencing()
เป็นวิธีการตรวจสอบว่าอุปกรณ์รองรับคุณสมบัติ geofencing หรือไม่ จากนั้นเราต้องตรวจสอบให้แน่ใจว่าเราได้รับอนุญาตจากผู้ใช้เสมอstartMonitoring()
เป็นวิธีกำหนดขอบเขตที่เราต้องการมอนิเตอร์ โดยเราประกาศพิกัดภายในregionCoordinate
เรายังสามารถปรับรัศมีของขอบเขตที่เราต้องการมอนิเตอร์ได้- Apple อนุญาตการตรวจสอบเฉพาะ 20 ภูมิภาค โดยการใช้
identifier
คุณสมบัติในCLCircularRegion
เราสามารถแยกความแตกต่างของภูมิภาคหนึ่งจากอีกภูมิภาคหนึ่งได้
ภูมิภาคเป็นทรัพยากรที่ใช้ร่วมกันซึ่งอาศัยความสามารถเฉพาะของฮาร์ดแวร์ เพื่อให้แน่ใจว่าแอปทั้งหมดสามารถเข้าร่วมในการตรวจสอบภูมิภาค ตำแหน่งหลักจะป้องกันไม่ให้แอปใดแอปหนึ่งตรวจสอบมากกว่า 20 ภูมิภาคพร้อมกัน เมื่อต้องการหลีกเลี่ยงข้อจำกัดนี้ ตรวจสอบเฉพาะภูมิภาคที่ใกล้กับตำแหน่งปัจจุบันของผู้ใช้ ขณะที่ผู้ใช้ย้าย ให้อัปเดตรายการตามตำแหน่งใหม่ของผู้ใช้
ขั้นตอนที่ 2: จัดการการแจ้งเตือนภูมิภาค
แอปของคุณจะได้รับการแจ้งเตือนจากระบบเมื่อใดก็ตามที่ผู้ใช้เข้าหรือออกจากหนึ่งในภูมิภาคที่แอปของคุณลงทะเบียนไว้ แม้ว่าแอปจะไม่ได้ทำงานอยู่ในขณะนี้เมื่อผู้ใช้ข้ามเขตแดน ระบบจะพยายามเปิดแอปเพื่อจัดการการแจ้งเตือน
จากที่CLLocationManagerDelegate
เราสามารถใช้locationManager(_:didEnterRegion:)
เพื่อรับการแจ้งเตือนเมื่อผู้ใช้เข้าสู่ภูมิภาคและlocationManager(_:didExitRegion:)
เมื่อผู้ใช้ออกจากภูมิภาค
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
guard let region = region as? CLCircularRegion else { return }
showAlert(message: "User enter \(region.identifier)")
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
guard let region = region as? CLCircularRegion else { return }
showAlert(message: "User leave \(region.identifier)")
}
}
เราจำเป็นต้องปรับรหัสของเราภายในlocationManagerDidChangeAuthorization(_:)
เพื่อให้เราเรียกsetupGeofencing
เมื่อผู้ใช้authorizedAlways
อนุญาต
extension ViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .notDetermined:
print("When user did not yet determined")
case .restricted:
print("Restricted by parental control")
case .denied:
print("When user select option Dont't Allow")
case .authorizedAlways:
// setup geofencing feature and start monitoring
setupGeofencing()
case .authorizedWhenInUse:
locationManager?.requestAlwaysAuthorization()
default:
print("default")
}
}
}
การจัดการข้อผิดพลาด Geofencing
ในบางกรณี ข้อผิดพลาดเกิดขึ้นขณะพยายามตรวจสอบภูมิภาคที่เราตั้งไว้ การตรวจสอบภูมิภาคอาจล้มเหลวเนื่องจากไม่สามารถตรวจสอบภูมิภาคได้ หรือเนื่องจากมีความล้มเหลวทั่วไปในการกำหนดค่าบริการตรวจสอบภูมิภาค
เราสามารถรับการแจ้งเตือนเมื่อมีข้อผิดพลาด geofencing โดยดำเนินการlocationManager(_:monitoringDidFailFor:withError:)
จากCLLocationManagerDelegate
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, monitoringDidFailFor region: CLRegion?, withError error: Error) {
guard let region = region else {
print("The region could not be monitored, and the reason for the failure is not known.")
return
}
print("There was a failure in monitoring the region with a identifier: \(region.identifier)")
}
}
เราใช้ geofencing ภายในแอปพลิเคชันแล้ว ในการตรวจสอบว่าทำงานได้อย่างถูกต้องหรือไม่ เราสามารถจำลองการเคลื่อนที่เข้าและออกจากตำแหน่งนั้นโดยใช้ไฟล์gpx
ที่มีรายการพิกัดที่เรากำหนดไว้ ไฟล์นี้ช่วยให้เราทดสอบว่าคุณลักษณะนี้ตรวจหาได้อย่างถูกต้องหรือไม่เมื่อมีคนเข้าและออกจากสถานที่
ขั้นตอนที่ 1: สร้างไฟล์ gpx
เพื่อสร้างไฟล์ gpx ใหม่
- เลือกเมนูไฟล์ > ใหม่ > FileE
- เลือกไฟล์ GPXภายใต้ส่วนทรัพยากร จากนั้นคลิกถัดไป
- ระบุชื่อไฟล์และคลิกสร้าง ในกรณีนี้ เราสามารถตั้งชื่อไฟล์ GPX SimulateGeofencing

ในการจำลองการเปลี่ยนแปลงตำแหน่งเพื่อวัตถุประสงค์ในการทดสอบ เราสามารถกำหนดตำแหน่งเฉพาะโดยใช้ไฟล์GPX บทช่วยสอนนี้สาธิตวิธีระบุตำแหน่งโดยระบุละติจูด ลองจิจูด ชื่อ และเวลา ตัวอย่างเช่น เราสามารถจำลองเส้นทางที่เริ่มต้นจากHilton Garden Inn Cupertinoและย้ายไปที่Apple Parkและหลังจากนั้นไปยังN Tautau Ave
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
<wpt lat="37.3352915" lon="-122.0203281">
<name>Hilton Garden Inn Cupertino</name>
<time>2014-09-24T14:55:37Z</time>
</wpt>
<wpt lat="37.335056" lon="-122.008548">
<name>Apple Park</name>
<time>2014-09-24T14:55:45Z</time>
</wpt>
<wpt lat="37.336105" lon="-122.000029">
<name>N Tantau Ave</name>
<time>2014-09-24T14:55:50Z</time>
</wpt>
</gpx>
ขั้นตอนที่ 3: เรียกใช้แอปพลิเคชัน
ตอนนี้เราสามารถเรียกใช้แอปพลิเคชันของเราและจำลองการอัปเดตตำแหน่งตามไฟล์ GPX ที่สร้างไว้ก่อนหน้านี้ ในการทำเช่นนี้ เราจำเป็นต้องตั้งค่าเบรกพอยต์ในโค้ดของเรา จากนั้นเลือกไฟล์ GPX ที่เราต้องการใช้เพื่อเริ่มการจำลอง

หลังจากรอสักครู่ แอปพลิเคชันของเราจะแสดงการแจ้งเตือนที่แจ้งให้เราทราบเมื่อผู้ใช้เข้าสู่“apple_park”ซึ่งระบุว่าผู้ใช้เข้าสู่ภูมิภาค หลังจากนั้นไม่กี่วินาที แอปพลิเคชันของเราจะแสดงการแจ้งเตือนอีกครั้งเมื่อผู้ใช้ออกจาก“apple_park”ซึ่งระบุว่าผู้ใช้ออกจากภูมิภาค

บทสรุป
Geofencing เป็นคุณสมบัติอันทรงพลังที่มีให้โดย Core Location ใน iOS ซึ่งอนุญาตให้แอปพลิเคชันรับการแจ้งเตือนเมื่อผู้ใช้เข้าหรือออกจากพื้นที่ทางภูมิศาสตร์ที่กำหนดค่าไว้ ด้วยการใช้ geofencing เราสามารถพัฒนาแอพตามตำแหน่งที่สามารถให้คุณสมบัติที่มีประโยชน์ เช่น การแจ้งเตือนผู้ใช้เมื่อพวกเขาเข้าหรือออกจากพื้นที่หนึ่งๆ
อย่างไรก็ตาม สิ่งสำคัญคือต้องทราบว่า geofencing ต้องได้รับการอนุมัติจากผู้ใช้ การตรวจสอบตำแหน่งอย่างต่อเนื่อง ความสามารถของฮาร์ดแวร์เฉพาะ และการเข้าถึงข้อมูลตำแหน่งของผู้ใช้ ซึ่งอาจสร้างความกังวลเรื่องความเป็นส่วนตัว
ในบทความนี้ เราได้ให้คำแนะนำทีละขั้นตอนในการตั้งค่าและใช้ geofencing ในแอป iOS รวมถึงการขออนุญาตตำแหน่ง การตั้งค่า geofencing การจัดการข้อผิดพลาด geofencing และการดีบักในโปรแกรมจำลอง ด้วยคำแนะนำนี้ เราสามารถใช้ geofencing ในแอป iOS ของเราได้อย่างง่ายดาย และใช้ประโยชน์จากความสามารถอันทรงพลังของมัน