2014-09-26 3 views
2

IOS 개발에 착수하고 있으며 언어에 익숙하지 않습니다.IOS - 위치 업데이트 간격

백그라운드에서 기기의 위치를 ​​추적하는 앱을 개발하려고합니다. 일부 자습서를 따라 위치 업데이트를 기록하는 코드를 작성했습니다.

-(void)CurrentLocationIdentifier 
{ 
    locationManager = [CLLocationManager new]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation { 

     NSLog(@"%@", newLocation); 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [self CurrentLocationIdentifier]; 
} 

작동합니다. .plist 파일을 구성 했으므로 백그라운드에서 실행되도록 등록되어 있으므로 끝까지 기록됩니다.

하지만 업데이트가 주기적으로 정의 된 간격으로 필요합니다. 그렇지 않으면 배터리 킬러가됩니다. 배경에 대한 위치 정보 업데이트에 대한 질문은 여기에 있습니다.하지만 시도가 성공하지 못하고 막혔습니다. 나는 업데이트을 stoping 및 위치 업데이트 리스너 내에서 NSTimer에 시작 일정을 시도했습니다

:

CurrentLocationIdentifier 다시 시작 업데이트를 요청하는 방법이다
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation { 

     NSLog(@"%@", newLocation); 

     [locationManager stopUpdatingLocation]; 
     NSTimer *timer; 
     timer = [NSTimer scheduledTimerWithTimeInterval:10 
        target:self 
        selector:@selector(CurrentLocationIdentifier) 
        userInfo:nil 
        repeats:NO]; 
} 

.

하지만 처음 실행되면 예약 된 작업이 실행되지 않습니다! 내가 도대체 ​​뭘 잘못하고있는 겁니까? 다른 방법으로해야할까요?

답변

1

코드를 실행하기 위해 주어진 시간 간격 후에 응용 프로그램을 깨울 방법이 없습니다. 백그라운드 가져 오기와 영역 모니터링 또는 중요한 위치 변경이라는 두 가지 옵션이 있습니다. 주기적으로 위치 업데이트를 얻는 측면에서

가 (거리 이동보다는 시간을 기준으로), 당신이 할 수있는 최선은 한마디로 당신을 결정할 때 당신을 깨워 OS를 허용 API performFetchWithCompletionHandler을, 멀티 태스킹 아이폰 OS를 활용이다 처리 시간을 가질 수 있습니다. 원하는 시간을 처리하고 다시 잠자기 시간으로 약 30 초 정도 소요됩니다.

https://developer.apple.com/library/ios/documentation/uikit/reference/uiapplicationdelegate_protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:performFetchWithCompletionHandler

:

가이 설정 얻기 위해 많은 단계가 있지만 꽤 쉽게 올바른 방향을 가리켜 야합니다. 이 옵션을 사용하면 언제든지 이러한 이벤트를 예약 할 수는 없으며 실제로 백그라운드 가져 오기를 수행 할 수있는 빈도를 결정할 때 사용하는 OS와 알고리즘에 의해 실제로 제한됩니다. 오랜 시간이 걸리고 많은 배터리를 사용하면 페치 빈도가 줄어들며 너무 많은 시간을 들여 완료하지 않으면 종료됩니다. 백그라운드에서 "책임감있는"것은 OS로 끝나며 더 많은 시간을줍니다.

내 경험에 의하면, 위치 업데이트를 수행하고 서버 요청을 전송하는 동안 가능한 한 "책임감있는"역할을하기 때문에 백그라운드 가져 오기가 약 발생합니다. 15-30 분 간격.

사용자가 특정 거리를 이동할 때 깨어나고 싶다면, 지역 모니터링은이를 처리하기에 꽤 좋은 (그러나 불완전한) 방법이며, 앱을 깨우고 장기간 백그라운드 작업을 시작할 수 있습니다 (30 초), 작업을 끝내고 잠자기 상태로 돌아 가기 전에해야 할 일을하십시오.

2

백그라운드에서 상세한 위치 업데이트가 필요하지 않은 경우 significant location update service이 가장 좋은 방법 일 것입니다.그런데

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
     ... // Any other initialisation you already have 
    locationManager = [CLLocationManager new]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation]; 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    if ([CLLocationManager significantLocationChangeMonitoringAvailable] { 
     [locationManager stopUpdatingLocation]; 
     [locationManager startMonitoringSignificantLocationChanges]; 
    } 
    else { 
     //Decide what you want do to if it isn't available 
    } 
} 

