iBeacon监控无法正常工作

时间:2015-05-22 12:49:22

标签: ios objective-c monitoring ibeacon

当iOS设备范围内有信标时,我会收到通知(CLRegionStateInside)并可以开始测距。这工作正常。但是,当开始测距并且iOS设备不在范围内时,我不会收到通知(状态不会更改为CLRegionStateOutside)。不在前景或背景中。

didEnterRegiondidExitRegion永远不会被调用。当状态为didDeterminState时,我开始在CLRegionStateInside范围内。

  • 我确实为我的应用启用了后台刷新设置。
  • 当我第一次启动应用程序时,我会收到一个要求获得位置许可的警报。

所以基本上,我可以开始测距,但是我无法停止测距,因为状态不会改为CLRegionStateOutside

我在iPhone 4s上使用Xcode 6.3.1,iOS 8.3。

这是我的代码:

INIT:

- (id)init{
    self = [super init];
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.locationManager requestAlwaysAuthorization]; //or requestWhenInUseAuthorization
    }

    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"B75FA2E9-3D02-480A-B05E-0C79DBB922AD"];
    self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
                                                             identifier:@"TESTREGIO"];

    [self.locationManager startMonitoringForRegion:self.myBeaconRegion];
    [self.locationManager requestStateForRegion:self.myBeaconRegion];
    self.myBeaconRegion.notifyEntryStateOnDisplay = YES;
    self.myBeaconRegion.notifyOnEntry = YES;
    self.myBeaconRegion.notifyOnExit = YES;

    return self;
}

DETERMINESTATE:

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

    }else{
        [self.locationManager stopRangingBeaconsInRegion:self.myBeaconRegion];
    }
}

DIDENTERREGION和DIDEXITREGION:

   - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion*)region
    {
        NSLog(@"DidenterRegion================================================");
    }

    - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {

        NSLog(@"DidexitRegion================================================");
    }

3 个答案:

答案 0 :(得分:0)

除非您已经在区域内,否则您不会收到didExitRegion通知。我建议你分别跟踪你正在寻找的地区的状态。

我不明白你在didDetermineState中做了什么。你开始在init()中测试你的beacon。你不需要再次开始测距。

答案 1 :(得分:0)

一些提示:

  • 您无需为此请求任何后台权限。

  • 当设备在前台测距时,在不再检测到信标3秒后发生didExitRegion的呼叫。在后台或未进行测距的前台,这些呼叫可以延迟最多15分钟。这些延迟始终存在于iPhone 4S型号上。在较新的型号上,根据是否有足够的硬件辅助插槽来检测信标,延迟可能存在也可能不存在。请在此处查看详细信息:http://developer.radiusnetworks.com/2014/03/12/ios7-1-background-detection-times.html

我怀疑未能获得退出事件实际上是他们花费的时间超过预期的问题。等待15分钟,看看回调是否来了。

答案 2 :(得分:0)

您还应该调用以下函数来开始测距

[self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion];