两个CLLocationManager干扰

时间:2014-11-10 07:57:46

标签: ios cllocationmanager ibeacon

我在一个应用程序中有两个CLLocationManage。第一个是监视信标区域,而另一个是监视正常的CLRegion。

A.m中的第一个

// Do any additional setup after loading the view.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

B.m中的第二个

  gpsLocationManager = [[CLLocationManager alloc] init];
  gpsLocationManager.delegate = self;

我对后者非常肯定,我没有在任何信标区域调用任何startMonitoringForRegion。但是,似乎B中的gpsLocationmanager继续从A中的那个接收enterRegion回调。所以最终我检查传入的区域para类型以使gpsLocationManager不响应来自beacon region enter的任何回调。

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
  NSLog(@"%d regions under monitor:", self.gpsLocationManager.monitoredRegions.count);
  NSLog(@"%d regions in regionArray:", self.regionArray.count);
  NSLog(@"Region type %@:", [region class]);
 if(![region isKindOfClass:[CLBeaconRegion class]]){

有什么想法吗?

此致 锤

3 个答案:

答案 0 :(得分:2)

CoreLocation功能是在应用范围内提供的。

这就是常见模式是在CLLocationManager中初始化AppDelegate并将其设为CLLocationManagerDelegate

如果您需要访问多个CLLocationManager中的一个UIViewController,我会将其设为AppDelegate的属性。然后,如果已经初始化并且可见,则可以将所需的回调转发到UIViewController

答案 1 :(得分:1)

当我创建2个类时,我遇到了同样的问题(1个用于地理围栏(CLRegion或CLCircularRegions),2个用于Beacon REgions(CLBeaconRegions)。两个单例类的属性称为lManager(CLLocationManager)。

最初我尝试过这个条件检查

if (manager == self.gpsLocationManager) {
  // Do things 
}
威尔玛说。它无法正常工作..

在对区域类进行深入调查后,我使用以下条件来变化区域。 EX:

func locationManager(manager: CLLocationManager!, didStartMonitoringForRegion region: CLCircularRegion!) {

      if(region.isMemberOfClass(CLCircularRegion)){
    // Do things. here 
 }
}

它为我工作。

干杯:p

答案 2 :(得分:0)

在A.m和B.m中,您可以检查正在响应的locationManager是否是您感兴趣的locationManager,并做出相应的反应。然而,我会尝试坚持使用davidgyoung提到的单个locationManager。

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    if (manager == self.gpsLocationManager) {
        // do things
    }
    else {
        // this is another location manager which I am not interested in
    }
}