"Use region monitoring to determine when the user enters or leaves a geographic region."
사용자가 지리적 지역에 진입하는 혹은 떠나는 시점을 확인하기 위해 지역 모니터링을 사용합니다.
지역 모니터링(geofencing이라고도 알려진)은 사용자가 지리적 지역에 진입하거나 빠져나올 때 알림이 울리도록 하는 방법입니다. 위치 관련 작업 수행을 위해 지역 모니터링을 사용할 수 있습니다. 예를 들어 리마인더 앱은 사용자가 구체화된 지역에 도착하거나 떠날 때 리마인더를 트리거하기 위해서 지역 모니터링을 사용할 수 있습니다. Figure 1에서 보이는 것과 같습니다.
Figure 1 Notifying the user upon leaving a geographic region
iOS에서 지역은 사용자가 정의된 지역 경계를 건널 때 필요한 경우 앱을 깨우기도 하는 시스템에 의해 모니터링됩니다. macOS에서 지역 모니터링은 앱이 실행중(포어그라운드와 백그라운드 상관없이)일 때에만 작동하고 사용자의 시스템이 깨어납니다. 시스템은 지역 관련 노티피케이션을 전달하기 위해 맥 앱을 launch하지는 않습니다.
지역은 지리적 좌표를 중심으로 하는 원형 지역이며, CLCircularRegion
객체를 사용해서 한 곳을 정의할 수 있습니다. 지역 객체의 반경은 경계로 정의합니다. 모니터링하길 원하는 지역을 정의할 수 있고, CLLocationManager
객체의 startMonitoring(for:)
메소드를 호출해서 시스템에 지역을 등록할 수 있습니다. 시스템은 명시적으로 멈춰지길 요청받거나 기기가 다시 부팅될 때까지 지역 모니터링을 합니다.
Listing 1은 메소드의 호줄자에 의해 정의된 지점 근처가 중심이 되는 지역의 설정 및 등록 방법을 보여주고 있습니다. 메소드는 지역의 경계를 정의하기 위해 허용되는 가장 큰 반경을 사용하고, 사용자가 지역에 진입할 때에만 시스템이 노티피케이션을 전달할 수 있도록 요청하고 있습니다.
Listing 1 Monitoring a region around the specified coordinate
func monitorRegionAtLocation(center: CLLocationCoordinate2D, identifier: String ) {
// Make sure the devices supports region monitoring.
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
// Register the region.
let maxDistance = locationManager.maximumRegionMonitoringDistance
let region = CLCircularRegion(center: center,
radius: maxDistance, identifier: identifier)
region.notifyOnEntry = true
region.notifyOnExit = false
locationManager.startMonitoring(for: region)
}
}
Tip
지역은 특정 하드웨어 기능에 의존하는, 공유되는 리소스입니다. 모든 앱이 지역 모니터링에 참여하는 것을 보장하기 위해 코어 로케이션은 하나의 앱이 동시에 스무 지역이 넘는 지역 모니터링을 방지합니다. 이 제한을 해결하려면 사용자의 현재 위치와 가까운 지역만을 모니터링해야 합니다. 사용자가 움직이면 사용자의 새 위치에 기반해 리스트를 업데이트합니다.
사용자가 앱의 등록된 지역 중 한 곳의 경계를 건널 때마다 시스템은 앱에게 이를 알려줍니다. iOS 앱이 경계를 건널 때 실행중이지 않다면 시스템은 앱 launch를 시도합니다.
경계를 건너는 것에 대한 노티피케이션은 로케이션 매니저의 딜리게이트 객체로 전달됩니다. 구체적으로 로케이션 매니저는 자신의 딜리게이트의 locationManager(_:didEnterRegion:)
혹은 locationManager(_:didExitRegion:)
메소드를 호출합니다. 앱이 launch 되면 CLLocationManager
객체를 설정해야 하고, 즉시 딜리게이트 객체를 설정해야 합니다. 그렇게 해야 이러한 노티피케이션을 받을 수 있습니다. 위치 이벤트에 대해서 앱의 launch 여부를 결정하려면 launch 옵션 딕셔너리에서 UIApplication.LaunchOptionsKey
를 찾으시기 바랍니다.
경계를 건넜는지 여부를 결정하는 경우 시스템은 노티피케이션을 보내기 전에 확실해질 때까지 기다립니다. 구체적으로 사용자는 경계를 넘어 최소 거리 만큼 움직여야 하고, 최소 20초 동안 경계의 같은 방향에 있어야 합니다. 이 조건은 딜리게이트 객체의 메소드를 잘못 호출하는 것을 막아줍니다.
Listing 2는 사용자가 등록된 지역에 진입할 때 호출되는 딜리게이트 메소드를 보여주고 있습니다. 지역은 관련 아이덴티파이어를 갖습니다. 이 아이덴티파이어는 이 메소드가 지역에 관련된 정보를 찾고 관련 액션을 수행하기 위해 사용합니다.
Listing 2 Handling a region-entered notification
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if let region = region as? CLCircularRegion {
let identifier = region.identifier
triggerTaskAssociatedWithRegionIdentifier(regionID: identifier)
}
}
앱의 종료(사용자 혹은 시스템에 의한)는 지역 경계를 건너는 것에 대한 처리를 위해 다시 launch되는 것을 막지 않습니다. 그러나 백그라운드 앱 리프레시가 비활성화되어 있는 경우 특정 앱 혹은 모든 앱 상관없이 사용자는 모든 위치 관련 이벤트의 전달을 재개하려면 명시적으로 앱을 launch 해야 합니다.
중심점과 반경으로 구체화되는 원형 모양의 지리적 지역입니다.
https://developer.apple.com/documentation/corelocation/clcircularregion
https://velog.io/@panther222128/CLCircularRegion
모니터링될 수 있는 지역을 나타내는 베이스 클래스입니다.
https://developer.apple.com/documentation/corelocation/clregion
https://velog.io/@panther222128/CLRegion