startMonitoringForRegion против CLRegion:containCoordinate

в моем приложении IOS я реализую геозону. В текущей реализации я использую такой код:

  CLRegion* region3 = [[CLRegion alloc] initCircularRegionWithCenter:coordinates radius:100 identifier:@"region3"];
[self.locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyHundredMeters];

а затем я использую эти методы делегата:

 (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
        NSLog(@"didenterregion");

    }
    (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
        NSLog(@"didexitregion");
    }

    (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
    {NSLog(@"monitoringDidFailForRegion");}

Однако этот код работает нормально только для радиуса более 100 м.

Вот несколько вопросов:

  1. Apple говорит, что в iOS6 и выше радиус от 1 до 400 м поддерживается для устройств 4s и выше. Поскольку мне все равно, сколько времени потребуется для просмотра сообщения (например, мне все равно, чтобы увидеть сообщение при входе в регион, но я хочу увидеть его позже, если я когда-то прошел из этого региона), могу ли я использовать меньший радиус? Меня интересует что-то вроде радиуса 50 м или меньше? (в некоторых регионах для моего случая понадобится даже 20м).

Я тоже так думаю. Apple заявляет, что может поддерживаться до 20 регионов. Каковы преимущества/недостатки такого решения (я еще не реализовал его, но мне нужно ваше мнение).

Псевдокод будет таким:

Declare the regions - save them in an array
Do not call start monitoring

И затем в методе делегата:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
      for loop in all my regions {
         if ([region containsCoordinate: newLocation.coordinate])
            code for entering region
      } 
}
  1. Было бы медленнее?
  2. Будет ли это потреблять больше батареи? (думаю мониторинг по регионам не жрет батарею)?
  3. Можно ли точнее?
  4. Могу ли я иметь более 20 регионов, так как я не регистрируюсь для мониторинга?

Заранее спасибо.


person ghostrider    schedule 08.09.2013    source источник
comment
вот решение stackoverflow.com/questions/22297995/   -  person uofc    schedule 06.06.2014


Ответы (1)


1.

Я подозреваю, что вторая (на основе didUpdateToLocation:) реализация будет более дорогой (с точки зрения времени автономной работы) по сравнению с первой реализацией просто потому, что вы будете запускать код в первой (на основе startMonitoringForRegion:) реализации только тогда и только тогда, когда устройство придет в радиусе одного из (максимум 20) регионов, которые вы отслеживаете.

В то время как во второй реализации код должен выполняться каждый раз при вызове делегата "didUpdateToLocation:" (что происходит довольно часто), а затем запускается код внутри метода делегата.

Кстати, вы говорите, что код отлично работает для радиуса 100 м и выше, но затем в документации Apple говорится, что он должен работать в iOS6, где «радиус от 1 до 400 м поддерживается для устройств 4s и выше. "

Является ли ваше число «100 м» вашим практическим результатом или это ограничение устройства, которое вы используете (что-то старше, чем iPhone 4s или более старая версия iOS)?

2.

Что-либо делать в фоновом режиме потребляет заряд батареи the-users">но Apple несколько оптимизировала CoreLocation для этого (при условии, что вы установили правильный флаг в файле info.plist вашего приложения)

3.

Я думаю, что оба будут примерно одинаково точными, за исключением того факта, что может потребоваться до нескольких минут, чтобы "startMonitoringForRegion:" сообщил о входе в регион или выходе из него.

4.

И да, во второй реализации у вас может быть столько регионов, сколько вы хотите отслеживать. Однако чем больше кода вы запускаете в фоновом режиме, тем горячее становится батарея и тем больше вероятность того, что вы быстрее разряжаете батарею.

person Michael Dautermann    schedule 08.09.2013
comment
Даутерман Спасибо за информацию! Что вы предлагаете, если код делегата в didUpdateToLocation вызывается каким-либо образом, поскольку я использую его для измерения текущей скорости, расстояния и т. д.? Или чем больше вещей я там делаю, тем больше батареи я потребляю. И да, у меня есть iPhone 4, так что я думаю, что это ограничение устройства. - person ghostrider; 08.09.2013
comment
Я думаю, дело в том, что чем больше вещей я делаю внутри, тем больше батареи я потребляю. У меня есть еще один собственный проект, над которым я работаю, который выполняет фоновую обработку, и он действительно потребляет время автономной работы, поэтому его нужно будет исправить в краткосрочной перспективе. Клиенты очень чувствительны к проблемам производительности, таким как срок службы батареи, поэтому все, что вы можете сделать для оптимизации производительности, будет полезно. - person Michael Dautermann; 08.09.2013