Programming

종료 / 중지 될 때 중요한 변경 위치 API에 대한 동작?

procodes 2020. 8. 4. 19:46
반응형

종료 / 중지 될 때 중요한 변경 위치 API에 대한 동작?


다음은 startMonitoringSignificantLocationChanges 를 사용한 앱 동작을 설명하는 CLLocationManager 문서 의 섹션입니다 .

이 서비스를 시작한 후 응용 프로그램이 종료되면 새 이벤트가 도착하면 시스템이 자동으로 응용 프로그램을 백그라운드로 다시 시작합니다. 이러한 경우 응용 프로그램 대리자의 application : didFinishLaunchingWithOptions : 메서드에 전달 된 옵션 사전에는 위치 이벤트로 인해 응용 프로그램이 시작되었음을 나타내는 UIApplicationLaunchOptionsLocationKey 키가 포함되어 있습니다. 다시 시작해도 여전히 위치 관리자 오브젝트를 구성하고이 메소드를 호출하여 위치 이벤트를 계속 수신해야합니다. 위치 서비스를 다시 시작하면 현재 이벤트가 대리인에게 즉시 전달됩니다. 또한 위치 서비스를 시작하기 전에도 위치 관리자 객체의 위치 속성이 최신 위치 객체로 채워집니다.

나의 이해는 앱 종료가 (당신이 전화를하지 않으면 내가 생각하는 경우이다 그래서 stopMonitoringSignificantLocationChanges을 에서 applicationWillTerminate ) 당신이 함께 깨어 얻을 것이다 UIApplicationLaunchOptionsLocationKey의 에 매개 변수 didFinishLaunchingWithOptions : 응용 프로그램 . 이 시점에서 CLLocationManager 를 작성 하고 startMonitoringSignificantLocationChanges를 호출 하고 제한된 시간 동안 백그라운드 위치 처리를 수행하십시오 . 그래서 나는이 비트로 괜찮습니다.

이전 단락에서는 앱이 종료 될 때 발생하는 작업에 대해서만 설명하고 응용 프로그램이 일시 중지되었을 때 수행 할 작업은 제안하지 않습니다. didFinishLaunchingWithOptions에 대한 설명서 는 다음과 같습니다.

응용 프로그램은 백그라운드에서 위치 업데이트를 추적하고 제거했으며 이제 다시 시작되었습니다. 이 경우 사전에는 새 위치 이벤트로 인해 애플리케이션이 다시 시작되었음을 나타내는 키가 포함됩니다.

종료 된 후 (위치 변경으로 인해) 앱이 시작된 경우에만이 전화를받을 것을 제안합니다.

그러나 Location Awareness Programming GuideSignificant Change Service대한 단락 에는 다음과 같은 내용이 있습니다.

이 서비스를 실행 상태로두고 애플리케이션이 일시 중지되거나 종료되면 새 위치 데이터가 도착하면 서비스가 자동으로 애플리케이션을 깨 웁니다. 깨우는 시간에 응용 프로그램이 백그라운드에 배치되고 위치 데이터를 처리하는 데 약간의 시간이 주어집니다. 응용 프로그램이 백그라운드에 있기 때문에 최소한의 작업을 수행하고 할당 된 시간이 만료되기 전에 응용 프로그램이 반환되지 못하게하는 작업 (예 : 네트워크 쿼리)을 피해야합니다. 그렇지 않으면 응용 프로그램이 종료 될 수 있습니다.

앱이 일시 중지 된 경우 위치 데이터로 깨어 났지만 깨어 난 방법에 대해서는 언급하지 못했습니다.

이 글을 쓰는 과정에서 방금 내 질문에 대답했을지 모르지만 더 잘 아는 사람이 이것을 이해하는 것이 좋을 것입니다.


이 질문을 한 이후로, 나는 대부분의 집과 직장 사이의 기차에서 약간의 테스트를 수행했으며 중단 된 앱의 동작이 질문의 끝에서 의심되는 것으로 확인했습니다.

