[ios] 종료 / 일시 중단시 중요한 변경 위치 API에 대한 동작?

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

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

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

이전 단락에서는 앱이 종료 될 때 발생하는 일에 대해서만 설명하고 애플리케이션이 일시 중지되었을 때 수행하는 작업을 제안하지 않습니다. didFinishLaunchingWithOptions에 대한 문서 는 다음과 같습니다.

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

앱이 종료 된 후 (위치 변경으로 인해) 앱이 실행될 때만이 전화를받을 것을 제안합니다.

그러나 위치 인식 프로그래밍 가이드중요한 변경 서비스 에 대한 단락 에는 다음과 같은 내용이 있습니다.

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

이는 앱이 일시 중지 된 경우 위치 데이터로 깨어 났음을 의미하지만 어떻게 깨어 났는지 언급하지 않습니다.

  • 않습니다 UIApplicationDelegate은 내가 배경 상태로 일시 중단 된 상태에서 다시 시작하고 있음을 말해 콜백을 얻을?
  • 위치 관리자 (앱이 일시 중지되었을 때 동결 건조 됨)가 locationManager : didUpdateToLocation : fromLocation 콜백을 받기 시작 합니까?
  • 애플리케이션 상태를 확인하고 백그라운드 모드 인 경우 최소한의 처리 를 수행하는 내 didUpdateToLocation 메시지에 코드를 구현해야 합니까?

이 글을 작성하는 과정에서 제 질문에 방금 답한 것 같지만 더 많은 지식을 가진 사람이 이에 대한 이해를 확인하면 좋을 것입니다.



답변

이 질문을 한 이후로 꽤 많은 테스트를 수행했으며 (대부분 집과 직장 사이의 기차에서) 일시 중단 된 앱의 동작이 질문 끝에서 예상했던대로임을 확인했습니다.

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

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

다운로드 하여 사용해 볼 수있는 위치 테스트 장치를 통해이 결론에 도달 했습니다. UI를 통해 중요한 변경 및 GPS 변경 API를 켜고 반환되는 모든 응답을 기록 할 수있는 매우 간단한 앱입니다.

이전 답변의 NB 포인트 6은 정확하지 않습니다. 동결 건조 일시 중단 된 앱은 일시 중단 된 상태에서 깨어날 때 CLLocationManagerDelegate 콜백을 수신 합니다.


답변

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

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

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])

    백그라운드 위치 변경에서 돌아 왔는지 확인하는 데 도움이됩니다.

  5. 대신 현재 백그라운드에서 실행 중이고 사용자가 앱을 수동으로 다시 시작하는 경우 applicationWillEnterForeground 다음에 applicationDidBecomeActive 가 수신 됩니다 .
  6. 어떤 일이 발생했는지에 관계없이 애플리케이션이 다시 시작될 때 (백그라운드 작업의 결과로 백그라운드에서 계속 실행 중이고 작업이 변경 사항 모니터링을 시작했다고 말하지 않는 한) 콜백이 no이므로 startMonitoringSignificantLocationChanges에 다시 명시 적으로 알려야합니다. “동결 건조”후 더 오래 부착됩니다. 그리고 예, 일시 중단 된 상태에서 돌아온 어떤 종류의 위치 처리기를 다시 연결하면 didUpdateToLocation에서 코드를 구현하면됩니다.

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

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

행운을 빕니다!


답변

응용 프로그램이 위치 변경의 결과로 일시 중단 된 상태에서 해제되면 응용 프로그램이 백그라운드 상태에서 시작됩니다.

모든 개체가 라이브 상태가되고 기존 대리자에서 위치 업데이트를 받게됩니다.


답변