Делегаты региона CoreLocation не вызваны - PullRequest
2 голосов
/ 17 февраля 2012

У меня проблемы с методами делегирования региона CoreLocation в iOS 5, как в симуляторе, так и на устройствах.Я пытаюсь добавить регион для мониторинга, а затем жду обратного вызова делегата didStartMonitoring.Редко работает нормально.Однако обычно ни didStartMonitoring, ни monitoringDidFail не вызывается.Регион добавляется к monitoredRegions.Объект делегата установлен правильно и обычно получает вызовы для didEnterRegion и didExitRegion.Менеджер местоположений никогда не выпускается.Это в основном потоке .Я проверил все условия, которые могу придумать.

-(id) init
{
   self = [super init];
   if( self ) {
      NSLog( @"initializing location manager" );
      self.locationManager = [[CLLocationManager alloc] init];
      locationManager.delegate = self;
      [locationManager startUpdatingLocation];
   }
   return self;
}

-(void) startMonitoringRegion
{
   BOOL monitoring = NO;    
   if ( [CLLocationManager regionMonitoringAvailable] ) {
      if ( [CLLocationManager regionMonitoringEnabled] ) {
         if( [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized ) {
            monitoring = YES;
         } else {
            NSLog( @"app is not authorized for location monitoring" );
         }
      } else {
         NSLog( @"region monitoring is not enabled" );
      }
   } else {
      NSLog( @"region monitoring is not available" );
   }
   if( !monitoring ) return;

   CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:locationManager.location.coordinate 
                                                          radius:50
                                                      identifier:@"majorRegion"];
   NSLog( @"trying to start monitoring for region %@", region );
   [locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyBest];
}

-(void)     locationManager:(CLLocationManager*)manager 
didStartMonitoringForRegion:(CLRegion*)region
{
   NSLog( @"region monitoring started" );
}

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

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
   NSLog( @"location manager failed" );
}

У кого-нибудь есть идеи?Я могу справиться с этим, но кажется, что методы делегатов didEnterRegion и didExitRegion также иногда несовместимы, и это большая проблема для меня.

Редактировать: я могу повторить эту функцию в одном делегате приложения- нет пользовательских объектов или что-нибудь.Смотрите реализацию ниже.Области добавляются (видно при печати), но didStartMonitoringRegion никогда не вызывается.

@implementation AppDelegate

@synthesize window = _window;
@synthesize locationManager;

-(void) startMonitoringRegion
{
   BOOL monitoring = NO;    
   if ( [CLLocationManager regionMonitoringAvailable] ) {
      if ( [CLLocationManager regionMonitoringEnabled] ) {
         if( [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized )  {
            monitoring = YES;
         } else {
            NSLog( @"app is not authorized for location monitoring" );
         }
      } else {
         NSLog( @"region monitoring is not enabled" );
      }
   } else {
      NSLog( @"region monitoring is not available" );
   }
   if( !monitoring ) return;

   CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:locationManager.location.coordinate 
                                                              radius:50.
                                                          identifier:@"majorRegion"];
   NSLog( @"trying to start monitoring for region %@", region );
   [locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyBest];
}

-(void) printMonitoredRegions
{
   NSLog( @"printing regions:" );
   for( CLRegion* region in locationManager.monitoredRegions )
      NSLog( @"%@", region );
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   NSLog( @"initializing location manager" );
   self.locationManager = [[CLLocationManager alloc] init];
   locationManager.delegate = self;
   [locationManager startUpdatingLocation];

   [self startMonitoringRegion];
   [self performSelector:@selector(printMonitoredRegions) withObject:nil afterDelay:2.];

   return YES;
}


- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
{
   //NSLog( @"location updated" );
}

-(void)     locationManager:(CLLocationManager*)manager 
didStartMonitoringForRegion:(CLRegion*)region
{
   NSLog( @"region monitoring started" );
}

-(void) locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion*)region
{
   NSLog( @"did enter region" );
}

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

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

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
   NSLog( @"location manager failed" );
}

@end

Журнал:

2012-02-21 10:53:50.397 locationtest[64440:f803] initializing location manager
2012-02-21 10:53:50.412 locationtest[64440:f803] trying to start monitoring for region (identifier majorRegion) <LAT,LONG> radius 50.00m
2012-02-21 10:53:52.414 locationtest[64440:f803] printing regions:
2012-02-21 10:53:52.416 locationtest[64440:f803] (identifier majorRegion <LAT,LONG> radius 50.00m

Редактировать 2: Я только что заметил, что iOSреализация протокола CLLocationManagerDelegate немного отличается от реализации Mac - в частности, Mac не имеет didStartMonitoringRegion.Может ли быть случай, когда я случайно использую библиотеки Mac вместо библиотек iOS?

Ответы [ 3 ]

3 голосов
/ 11 апреля 2013

Посмотрите, что Apple говорит:

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html

Тестирование поддержки мониторинга региона вашего приложения

При тестировании кода мониторинга региона в iOS Simulator или на устройстве следует понимать, что события региона могут происходить не сразу после пересечения границы региона. Чтобы предотвратить ложные уведомления, iOS не доставляет уведомления региона, пока не будут выполнены определенные пороговые условия. В частности, местоположение пользователя должно пересекать границу региона и отойти от этой границы на минимальное расстояние и оставаться на этом минимальном расстоянии не менее 20 секунд, прежде чем будут сообщены уведомления. Конкретные пороговые расстояния определяются аппаратными средствами и технологиями определения местоположения, которые доступны в настоящее время. Например, если Wi-Fi отключен, мониторинг региона будет значительно менее точным. Однако для целей тестирования можно предположить, что минимальное расстояние составляет приблизительно 200 метров.

0 голосов
/ 17 мая 2018

Для всех, кто ищет ответ: Мониторинг региона должен быть явно остановлен .Либо до того, как приложение завершится, либо вручную (чтобы сделать его действительно очевидным) (это потому, что оно на самом деле работает в фоновом режиме)

Если вы видели, что didStartMonitoringFor вызывается, но вы больше его не видите, потому что вы ужемониторинг (даже если вы закрыли приложение)

0 голосов
/ 17 февраля 2012

Радиус вашего региона настолько мал, что у вас нет шансов получить точный пикап. Попробуйте увеличить его с полуметра до 10 или 20 и работать оттуда.

Вы также можете попробовать установить точность, но радиус - ваша основная проблема, я почти уверен.

Обновление

Я только что заметил, что вы вызываете -startUpdatingLocatuon вместо -startMonitoringRegion. Попробуйте включить свой код в свой CLRegion и добавить его для мониторинга.

...