즉, 일시 중지 된 앱이 깨어 났으며 앱 델리게이트에서 콜백을받지 않고 기존 CLLocationManagerDelegate를 통해 위치 업데이트를받습니다 . applicationState 를 확인하여 백그라운드에서 실행 중임을 감지하고 위치 처리를 수행하기 위해 일시 ​​중단 된 상태에서 깨어 난 경우에는 제한적인 작업을 수행 할 수 있습니다.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

나는 당신이 다운로드 하고 시험해 볼 수있는 위치 테스트 장치를 가지고이 결론에 도달 했습니다. UI를 통해 중요한 변경 및 GPS 변경 API를 켜고 돌아온 모든 응답을 기록 할 수있는 매우 간단한 앱입니다.

이전 답변의 NB 포인트 6이 올바르지 않습니다. 동결 건조 된 일시 중단 된 앱은 일시 중단 된 상태에서 깨어 났을 때 CLLocationManagerDelegate 콜백을 받습니다 .


내 이해는 다음과 같습니다 (이 API에 의존하지만 테스트를 시작할만큼이 구성 요소를 완료하지 않은 응용 프로그램을 작성하는 중입니다).

  1. 애플리케이션이 처음으로 실행되면, MonitoringMonitorificantLocationChanges 를 시작하도록 등록 하고 콜백 함수를 제공하십시오. 응용 프로그램이 실행되는 동안 중요한 변경을받을 때마다 해당 콜백을 호출합니다.
  2. 애플리케이션이 백그라운드에 배치되면 UIApplication은 applicationWillResignActive 를 수신 한 applicationDidEnterBackground 를 수신 합니다 .
  3. 백그라운드에서 일시 중단 된 상태에서 애플리케이션이 종료 된 경우 알림을받지 않습니다. 그러나 응용 프로그램이 실행되는 동안 (사전 지식 또는 배경 지식으로) 종료되면 applicationWillTerminate 와 함께 잠시 시간을 보내십시오 . 이 기능으로 추가 백그라운드 시간을 요청할 수 없습니다.
  4. 백그라운드에서 종료되었지만 OS는 응용 프로그램을 다시 시작합니다. OS에서 변경을 위해 응용 프로그램을 시작한 경우 didFinishLaunchingWithOptions 응용 프로그램을 호출합니다 .

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
    

    백그라운드 위치 변경으로 돌아 왔는지 판단하는 데 도움이됩니다.

  5. 대신 현재 백그라운드에서 실행 중이고 사용자가 앱을 수동으로 다시 시작한 경우 applicationWillEnterForegroundapplicationDidBecomeActive 가 수신 됩니다 .
  6. 응용 프로그램이 다시 시작될 때 (백그라운드 작업의 결과로 백그라운드에서 여전히 실행 중이고 해당 작업이 변경 내용 모니터링을 시작 하지 않은 경우) 콜백이 없기 때문에 명시 적으로 startMonitoringSignificantLocationChanges를 다시 시작하도록 지시해야합니다. "동결 건조"후에 더 긴 부착. 그리고 예, 일시 중단 된 상태에서 돌아온 일종의 위치 처리기를 다시 연결하면 didUpdateToLocation에서 코드를 구현하면됩니다.

이것이 현재 코드 개발에서 진행중인 작업입니다. 앞에서 언급했듯이 장치에서이를 테스트 할 준비가되어 있지 않으므로 모든 것을 올바르게 해석했는지 알 수 없으므로 주석 작성자는 자유롭게 수정하십시오. 이야기).

아, 그리고 불운이 닥쳐서 내가하고 싶은 일을하는 앱을 출시하면 울 수도 있습니다 :)

행운을 빕니다!


위치 변경으로 인해 응용 프로그램이 일시 중단 상태에서 해제 된 경우 응용 프로그램은 백그라운드 상태에서 시작됩니다.

모든 개체가 활성화되고 기존 대리인의 위치 업데이트를받습니다.

참고 URL : https://stackoverflow.com/questions/3421242/behaviour-for-significant-change-location-api-when-terminated-suspended

반응형