- (void)applicationDidEnterForeground:(UIApplication *)application 
{ 
    [locationManager startUpdatingLocation]; 
    [locationManager stopMonitoringSignificantLocationChanges]; 
} 

, 당신이 사용하는 위임 방법, locationManager:didUpdateToLocation:fromLocation:은 더 이상 사용되지 않으며 당신은 locationManager:didUpdateLocations:

UPDATE 중요한 위치 변화는 모든 장치에서 사용할 수 없습니다 사용해야합니다, 그래서 나는 수표를 추가 내 코드에. 어떤 장치를 사용할 수 없는지 결정해야합니다. 아마도 표준 업데이트를 고수해야합니다. distanceFilter

+0

그러나 이것은 모든 사소한 변경 사항을 모니터링하는 것만큼 배터리를 소모하지 않습니까? – LcSalazar

+0

아니요, 중요한 위치 업데이트 변경 사항은 Wi-Fi 및 셀 타워 모니터링은 물론 GPS를 사용하여 사용자가 상당한 거리 (일반적으로 몇 백 미터 이상)를 이동할 때까지 위치 업데이트를 연기합니다. 올해와 지난 해의 위치 서비스에 대한 WWDC 비디오를 보거나 Apple의 위치 서비스 프로그래밍 가이드를 읽는 것이 좋습니다. 그들은 위치를 효율적으로 사용하기위한 우수 사례를 논의합니다. – Paulw11

+0

타이머 접근 방식을 사용하면 iOS를 "두 번째로 추측"하려고합니다. 이 방법을 사용하면 iOS가 기기에서 위치 업데이트를 조정할 수 있으며 다른 앱이 자세한 위치 정보를 사용하는 경우 앱에서 자동으로 업데이트 빈도가 높아집니다. 그렇지 않다면 iOS가 배터리 효율성을위한 위치 업데이트를 관리합니다 – Paulw11

2

나는 Github 프로젝트 https://github.com/dsdavids/TTLocationHandler을 가지고 있으며, 다운로드하여 즐기실 수 있습니다. TTLocationHandler는 다른 사람들이 가리키는 결과를 얻기 원할 때 설정할 수있는 클래스입니다. 백그라운드에서 위치 서비스를 사용하는 방법을 알아 내려고 당신의 상황에 정확히 맞춰서 만들었습니다.

예약 된 타이머로 정기적으로 발생시키는 아이디어는 잊어 버릴 것을 강력히 권장합니다. 아이디어는 이벤트 처리를 위해 핸들러를 설정 한 다음 리턴을 분석하고 필요에 따라 많은 액티비티로 응답을 필터링하는 것입니다. 나는 중요한 위치 변화가 가장 좋은 거래라고 생각한다.

중단없는 추적을 위해이 기능을 설정할 수 있으며 필요한만큼 자주 응답 할 수 있습니다. 그 배터리에 대한 타당한 이유가있는 것이 좋으며 그렇지 않으면 앱이 거부됩니다. 처음에는 내 앱이 거부되었지만 전원에 연결되어 있으면 앱이 완전히 작동하도록 설정했습니다. 나는 그들이 맞았다 고 생각한다. 중요한 위치 변경 및 지역 모니터링을 통해 필요한 모든 것을 얻을 수있었습니다. 내 애플 리케이션은 결코 locationManager가 야생 가서 배터리에 거의 영향을주지 않습니다.