본문 바로가기

난 iOS개발자/iOS

백그라운드모드에서 위치정보 가져오기 (BackgroundModes + LocationUpdates)

728x90

이번 게시물은 최근 프로젝트를 진행하면서 접한 백그라운드 모드에 대해 간단히 경험을 기록한다.
많은 삽질이 있었으니 중간에 잘못된 정보가 보인다면 댓글로 지적해주세요.

시작

백그라운드에서 네트워크 정보가 변경되고 변경된 네트워크(WiFi)명이 내가 원하는 네트워크와 일치하는지 확인 하고 LocalNotification을 발생시키는 기능을 만들고 있었다.

모두 알다시피 앱이 백그라운드상태로 진입하게 되면 보통의 일반적인 기능들은 정지된다.
당장 타이머 하나를 생성해서 1초마다 log를 출력하도록 해보자. 로그를 확인했다면 백그라운드로 앱을 내려보자. 잘 나오던 로그가 멈춘것을 볼 수 있다.

Wi-Fi 를 감지하는 것 또한 위와 별 다를게 없으니 어떻게해야 백그라운드에서 동작을 수행할 수 있을지가 맞닥들인 첫번째 문제였다.

백그라운드 동작에 대해서 다뤄본 경험이 전무 했었기 때문에 정보를 찾느라 시간을 좀 들였다.

첫번째로 시도 해본건 BGAppRefreshTask 프레임워크를 사용하는 것이었다. AppRefreshTask를 사용하여 주기적으로 Wi-Fi를 체크하는 로직을 수행하려 했지만, BackgroundTask가 실행되는건 시스템이 지멋대로 깨워서 한다고 하니 내가 만들려는 기능을 해낼 수가 없었다.

결국 해결법은 raywenderlich에서 찾게 되었다.

 

Background Modes Tutorial: Getting Started

In this tutorial, you’ll create an app that uses the most common background modes: audio playback, location updates, general tasks, and background fetch.

www.raywenderlich.com



백그라운드를 설명하는 내용에서 내 눈에 띈 것은 위치 업데이트 (Location Update)였다.
백그라운드에서 앱사용자가 디바이스를 휴대한 채로 이동한 위치를 받아와 지도에 표시하는 내용이 그것인데, 앱의 특정 화면에서 백그라운드로 빠졌을때부터 앱을 강제 종료 시키거나 타임아웃에 걸릴 때까지 Wi-Fi를 감시하기에 딱 맞는 내용이었다.
혹시나 다른 좋은 방법이 있는지 지나가는 고수들의 의견이 있다면 듣고싶다.

결론은 Background LocationUpdate + Wi-Fi Detect의 조합으로 내가 가진 문제들을 해결 할 수 있게 되었다.
서론이 길었으니 BackgroundMode의 LocationUpdate는 어떻게 하는건지 알아보자.



Signing & Capabilites로 이동하여 +Capabilty를 Click
BackgroundModes를 추가해주자

BackgroundModes 가 추가되었다면 Modes목록중 Location Updates를 체크해준다.

앱이 포그라운드 상태에서 위치정보를 가져오려한다면 BackgroundModes를 건드리는 일은 없지 않은가?
다음은 간단한 코드작성!

위치정보 가져오는 코드는 여기

 

위치 정보 가져오기(CoreLocation, CLLocationManager)

위치권한이 필요한 프로젝트를 진행하면서, 계속 검색을 하다가 이제는 필요한 내용을 기록해야 겠다는 생각이 들어서 작성한다. 사용자의 위치권한을 받아야 하는 경우는 많지

greate-future.tistory.com

참고해서 작성한다.

내가 쓴 글에서 조~ 금 다른게 있다면
locationManager.startUpdatingLocation()과 allowsBackgroundLocationUpdates속성이다.

locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.desiredAccuracy = kCLLocationAccuracyBest
locationManager?.requestWhenInUseAuthorization()
locationManager?.allowsBackgroundLocationUpdates = true 
locationManager?.startUpdatingLocation()

locationManager의 allowsBackgroundLocationUpdates 속성을 true로 설정해줘야 한다는 것이다.
default 값이 false이기 때문에 BackgroundModes를 사용한다면 true 속성으로 변경이 필요하다.
backgroundModes로 location이 체크되지 않은 채 allowsBackgroundLocationUpdates 를 true로 변경하려 하면 앱이 크래시를 발생시킨다.


CLLocationManagerDelegate에는 델리게이트 메서드인 didUpdateLocation을 추가해주고 Update되는 위치정보를 받아오자. 여기로 위치정보가 수신될 때마다 WiFi를 읽어올 거다.

백그라운드 모드에서 위치정보를 받아오는 예제를 작성해봤다.
[https://github.com/KimDuni/BackgroundModes-LocationUpdates]


앱을 실행시켜보자.
다음과 같은 위치권한 동의팝업이 발생하면 허용을 누르자.


이제 백그라운드로 내려보면 아래와 같은 출력이 보인다.
주기적으로 Update가 발생한다.

Wi-Fi정보는 백그라운드 상태에서 위치정보가 업데이트될 때마다 아래 내용을 통해 받아오도록 한다.

 

현재 네트워크 정보 가져오기 CNCopyCurrentNetworkInfo

CNCopyCurrentNetworkInfo를 통해 현재 디바이스에서 사용중인 네트워크의 정보를 가져올 수 있다. CNCopyCurrentNetworkInfo사용 전에 알아야 할 것 아래 네 가지의 조건중 하나를 충족해야 정상적인 동작이

greate-future.tistory.com

 

728x90

'난 iOS개발자 > iOS' 카테고리의 다른 글

initialization-1  (0) 2022.04.25
Method( Instance Method, Type Method)  (0) 2022.03.16
Swift의 Property  (0) 2022.03.03
Timer로 작업 예약하기  (0) 2022.02.17
정확한 위치 정보  (0) 2022.02.16