2013-09-08 3 views
2

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

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 регионов, так как я не регистрирую монитор?

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

+0

heres решение http://stackoverflow.com/questions/22297995/add-more-than-20-regions-to-geofencing-ios/24080059#24080059 – uofc

ответ

5

1.

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

Принимая во внимание, что во второй реализации code has to run each time there's a "didUpdateToLocation:" delegate call (что будет происходить довольно часто), а затем код внутри метода делегата будет запущен.

B.T.W., вы говорите, что код работает отлично в радиусе 100 м выше, но документация Apple, говорит, что должна работы в iOS6 с «радиусом от 1 до 400 м поддерживаются для устройств 4s и выше.»

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

2.

Делая что-нибудь в фоновом режиме делает потреблять батарею but Apple has optimized CoreLocation for this somewhat (provided you set the correct flag in your app's info.plist file)

3.

Я думаю, что оба будут примерно одинаково точны, except for the fact it may take up to a few minutes for "startMonitoringForRegion:" to report that the region was entered or exited.

4.

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

+0

Dauterman Спасибо за всю информацию! Что вы предлагаете, если код делегата в файле didUpdateToLocation вызывается в любом случае - поскольку я использую это для измерения текущей скорости, расстояния и т. Д.? Или чем больше вещей я делаю внутри, тем больше батареи я потребляю. И да, у меня есть iPhone 4, поэтому я предполагаю, что это ограничение устройства. – ghostrider

+1

Я думаю, что это случай «чем больше вещей я делаю внутри, тем больше батареи я потребляю». У меня есть другой собственный проект, над которым я работаю, что делает фоновый процесс, и он действительно питается от батареи, поэтому его нужно будет устранить в краткосрочной перспективе. Клиенты очень чувствительны к проблемам с производительностью, например, от батареи, поэтому все, что вы можете сделать для оптимизации производительности, будет «хорошо». –

+0

Отличный ответ, и хорошие ссылки - спасибо! – Grezzo