스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
간소화된 위치 업데이트 알아보기
Core Location과 함께 미래로 나아가 보세요. 최신 Swift 동시성을 지원하는 CLLocationUpdate 클래스를 통해 위치 업데이트를 간편하게 받을 수 있습니다. 앱이 포그라운드 및 백그라운드에서 실행될 때 CLLocationUpdate 클래스가 어떻게 작동하는지 알아보고 모범 사례도 살펴봅니다.
리소스
관련 비디오
WWDC23
-
다운로드
♪ ♪
여러분, 안녕하세요 저는 시라지입니다 Core Location의 엔지니어죠 '간소화된 위치 업데이트 알아보기' 세션에서는 새로운 Core Location API를 살펴봅니다 그럼 시작하죠
이제 위치 업데이트가 코드 한 줄을 작성하는 것만큼 간단해졌습니다 정말 멋지죠? 새로운 Swift 네이티브 API는 최신 Swift 동시성을 지원해 위치 업데이트를 받습니다 더 자세히 알아보죠 새로운 CLLocationUpdate API의 구조를 자세히 설명한 뒤 이 API로 위치 업데이트를 받는 방법을 알려 드릴게요 그런 다음 백그라운드에서 위치 업데이트를 받을 때 필요한 작업을 살펴보죠 이어서 업데이트를 자동으로 중단 및 재개하는 법을 알아보고 마지막으로 이 API로 업데이트를 받을 때의 앱 수명 주기를 설명하며 마무리하겠습니다 그럼 CLLocationUpdate API의 구조부터 살펴봅시다 새로 도입된 클래스 CLLocationUpdate에서는 정적 함수 liveUpdates가 Updates라는 AsyncSequence를 반환합니다 for/try/await를 사용해 직접 반복하면 CLLocationUpdate 유형의 엘리먼트를 생성하죠 이 엘리먼트가 포함하는 건 CLLocation 유형의 위치와 자동 중단 및 재개를 관리하는 부울 플래그 isStationary입니다 또한 liveUpdates도 LiveConfiguration 열거형 형식의 선택적 인수를 사용합니다 이제 코드 연습을 통해 새로운 API로 업데이트를 받는 법을 알아보겠습니다 포그라운드에서 위치 업데이트를 받는 기본적인 앱을 빌드해 보죠 우선 CoreLocation을 가져옵니다 그런 다음 CLLocationUpdate 클래스가 제공하는 정적 팩토리 함수 liveUpdates를 호출하여 Updates AsyncSequence를 불러옵니다 이를 for/try/await로 직접 반복하면 클로저에 CLLocationUpdate가 나타나죠 그다음 위치 프로퍼티에 액세스해 위치를 가져옵니다 이렇게 하면 업데이트가 시작됩니다 중단하려면 어떻게 할까요? 중단할 때는 루프를 벗어나기만 하면 됩니다 isStationary 기억하시죠? isStationary가 true로 보고되면 루프를 벗어나 보겠습니다 그러면 자동으로 업데이트가 중단되죠 더는 시작 및 중단 메시지로 명시할 필요가 없습니다 CLLocationUpdate API가 반환한 AsyncSequence를 살펴봅시다 엘리먼트를 찾고 선택하고 제외하는 등 AsyncSequence에서 수행하는 중요한 작업은 업데이트 시퀀스에서도 수행할 수 있습니다 예제를 통해 AsyncSequence에서 첫 번째 필터를 바로 사용하는 법을 알아보죠 내부에서 업데이트가 시작되면 각 엘리먼트의 위치로 속도를 확인합니다 속도가 200 이상인 업데이트가 발견되는 순간 첫 번째 엘리먼트를 반환하면서 작업이 완료됩니다 첫 번째 일치 항목이 발견되면 업데이트가 자동으로 종료되죠 혹시 속도를 눈치채셨나요? 초속 200m이므로 대략 시속 720km네요 굉장히 빠르죠? 그래서 이런 필터를 쓸 때는 주의해야 합니다 일치 항목을 찾을 때까지 실행이 중단되니까요 horizontalAccuracy를 기반으로 위치를 필터링할 때는 더욱 조심해야 합니다 앞에서 업데이트를 받을 때 썼던 샘플 코드입니다 liveUpdates에 대한 구성을 전혀 지정하지 않았죠 그래서 자동으로 기본 구성이 설정됐습니다 liveUpdates API는 명시적 구성을 취할 수 있어요 이 구성은 새로운 열거형 형식으로 이 API의 일부로 도입됐습니다 이러한 열거형 형식의 멤버와 사용법을 알아보죠 LiveConfiguration 열거형은 미리 준비된 구성의 모음으로서 앱이 업데이트를 시작할 때 선택할 수 있습니다 멤버로는 default와 automotiveNavigation otherNavigation, fitness airborne이 있습니다 앱에서 이미 기존 위치 업데이트 API를 지닌 특정 CLActivityType을 사용한다면 그에 해당하는 LiveConfiguration 멤버를 선택하여 새 API를 받아들이는 동안 동일한 위치 경험을 누릴 수 있죠 특정 activityType이 필요하지 않은 경우에는 기본 구성으로 업데이트를 시작할 수 있습니다 구성을 아예 지정하지 않아도 되죠 이 'updates' AsyncSequence는 무엇을 산출할까요? 반복하면 CLLocationUpdate 유형의 객체가 생성됩니다 CLLocation 유형의 선택적 위치가 담겨 있죠 사용 가능한 위치가 없으면 위치가 nil로 표시된 업데이트를 제공합니다 또한 부울 프로퍼티 isStationary도 포함됩니다 위치 업데이트의 자동 중단 및 재개를 관리하죠 포그라운드에서 업데이트를 받는 법을 알아봤습니다 이번에는 앱이 백그라운드 실행 중일 때 업데이트하는 법을 알아보죠 실시간 현황으로 백그라운드 위치 업데이트를 활성화할 수 있습니다 실시간 현황이 활성화되어 있으면 추가 설정 없이 앱이 업데이트를 받습니다 하지만 앱에 실시간 현황이 없어도 괜찮습니다 그래도 문제없이 새 API를 도입할 수 있거든요 CLBackgroundActivitySession을 사용하면 되죠 사용법을 알아보겠습니다 여기 보이는 파란색 백그라운드 위치 표시는 많은 분이 이미 익숙하실 겁니다 앱을 사용하는 동안 백그라운드 업데이트를 승인했을 때 나타나는 표시죠 CLBackgroundActivitySession은 동일한 표시를 사용하여 백그라운드 위치 기능을 앱에 제공합니다 위치 서비스가 사용되고 있다는 표시를 사용자에게 계속 보여 줌으로써 이를 수행하죠 표시가 유지되기 때문에 앱을 효과적으로 사용하면서 백그라운드에서도 위치에 액세스할 수 있습니다 CLBackgroundActivitySession은 앱 승인을 전체적으로 지원합니다 그래서 앱이 백그라운드에서 업데이트를 받는 것은 물론 CLMonitor를 사용해 이벤트를 모니터링할 수도 있죠 BackgroundActivitySession은 업데이트 시작에 종속되지 않아요 세션을 생성하기만 하면 앱이 백그라운드에 있는 동안 표시가 나타나고 필요한 업데이트나 이벤트를 받을 수 있게 되죠 CLBackgroundActivitySession을 사용하려면 인스턴스화하여 유지해야 합니다 유지할 때 주의하세요 객체 할당 해제 시 자동으로 세션이 무효화되어 앱의 백그라운드 위치 액세스가 종료될 수 있거든요 UIBackgroundModes 배열에 위치가 있어야 BackgroundActivitySession이 효과적으로 작동할 수 있습니다 처리 중인 세션이 없다면 포그라운드에서 새로운 세션을 시작해야 합니다 하지만 백그라운드에서는 기존 세션에 재참여만 할 수 있죠 간단한 코드 연습으로 BackgroundActivitySession 사용법을 알아봅시다 이전 섹션에서 업데이트를 받을 때 사용한 코드입니다
업데이트를 시작하기 전에 CLBackgroundActivitySession 객체를 인스턴스화하여 새로운 세션을 시작하세요 self.backgroundActivity에 세션을 할당해야 합니다 로컬 변수가 아니라 프로퍼티에 할당하는 것이죠 이 점이 중요한 이유는 로컬 변수를 쓰면 스코프에서 벗어났을 때 유지 중인 객체의 할당이 해제되기 때문입니다 그러면 세션이 무효화되고 앱의 위치 액세스가 사라지죠 세션을 종료하고 싶으면 무효화 메시지를 보내거나 객체를 제거하면 됩니다 이렇게 하면 앱이 백그라운드에서 업데이트를 받을 수 있습니다 CLBackgroundActivitySession이나 실시간 현황을 통해서요 이번에는 새 API가 업데이트를 자동으로 중단 및 재개하여 배터리 수명에 어떤 도움을 주는지 알아봅시다 사용자가 이동하는 동안 앱이 업데이트를 수신한다고 가정하죠 하지만 기기는 하루에 여러 번 정지 상태가 됩니다 사용자가 사무실에 도착해서 책상 위에 기기를 둘 수도 있죠 이런 상황에선 앱에 같은 위치를 반복해서 제공하게 됩니다
이때 업데이트를 중단하여 전력 효율을 높일 수 있죠 그러면 중복된 위치 정보를 처리하지 않아도 되므로 앱의 부담을 줄일 수 있습니다 장치가 충분히 오랜 시간 정지 상태에 있으면 CLLocationUpdate API가 이를 인식하고 Automatic Pause를 작동합니다 Pause가 작동되면 nil이 아닌 위치와 True로 표시된 isStationary 플래그로 업데이트를 보내죠 이렇게 하면 사용자가 이동을 멈췄다는 걸 알 수 있습니다 위치를 사용할 수 없게 된 게 아니라요 나중에 장치가 다시 움직이기 시작하면 사용자의 상호 작용 없이 업데이트가 자동으로 재개됩니다 업데이트를 재개할 때 False로 표시된 isStationary를 전송하고 계속해서 앱에 업데이트를 전달하죠 앱이 백그라운드에 있는 동안 업데이트를 자동으로 중단 및 재개하면 앱 수명 주기에 영향을 줍니다 백그라운드에서 실행되는 동안 앱이 거치는 다양한 수명 주기 단계를 살펴보고 백그라운드 업데이트의 연속성 유지에 필요한 작업을 알아보겠습니다 포그라운드에서 실행되며 업데이트를 수신하던 앱이 백그라운드 실행으로 전환되는 경우가 있습니다 반대도 마찬가지죠 새 API를 사용하면 앱이 백그라운드 실행 상태에서 일시 중단 상태로 전환될 수 있습니다 전달할 업데이트가 없을 때 이렇게 될 수 있죠 예를 들어 장치가 움직이지 않는 상태가 되어 Automatic Pause가 작동됐거나 Location Services가 위치 변경을 계산하지 못했을 때요 하지만 걱정하지 마세요 CLLocationUpdate는 앱을 일시 중단 상태로 두지 않거든요 자동 재개가 시작되었거나 위치가 사용 가능해져서 업데이트가 가능해지는 순간 앱의 일시 중단이 해제되고 백그라운드 실행 상태로 다시 전환됩니다 앱이 일시 중단 상태에서 벗어나면 아무 동작이 없어도 백그라운드 업데이트가 이어집니다 일시 중단 상태만 있는 건 아닙니다 앱이 종료 상태로 전환되는 경우도 있죠 이러한 전환은 여러 방식으로 일어납니다 함께 살펴보죠 첫째로 백그라운드 실행에서 바로 발생하는 경우입니다 앱 충돌이나 사용자 종료 리소스 제약으로 인한 시스템 종료 때문이죠 둘째로 앱이 일시 중단 상태에서 종료 상태로 전환되는 경우입니다 사용자 종료나 리소스 제약 때문에요 하지만 좋은 소식이 있습니다 대부분의 경우 API가 앱을 복구할 수 있습니다 이미 종료되어서 실행 중이 아니어도 말이죠 위치 업데이트를 사용하게 되는 즉시 앱을 복구하고 백그라운드에서 앱을 시작합니다 그러면 앱이 종료 상태에서 백그라운드 실행 상태로 전환되죠 하지만 백그라운드 위치 세션을 계속하려면 앱을 시작한 뒤에 몇 가지 단계를 거쳐야 합니다
liveUpdates를 호출하여 업데이트를 재시작해야 하죠 앱이 BackgroundActivitySession을 사용하고 있었다면 CLBackgroundActivitySession도 다시 생성해야 합니다 백그라운드에서 기존 CLBackgroundActivitySession에 재참여만 할 수 있다고 말씀드렸죠? 새 세션을 시작할 수는 없고요 더 자세히 설명해 드릴게요 방금 재생성한 BackgroundActivitySession 객체는 새로운 세션을 시작한 게 아닙니다 새로운 세션 객체를 만든 거죠 앱이 종료되기 전에 이미 세션을 시작했기 때문에 앱이 이러한 재생성을 통해 백그라운드에서 기존 세션에 재참여할 수 있습니다 그러면 앱이 백그라운드 위치 업데이트를 계속할 수 있죠 좋습니다, 지금까지 백그라운드 앱 시작을 수신한 뒤 liveUpdates와 BackgroundActivitySession을 재생성하는 법을 알아봤습니다 재생성과 관련하여 주의해야 할 점이 몇 가지 있습니다
백그라운드 앱 시작을 수신하는 즉시 앱에서 재생성을 실행해야 합니다 객체를 재생성하는 위치는 앱이 백그라운드 시작을 수신하면 실행될 위치여야 하죠 저희 샘플 앱에서는 앱 시작 완료 시 호출되는 UIApplicationDelegate's - didFinishLaunchingWithOptions에 재생성을 배치했습니다 좋아요 새로운 위치 업데이트 API를 알아봤습니다 도입이 간소화되고 배터리 효율도 향상됐죠 올해부터 모든 플랫폼에서 사용 가능합니다 앱에서 CLLocationUpdate를 사용해 보시고 '피드백 지원'으로 소중한 피드백을 남겨 주세요 새 API 사용법을 보여 주는 샘플 앱도 있습니다 Resources 섹션에서 다운로드할 수 있죠 Apple 개발자 문서에서도 API를 자세히 알아볼 수 있습니다 'Core Location Monitor 알아보기' 세션도 추천합니다 올해 추가될 Core Location Monitoring API를 다루거든요 '간소화된 위치 업데이트 알아보기' 세션은 여기까지입니다 시청해 주셔서 감사합니다 ♪ ♪
-
-
0:26 - Getting location updates is easy!
for try await update in CLLocationUpdate.liveUpdates() { print("My current location : \(update.location)") }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.