Tìm hiểu về CLVisit

Trong nhiều trường hợp, app sẽ có tính năng xác định xem user có đến 1 nơi nhất định hay không. Ta có thể liên tưởng đến là 1 place hay visit nào đó chứ không phải là raw GPS coordinate. Điều đó có thể thực hiện được với region monitoring (giới hạn bởi số lượng vùng) hay iBeacon ranging (yêu cầu phải cài đặt phần cứng beacon). Xây dựng 1 checkin app hay 1 journaling app theo cách truyền thống sẽ tốn nhiều pin với location monitoring và tốn nhiều thời gian để xử lý tùy chỉnh. Apple đã giải quyết việc này bằng cách giới thiệu CLVisit - 1 loại mới của background location monitoring. 1 CLVisit sẽ thể hiện thời gian user trải qua ở 1 địa điểm bao gồm cả coordinate và start / end timestamps.

Sử dụng

Về cơ bản, sử dụng visit monitoring không cần làm nhiều như các background location tracking khác. Chỉ cần gọi

locationManager.startMonitoringVisits()

Nó sẽ enable background visit tracking, đương nhiên user phải cấp quyền Always authorization cho app. Khi bắt đầu, app sẽ được woke up định kỳ dưới background khi cập nhật mới xuất hiện. Không giống với location monitoring cơ bản, nếu hệ thống có 1 số lượng visit trong queue (thông thường được enable bởi deferred updates), delegate method sẽ được gọi nhiều lần và mỗi lần là 1 single visit chứ không phải là 1 array CLLocation. Gọi hàm dưới đây sẽ stop tracking.

locationManager.stopMonitoringVisits()

Xử lý Visit

Mỗi visit sẽ chứa vài property cơ bản: coordinate trung bình của nó, horizontal accuracy, và arrival / departure times. Mỗi lần visit được track, CLLocationManagerDelegate sẽ được gọi 2 lần: lần 1 khi user đến 1 địa điểm và lần 2 khi user rời đi. Ta có thể nhận biết dựa vào departureDate. 1 departure time của **NSDate.distantFuture() ** nghĩa là user vẫn ở nơi đó

func locationManager(_ manager: CLLocationManager, didVisit visit: CLVisit) {
        let location = CLLocation(latitude: visit.coordinate.latitude, longitude: visit.coordinate.longitude)
        if visit.departureDate == Date.distantFuture {
            self.showNotification("arrived  \(visit.coordinate.latitude) :: \(visit.coordinate.longitude) arrivalDate  \(visit.arrivalDate) ")
        }
        else {
            self.showNotification("left  \(visit.coordinate.latitude) :: \(visit.coordinate.longitude) arrivalDate  \(visit.arrivalDate) departDate \(visit.departureDate)")
        }
}

Tuy nhiên CLVisit chưa là hoàn hảo. Mặc dù thời gian bắt đầu và kết thúc nói chung là chính xác trong vòng 1-2 phút, lines có thể biết nơi nào là visit, nơi nào không. Đứng ở 1 góc coffee shop trong 1 phút có thể không trigger visit, nhưng chờ đèn giao thông trong 1 thời gian dài thì có thể. Có thể Apple sẽ improve chất lượng visit detection trong những bản nâng cấp hdh tương lai. Nhưng hiện giờ ta có thể tránh dựa vào CLVisit và tự làm 1 visit detection của riêng mình cho tùy mục đích sử dụng để dữ liệu có thể chính xác nhiều nhất có thể.