У меня проблемы с методами делегирования региона 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?