iBeacon:didEnterRegion和didDetermineState(CLRegionStateInside)之间有什么区别

时间:2014-01-19 07:52:42

标签: ios ibeacon

我想在用户进入某个区域时发布通知。但是,由于同样的两个CLLocationManagerDelegate方法,我很困惑。我该如何正确使用这两种方法?

如果应用程序在该区域开始,有人会说需要“didDetermineState”方法来开始区域观察。

谢谢,

- (void)locationManager:(CLLocationManager *)manager
         didEnterRegion:(CLRegion *)region
{
    [self sendNotification:@"didEnterRegion"];
}

- (void)locationManager:(CLLocationManager *)manager
      didDetermineState:(CLRegionState)state
              forRegion:(CLRegion *)region
{
    switch (state) {
        case CLRegionStateInside:
         [self sendNotification:@"didEnterRegion"];
            break;
        case CLRegionStateOutside:
            break;
        case CLRegionStateUnknown:
            break;
        default:
            break;
    }
} 

1 个答案:

答案 0 :(得分:22)

Apple的documentation for CLLocationManager州:

  

只要存在区域的边界过渡,位置管理器就会调用此方法。除了调用locationManager:didEnterRegion:locationManager:didExitRegion:方法之外,它还调用此方法。位置管理器还调用此方法以响应对其requestStateForRegion:方法的调用,该方法以异步方式运行。

每当didDetermineState / didEnterRegion这样做时,都应该调用didExitRegion。此外,如果您通过requestStateForRegion明确请求状态,则会调用该状态。

还有另一个触发此方法的行为:如果您正在监视已启用notifyEntryStateOnDisplay属性的区域,则只要用户手动唤醒其设备,就会调用该方法,并且它们位于您正在监控的地区。来自the documentation

  

设置为YES时,位置管理器会在用户打开显示器并且设备已在区域内时发送信标通知。即使您的应用未运行,也会发送这些通知。在这种情况下,系统会将您的应用程序启动到后台,以便它可以处理通知。在这两种情况下,位置管理器都会调用其委托对象的locationManager:didDetermineState:forRegion:方法。