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

我想在用户进入某个地区时发布通知。 但是,我很困惑,因为相同的两个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; } } 

苹果公司的CLLocationManager文件指出:

位置pipe理器在区域出现边界转换时调用此方法。 除了调用locationManager:didEnterRegion:locationManager:didExitRegion:方法外,它还调用此方法。 位置pipe理器还响应对其requestStateForRegion:方法的调用来调用此方法,该方法asynchronous运行。

所以每当didEnterRegion / didExitRegion做的时候, didDetermineState应该调用didExitRegion 。 另外,如果你通过requestStateForRegion明确请求状态,它将被调用。

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

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