2014-03-12 43 views
0

我正在创建一个应用程序,该应用程序监视背景中的区域,我可以在应用程序内外获得didEnterRegiondidExitRegion。我的一个问题是,在测试过程中,我有一个区域在我工作的地方,当我启动应用程序时(我在启动和退出时清除区域),我希望didEnterRegion可以为该区域启动,但事实并非如此。显然,系统认为我在该区域内,因为当我移出它时,我将收到didExitRegion。如果我再回到这个区域,它会像它应该那样触发。CLLocationManager didEnterRegion未在初始位置触发

我已经初始化这样的过程中使用requestStateForRegion尝试:

[self.locationManager startMonitoringForRegion:region]; 
[self.locationManager requestStateForRegion:region]; 

,然后执行回调为:

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region 
{ 
    if (state == CLRegionStateInside) { 
     [self locationManager:manager didEnterRegion:region]; 
    } 
} 

但是这个回调从来没有触发,所以我不知道我应该如何着手。

+0

http://stackoverflow.com/questions/30990115/beacon-ios-cllocationmanager-get-current-region – nickromano

回答

0

这很简单:由于苹果在文档中只有边界事件会触发委托方法调用。

但为什么你需要这个?如果您了解该地区,无论您是否在内部,都可以在开始使用该应用的时刻进行测试,对吧?

如果它是一个圆形区域,你可以先走一步,这样做

CLLocation *myLocation = CURRENT_LOCATION; 
CLCircularRegion* region = YOUR_REGION; 
CLLocation *regionCenter = [[CLLocation alloc] initWithLatitude:region.center.latitude longitude:region.center.longitude]; 

if([region distanceFromLocation:regionCenter]<region.radius) 
{ 
    // YOU ARE IN THE REGION!! 
} 

或者只是使用:

CLLocation *myLocation = CURRENT_LOCATION; 
CLCircularRegion* region = YOUR_REGION; 
if([region containsCoordinate:myLocation.coordinate]) 
{ 
    //YOU ARE IN THE REGION!! 
} 
+0

我想我必须手动执行然后。我只担心我自己的计算与系统所做的计算不匹配。例如,一些圆形区域的半径为25米,但系统在100米处触发它们(并且AFAIK并没有比这更好)。手动计算不会考虑到这一点,如果我没有弄错,外圈会有一个死区(从25米到100米)?无论如何,第二段代码看起来很有前途,我会试试看! –

+0

第二段代码实际上完全一样。边界条件也可能在100米处触发的原因是您的位置(myLocation.horizo​​ntalAccuracy)的水平精度大于等于75米,因此计算:([距离地点:区域中心] <地区。半径+ myLocation.horizo​​ntalAccuracy/2或像这样的 –

+0

需要一些测试,但该解决方案至少足够好。 –

0

你可以尝试[locationMgrObj requestStateForRegion:regionObj]获得在didDetermineState当前状态。

相关问题