EEYatHo 앱 깎는 이야기

WWDC23 ) 간소화된 location updates 알아보기 본문

iOS, Swift/WWDC, Session, Docu

WWDC23 ) 간소화된 location updates 알아보기

EEYatHo 2024. 11. 14. 15:36
반응형

영상 링크

 

개요

이제 위치 업데이트가 코드 한줄을 작성하는 것 만큼 간단함~

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를 받아들이는 동안 동일한 위치 경험을 누릴 수 있다고함
  • 비동기 시퀀스가 제공하는 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에 배치되어 있음 (샘플앱이 없는데?)

 

 

맺음말

새로운 위치 업데이트 API를 소개했습니다

도입이 간소화되고 배터리 효율도 향상되었죠

2023년부터 모든 플랫폼에서 사용이 가능합니다~

 

Comments