Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Apple
- FLUTTER
- Archive
- iOS16
- UIButton
- 이미지
- mac
- appstore
- Git
- window
- IOS
- view
- rxswift
- Session
- 한글
- JPA
- Realm
- MacOS
- github
- Notification
- SwiftUI
- darkmode
- Swift
- 개발자
- 웹뷰
- Firebase
- Xcode
- geofencing
- Code
- error
Archives
- Today
- Total
EEYatHo 앱 깎는 이야기
WWDC23 ) 간소화된 location updates 알아보기 본문
반응형
개요
이제 위치 업데이트가 코드 한줄을 작성하는 것 만큼 간단함~
for try await update in CLLocationUpdate.liveUpdates() {
print("My current location : \\(update.location)")
}
CLLocationUpdate (CLLocationUpdate API 소개)
- 새로운 CLLocationUpdate API의 구조를 자세히 설명
- CLLocationUpdate 클래스는 liveUpdates()라는 비동기 시퀀스를 반환하는 정적 메소드를 가짐
- liveUpdate() 메소드에는 LiveConfiguration을 선택적으로 넣을 수 있음
- for/try/await를 사용하여 CLLocationUpdate 인스턴스를 받음
- 이 인스턴스는 위치정보인 location과, 자동 중단/재개를 관리하는 bool값인 isStationary를 가짐
Getting updates (포그라운드에서 위치 업데이트 받기)
- 새로운 API로 위치 업데이트를 받는 방법
- 포그라운드에서 위치 업데이트를 받는 기본적인 앱부터 시작
- 아래 코드를 작성하면, 위치 업데이트가 시작됨
import CoreLocation let updates = CLLocationUpdate.liveUpdates() for try await update in updates { print("My current location : \\(update.location)") }
- 위치 업데이트를 중단하기 위해서는 isStationary를 사용하여 루프를 벗어나면됨
for try await update in updates { print("My current location : \\(update.location)") if update.isSatationary { break } // 위치 업데이트 중단 }
- 엘리먼트를 찾고, 선택하고, 제외하는 등 비동기 시퀀스에서 수행하는 중요한 작업은, 업데이트 시퀀스에서도 바로 수행할 수도 있음
- 속도가 초속 200m 이상인 위치 업데이트가 발생하면, 자동으로 업데이트를 종료하는 간단한 코드
- 하지만 조건에 맞는 업데이트가 발생할 때 까지 실행이 중단되므로 주의
let updates = CLLocationUpdate.liveUpdates() let update = try await updates.first(where: {($0.location?.speed ?? 0) > 200.0}) print("speed is: \\(update?.location?.speed ?? 0)")
- horizontalAccuracy를 기반으로 위치를 필터링할 때는 더욱 조심
- (자세한 이유가 안나옴. 정확도가 떨어져서 그런가?)
- liveUpdate()의 구성 (LiveConfiuration)
- LiveConfiuration 미리 준비된 구성들의 열거형임
- default
- automotiveNavigation
- otherNavigation
- fitness
- airborne
- 앱에서 이미 기존 위치 업데이트 API를 지닌 특정 CLActivityType을 사용한다면, 그에 해당하는 LiveConfiguration 멤버를 선택하여, 새 API를 받아들이는 동안 동일한 위치 경험을 누릴 수 있다고함
- LiveConfiuration 미리 준비된 구성들의 열거형임
- 비동기 시퀀스가 제공하는 update는 CLLocationUpdate 인스턴스
- 위치정보인 location (사용가능한 위치정보가 없으면 nil)
- 위치 업데이트의 자동 중지/재개를 관리하는 Bool프로퍼티인 isStationary로 구성
Updates in the background (백그라운드에서 위치 업데이트 받기)
- 백그라운드에서 위치 업데이트를 받을 떄, 필요한 작업들
- LiveActivity로 백그라운드 위치 업데이트를 활성화할 수 있음
- 백그라운드 업데이트를 위한 추천하는 방식
- 추가 설정없이 앱이 업데이트를 받을 수 있음
- 앱에 LiveActivity가 없다면 CLBackgroundActivitySession을 사용
- 아이폰 상단의 파란 화살표는, 앱을 사용하는동안 백그라운드 업데이트를 허용했음을 나타냄
-
- CLBackgroundActivitySession도 동일한 표시를 사용하며, 백그라운드 위치 기능을 앱에 제공
- CLBackgroundActivitySession는 앱 승인을 전체적으로 지원합니다. 따라서 앱이 백그라운드에서 업데이트를 받는 것은 물론, CLMonitor를 사용해 이벤트를 모니터링할 수도 있죠
- Works With: CLLocationUpdate, CLMonitor
- CLBackgroundActivitySession는 업데이트 시작에 종속되지 않습니다
- 세션을 생성하기만 하면, 앱이 백그라운드에 있는 동안 파란 화살표 표시가 나타나고, 필요한 업데이트나 이벤트를 받을 수 있죠
- CLBackgroundActivitySession를 사용하려면, 인스턴스화하여 유지해야 합니다
- 객체 해제시 자동으로 세션도 무효화되며, 앱의 백그라운드 위치 엑세스가 종료될 수 있음
- UIBackgroundModes에 “location”이 체크되어 있어야함
- 처리중인 세션이 없다면, 포그라운드에서 새로운 세션을 시작해야함
- 백그라운드에서는 기존 세션에 재참여만 할 수 있음
import CoreLocation // 새로운 세션 시작 self.backgroundActivity = CLBackgroundActivitySession() let updates = CLLocationUpdate.liveUpdates() for try await update in updates { print("My current location : \\(update.location)") } // 세션 종료 self.backgroundActivity.invalidate() // 객체 릴리즈시에도 종료
Automatic pause / resume (위치 업데이트의 자동 중지/재개)
- 위치 업데이트가 자동으로 중단/재개되는 방식
- 자동 중단/재개로 배터리 수명에 도움주기
- 기기가 오랫동안 제자리에 있을 경우, CLLocationUpdate API가 이를 인식하고 Automatic Pause를 작동
- Pause가 작동되면, nil이 아닌 위치와 true인 isStationary 플래그로 업데이트를 보냄. isStationary 로 사용자가 이동을 멈췄다는 걸 알 수 있다는 것.
- 기기가 이동하게 되면 업데이트가 자동으로 재개됨 (Automatic resume)
- resume시 false인 isStationary를 업데이트함
Process lifecycle (앱 수명주기에서의 동작)
- 새로운 API로 업데이트를 받을 때의 앱 수명 주기를 설명
- 앱이 백그라운드에 있는 동안 업데이트를 자동 중단/재개하면 앱 수명주기에 영향을 줌
- 백그라운드에서 실행되는 동안 앱이 거치는 다양한 수명 주기 단계를 살펴보고 백그라운드 업데이트의 연속성 유지에 필요한 작업을 알아봄
- 다양한 수명주기
- Background
- 포그라운드에서 실행되며 업데이트를 수신하던 앱이 백그라운드로 전환될 수 있으며, 그 반대도 있음
- Suspended
- 장치가 움직이지 않는 상태가 되면 Automation Pause되고, 이외 백그라운드에서 전달할 업데이트가 없다면 Suspended로 가게됨. 위치 서비스가 위치 변경을 계산하지 못했을 경우도 마찬가지.
- 하지만 CoreLocation은 앱을 Suspended로 두지 않음. Automation Resume이 시작었거나, 위치 서비스가 사용가능해져서 업데이트가 가능해지는 순간, 백그라운드로 다시 전환됨.
- 앱이 서스팬드에서 백그라운드로 갔을 경우, 아무런 동작이 없어도 백그라운드 업데이트가 이어짐
- Terminated
- 포그라운드, 백그라운드에서 크래시가 발생하여 Terminated로 갈 수 있음
- 백그라운드, 서스팬드에서 UserClose나, 메모리 관리로 인한 시스템의 종료로 Terminated로 갈 수도 있음
- 하지만, 대부분의 경우 API가 앱을 복구할 수 있음
- 위치 업데이트를 사용하게되는 즉시 앱을 복구하고, 백그라운드에서 앱을 시작합니다. (그런데 실험 해봐도 위치 업데이트만으로는 죽은 앱 살리기가 안됨. 모니터링을 해야함.)
- 하지만 이때, 백그라운드 위치 세션을 지속하려면 앱 시작후 몇가지 단계가 필요
- liveUpdates를 호출하여 업데이트를 재시작해야함
- CLBackgroundActivitySession를 사용중이었다면, CLBackgroundActivitySession도 재생성해야함
- 하지만 백그라운드에서는 재참여만 가능하지 새 세션을 만들지는 못한다고 했었죠?
- 방금 시작한 세션은 새로운 세션을 시작한게 아닙니다. 세션 객체를 만든 것일뿐. 앱이 종료되기 전에 이미 세션을 시작했었기 때문에, 재참여하는 것입니다.
- CLBackgroundActivitySession 재생성에 관해 추가 언급
- 백그라운드 앱 시작을 수신하는 즉시 앱에서 재생성을 실행해야함
- 샘플앱에서는 didFinishLaunchingWithOptions에 배치되어 있음 (샘플앱이 없는데?)
- Background
맺음말
새로운 위치 업데이트 API를 소개했습니다
도입이 간소화되고 배터리 효율도 향상되었죠
2023년부터 모든 플랫폼에서 사용이 가능합니다~
'iOS, Swift > WWDC, Session, Docu' 카테고리의 다른 글
Document ) iBeacon 장치와의 근접성 확인 (iBeacon 장치 감지, 거리 확인, +앱살리기) (0) | 2024.11.15 |
---|---|
WWDC19 ) CoreLocation 새로운 소식 (iOS13) (3) | 2024.11.14 |
Document ) Core Location Monitor 소개 (1) | 2024.11.01 |
Document ) 지리적 지역 근접성 Monitoring (1) | 2024.11.01 |
AppStore Session ) 앱 분석을 통해 유입 경로를 측정하고 개선하기 (0) | 2023.04.20 |
Comments