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

15

当用户进入某个区域时,我想发布一个通知。然而,由于相同的两个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个回答

25

苹果公司的CLLocationManager文档指出:

每当区域发生边界转换时,位置管理器都会调用此方法。它除了调用locationManager:didEnterRegion:locationManager:didExitRegion:方法之外,还会调用此方法。位置管理器还会响应其异步运行的requestStateForRegion:方法调用而调用此方法。

因此,只要didEnterRegion/didExitRegion被调用,didDetermineState也应该被调用。此外,如果您通过requestStateForRegion显式请求状态,则会被调用。

还有一种情况会触发此方法:如果您正在监视启用了notifyEntryStateOnDisplay属性的区域,则每当用户手动唤醒设备并且他们在您正在监视的区域内时,该方法将被调用。来自文档

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接