2012-07-04 5 views
3

코어 위치를 사용하여 항상 사용자의 위치를 ​​추적해야하는 iPhone 앱을 제작하려고합니다. 나는 startMonitoringSignificantLocationChanges을 사용하여 백그라운드에서 업데이트하고 중요한 변경 사항이있을 때마다 업데이트되는 정확성만큼 중요하지 않기 때문에.iOS 앱에서 온라인 백그라운드로 위치를 업데이트하는 방법은 무엇입니까?

현재 웹 서비스에 대한 HTTP 요청을 만들어 위치를 업데이트합니다. 이 앱을 실행할 때 완벽하게 작동합니다. 위치 정보가 MySQL 데이터베이스에 업데이트되어 위치 데이터가 저장됩니다.하지만 앱이 백그라운드로 들어올 때 휴대 전화의 오른쪽 상단에 위치 서비스 아이콘이 표시됩니다. 아직 실행 중이지만 데이터베이스로 돌아가서 내 위치를 전혀 업데이트하지 않았습니다. 나는 마을을 가로 지르는 운전, 앱을 실행하는 한 가지 방법, 백그라운드에서 앱을 사용하는 한 가지 방법으로이 사실을 테스트했습니다. 애플의 문서에서

: 새로운 위치 데이터가 도착하면이 서비스 실행을 떠나 응용 프로그램이 이후 중단 또는 종료 된 경우

는 서비스가 자동으로 응용 프로그램을 깨어. 웨이크 업 (wake-up) 시간에 응용 프로그램이 백그라운드로 들어가고 위치 데이터를 처리하는 데 약간의 시간이 소요됩니다. 응용 프로그램이 백그라운드에 있기 때문에 최소한의 작업 만 수행하고 할당 된 시간이 만료되기 전에 반환하지 못하는 작업 (예 : 네트워크 쿼리)을 피하십시오. 그렇지 않으면 신청서가 종료 될 수 있습니다.

정확히 "위치 데이터를 처리하는 데 소량의 시간"이 얼마나 걸립니까? 그리고 네트워크를 쿼리하는 것이 권장되지 않습니까? 아니면 그 시간에 네트워크를 쿼리 할 수 ​​없습니까? 앱이 백그라운드에 있어도 여러 다른 사용자의 위치를 ​​추적하는 더 좋은 방법이 있습니까?

답변

4

백그라운드 작업을 살펴 ​​봐야합니다.

Apple이 small amount of time to process location data라고 말하면 locationManager:didUpdateToLocation:fromLocation: 메서드가 반환 된 후에 처리 시간을 얻는 데 정말로 의존해서는 안됩니다. 별도의 스레드에서 비동기 적으로 HTTP 요청을 실행한다고 가정하면 앱이 일시 중지되기 전에 완료 할 충분한 시간이 없을 가능성이 높습니다.

UIBackgroundTasks를 사용하면 백그라운드에서 추가 처리 시간을 운영 체제에 요청할 수 있습니다. HTTP 요청을 만드는 것은 그런 작업 일 수 있습니다. 제한 시간은 10 분이지만 많은 시간을 할애 할 수는 없습니다.

위치 콜백에서 요청에 대한 새 백그라운드 작업을 정의해야합니다. 만료 처리기 블록은 운영 체제가 더 이상의 처리 시간을 제공 할 수 없다고 판단하면 언제든지 트리거됩니다.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    // Start your request here 
    UIBackgroundTaskIdentifier backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     backgroundTask = UIBackgroundTaskInvalid; 
     // Cancel your request here 
    }]; 
} 

그리고 요청이 당신이 작업을 수행하는 응용 프로그램 말해야한다 완료되면 :

- (void)requestFinished:(id)request { 
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
    backgroundTask = UIBackgroundTaskInvalid; 
} 

이 예에서는, 나는 당신이 전에 여러 위치 콜백을받을 수 고려하지했습니다 요청이 완료되었습니다. 이런 일이 발생하면 새 요청을 시작하기 전에 요청 및 현재 백그라운드 작업을 취소하거나 각 요청에 대해 별도의 백그라운드 작업을 만들어야합니다.

또 다른 방법은 위치 콜백 메소드의 주 스레드에서 동 기적으로 HTTP 요청을 실행하는 것입니다.하지만 사용자가 인터페이스를 열면 인터페이스를 잠그는 것과 같은 여러 가지 이유로 인해 나쁜 일이 될 것입니다. 요청이 실행되는 동안

+0

굉장합니다. 이것은 효과가있다. 지금 조정하고 테스트하면 ... – unsunghero

+0

위대한 일을했습니다. 빠른 질문 - 어떻게 백그라운드에서 실행할 코드 블록을 결정합니까? 백그라운드 작업이 시작된 전체 기능일까요? – unsunghero

+2

백그라운드 작업을 시작할 때 기본적으로 시스템에 실행하려는 작업 (이 경우 HTTP 요청)이 있음을 알립니다. 시스템은 당신이 UIBackgroundTaskIdentifier를 제공하는 이유 때문에 당신이 작업 시작과 끝 사이에서 무엇을하는지 알지 못합니다. 그래서 당신은 작업이 끝났을 때 다시보고 할 수 있습니다. UIBackgroundTaskIdentifier를 로컬 변수로 선언하기 때문에 예제 코드가 약간 명확하지 않을 수 있습니다. 오히려 요청이 끝나고 endBackgroundTask :로 전달할 때 액세스 할 수있는 인스턴스 변수 여야합니다. –

관련 문제