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


108

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

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

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

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

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

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

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

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

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

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

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

답변:


80

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

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

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

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

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


1
사람들을 혼동하지 않기 위해 내 대답에서 # 6을 뽑았습니다.
Aaron

아이러니하게도 중요한 변화를 위해 개발할 때도 같은 혼란을 느꼈습니다. 앱이 닫히면 어떻게 될지 여전히 의심이 있습니다. UIApplicationDelegate 콜백이 발생하지 않습니까? 앱을 시작하는 올바른 방법입니다. 위치 관리자가 아직 실행되지 않은 경우 어떻게 백그라운드에서 알림을받을 수 있습니까? (더 많은 R & D 시간)
darshansonde

샘플 앱 주셔서 감사합니다. 매우 유용했습니다. 질문이 있습니다. 중요한 서비스가 아닌 백그라운드에서 표준 위치 서비스를 사용하고 있었다면이 경우 종료 후에도 앱이 다시 시작됩니까? 당신이 나를 기운 수 있는지 자세히 여기에이 질문을, 나는 기쁠 것 :] stackoverflow.com/questions/12239967/...을
aslisabanci


앱이 종료되는 데 얼마나 걸 렸는지 알고 계십니까? 그런 다음 대신 appDelegate 콜백을 받으시겠습니까? (30 분? 2 시간? 5 시간?) 내가 묻는 이유는 모니터링 할 지역을 설정했기 때문입니다. 내 앱이 시작되는 것을 여러 번 시도했지만 앱을 다시 시작해야합니다. 다른 시간에는 didExitRegion콜백 이었지만 startLocationUpdates앱 실행을 통하지 않았기 때문에 거기에서 할 수 없었습니다 ...
Honey

25

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

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

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])

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

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

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

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

행운을 빕니다!


1
@Tegeril +1 답변 감사합니다. 나는 이것에 대해 귀뚜라미 소리를 듣기 시작했다. :) 일시 중단 된 앱이 startMonitoringSignificantLocationChanges를 다시 호출해야한다는 사실에 놀랐습니다. 이것이 설명 된 doco에 대한 링크가 있습니까? 내 이해는 일시 중단 된 상태에서로드되면 앱이 일시 중단되었을 때의 모든 개체가 인스턴스화된다는 것입니다. 따라서 중요한 변경 요청이 적용될 것으로 예상합니다.
RedBlueThing 2010 년

당신은 이것에 대해 이야기하고 있습니까? "다시 시작할 때 위치 관리자 개체를 구성하고이 메서드를 호출하여 위치 이벤트를 계속 수신해야합니다."그러나 이것은 앱이 종료 된 상태 (위치 이벤트에 의해)에서 시작된 경우를 의미한다고 생각합니다. 이것은 기본적으로 '정지 된 케이스는 어떻게 되나요?'라는 제 질문의 뿌리입니다.
RedBlueThing 2010 년

Dev 포럼의 Morgan Grainger는 다음과 같이 제안했습니다. "응용 프로그램이 시작될 때 CLLocationManager를 생성하고 델리게이트를 설정하고 startMonitoringSignificantLocationChanges를 호출해야합니다. 그렇지 않으면 Core Location에서 업데이트를 제공 할 곳이 없습니다." 종료 또는 일시 중지 상태에 관계없이 애플리케이션을 다시 시작하는 맥락에서. "앱이 startMonitoringSignificantLocationChanges 후에 다시 시작되었으며 이제 무엇입니까?"
아론

나는 이것이 포럼 게시물의 맥락에서도 여전히 모호 할 수 있다는 데 동의합니다 (포스터는 배경에서 깨어나는 것에 대해 논의했지만 Morgan은 더 일반적인 응용 프로그램 다시 시작을 사용했습니다). 중요한 변경 기능을 사용하려면 응용 프로그램이 다시 시작될 때 다시 모니터링해야한다고 생각합니다. 대신 백그라운드 작업을 시작하고 표준 위치 서비스 및 GPS 기능으로 업데이트하려면 대체 옵션입니다. 그래도 다시 시작하기 위해 중요한 변경 사항이있을 때마다 다시 등록 할 필요는 없다고 생각합니다.
아론

1
내가 최종 기쁜 일이 나온거야 :) 미래에 나에게 도움이 될 것입니다
아론

1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.