iOS: расположение ядра отключается после обновления? - PullRequest
1 голос
/ 27 сентября 2011

Очевидно, что для экономии батареи нам нужно использовать CoreLocation как можно быстрее и отключать ее, когда она не нужна. У меня есть приложение GPS, которое отслеживает местоположение пользователей, поэтому я использую почти все хорошие обновления местоположения. Мне все еще нужно отрываться от основного местоположения через какой-то интервал?

Глядя в приложение Apple "LocateMe", они, кажется, отключают его, когда находят местоположение, но меня смущает, когда оно снова включается? В моем случае не имеет смысла выключать его на долю секунды, а затем снова включать.

Мысли

Из "LocateMe":

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    // store all of the measurements, just so we can see what kind of data we might receive
    [locationMeasurements addObject:newLocation];
    // test the age of the location measurement to determine if the measurement is cached
    // in most cases you will not want to rely on cached measurements
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 5.0) return;
    // test that the horizontal accuracy does not indicate an invalid measurement
    if (newLocation.horizontalAccuracy < 0) return;
    // test the measurement to see if it is more accurate than the previous measurement
    if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy) {
        // store the location as the "best effort"
        self.bestEffortAtLocation = newLocation;
        // test the measurement to see if it meets the desired accuracy
        //
        // IMPORTANT!!! kCLLocationAccuracyBest should not be used for comparison with location coordinate or altitidue 
        // accuracy because it is a negative value. Instead, compare against some predetermined "real" measure of 
        // acceptable accuracy, or depend on the timeout to stop updating. This sample depends on the timeout.
        //
        if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) {
            // we have a measurement that meets our requirements, so we can stop updating the location
            // 
            // IMPORTANT!!! Minimize power usage by stopping the location manager as soon as possible.
            //
            [self stopUpdatingLocation:NSLocalizedString(@"Acquired Location", @"Acquired Location")];
            // we can also cancel our previous performSelector:withObject:afterDelay: - it's no longer necessary
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(stopUpdatingLocation:) object:nil];
        }
    }
    // update the display with the new location data
    [self.tableView reloadData];    
}

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Мне кажется, что ваши двойные требования о необходимости обновления местоположения каждый метр или около того против желания сэкономить батарею и желания использовать CoreLocation как можно быстрее, а затем отключить его "когда не нужно" несовместимы друг с другом. Если вам нужны обновления местоположения каждый метр или около того, нет времени, когда приложение будет на переднем плане, когда вам не понадобятся службы определения местоположения. В зависимости от характера вашего приложения вы можете отключить службы определения местоположения, когда переходите в фоновый режим или экран заблокирован ...

Еще одно исключение может заключаться в том, что вы хотите отключить службы определения местоположения, если пользователь некоторое время стоит на месте. Apple предоставляет услугу определения местоположения существенных изменений , но это не будет соответствовать вашим потребностям, как вам кажется, если вы хотите обновления по метрам ... у нее просто нет такого уровня разрешение.

Значит, не может быть решения, отвечающего обоим вашим желаниям?

0 голосов
/ 25 мая 2012

Можно настроить фильтр точности и расстояния

locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
locationManager.distanceFilter = 10;

зависит от точности и частоты обновления, которые вам нужны

0 голосов
/ 27 сентября 2011

это зависит от того, как часто вам нужно местоположение. Если вам нужно все время, пока ваше приложение работает, лучше включить обновления местоположения в applicationWillBecomeActive и отключить обновления в applicationWillResignActive

...