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

May 01 2023
สำรวจ Geofencing เพื่อตรวจหาการเข้าและออกจากตำแหน่งที่ตั้งเฉพาะของผู้ใช้
นี่เป็นส่วนหนึ่งของชุดบทความเกี่ยวกับ Deep Dive Into Core Location Geofencing (การตรวจสอบภูมิภาค) เป็นขอบเขตเสมือนจริงรอบพื้นที่ทางภูมิศาสตร์ในโลกแห่งความเป็นจริง 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 ที่เราต้องการใช้เพื่อเริ่มการจำลอง

เรียกใช้ SimulateGeofencing

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

บทสรุป

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

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

ในบทความนี้ เราได้ให้คำแนะนำทีละขั้นตอนในการตั้งค่าและใช้ geofencing ในแอป iOS รวมถึงการขออนุญาตตำแหน่ง การตั้งค่า geofencing การจัดการข้อผิดพลาด geofencing และการดีบักในโปรแกรมจำลอง ด้วยคำแนะนำนี้ เราสามารถใช้ geofencing ในแอป iOS ของเราได้อย่างง่ายดาย และใช้ประโยชน์จากความสามารถอันทรงพลังของมัน