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

zon*_*ono 15 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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

Jam*_*ost 22

Apple的CLLocationManager文档声明:

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

所以didDetermineState每当要被调用didEnterRegion/ didExitRegion做.此外,如果您通过requestStateForRegion它明确请求状态将被调用.

触发此方法的另一个行为是:如果您正在监视已启用该notifyEntryStateOnDisplay属性的区域,则只要用户手动唤醒其设备,就会调用该方法,并且它们位于您正在监视的区域内.从文档中

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