-->

It is possible that stopRangingBeaconsInRegion sto

2019-06-07 05:46发布

问题:

I'm doing a sample project working with CLLocationManager.

I call startMonitoringForRegion. Then, I start to simulate a beacon with other device and didEnterRegion is called.

In the didEnterRegion, I call startRangingBeaconsInRegion and works fine.

Then, I pause the beacon emitter and didExitRegion is called. In the didExitRegion I call stopRangingBeaconsInRegion.

If I start again the beacon emitter, didEnterRegion is not called.

I found this in the Apple documentation:

stopRangingBeaconsInRegion: Stops the delivery of notifications for the specified beacon region.

It is possible that stopRangingBeaconsInRegion stop notifications of a monitored region?

I try the same without the stopRangingBeaconsInRegion and works fine.

Thanks

Adding more information:

NSUUID *UUID = [[NSUUID alloc] initWithUUIDString:@"77777777-1717-2727-7777-777777777777"];
NSString *identifier = @"MyBeaconRegion";
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:UUID identifier:identifier];
[_locationManager startMonitoringForRegion:region];

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"didEnterRegion");
    [_locationManager startRangingBeaconsInRegion:(CLBeaconRegion*)region];
    NSLog(@"StartRangingBeacons");
}

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"didExitRegion");
    [_locationManager stopRangingBeaconsInRegion:(CLBeaconRegion*)region];
    NSLog(@"StopRangingBeacons");

}

- (void)locationManager:manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    for (CLBeacon *beacon in beacons) {
        NSLog(@"Ranging Beacon: %@ and proximity: %f", beacon.proximityUUID.UUIDString, beacon.accuracy);
    }
}

And some logs:

2015-01-13 09:46:30.559 RegionMonitoring[188:5314] didEnterRegion
2015-01-13 09:46:30.561 RegionMonitoring[188:5314] StartRangingBeacons
2015-01-13 09:46:31.579 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.008799
2015-01-13 09:46:32.575 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.011362
2015-01-13 09:46:33.580 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.012814
2015-01-13 09:46:34.580 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.012909
2015-01-13 09:46:35.579 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.012915
2015-01-13 09:46:36.579 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.011501
2015-01-13 09:46:37.576 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.010177
2015-01-13 09:46:38.576 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.013618
2015-01-13 09:46:39.578 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 09:46:40.573 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 09:46:41.578 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 09:46:42.575 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 09:46:43.578 RegionMonitoring[188:5314] didExitRegion
2015-01-13 09:46:43.579 RegionMonitoring[188:5314] StopRangingBeacons
2015-01-13 09:46:43.581 RegionMonitoring[188:5314] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000

Then, I turn on the beacon and nothing happens.

If I try with this code:

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"didExitRegion");
    //[_locationManager stopRangingBeaconsInRegion:(CLBeaconRegion*)region];
    //NSLog(@"StopRangingBeacons");
}

Works fine:

2015-01-13 10:15:45.945 RegionMonitoring[364:11017] didEnterRegion
2015-01-13 10:15:45.947 RegionMonitoring[364:11017] StartRangingBeacons
2015-01-13 10:15:46.960 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.040842
2015-01-13 10:15:47.960 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.040842
2015-01-13 10:15:48.961 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.040842
2015-01-13 10:15:49.958 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.040842
2015-01-13 10:15:50.960 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:15:51.958 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:15:52.960 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:15:53.956 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:15:54.960 RegionMonitoring[364:11017] didExitRegion
2015-01-13 10:15:54.962 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:15:55.955 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:15:56.960 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:15:57.959 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:02.960 RegionMonitoring[364:11017] didEnterRegion
2015-01-13 10:16:02.962 RegionMonitoring[364:11017] StartRangingBeacons
2015-01-13 10:16:02.963 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.040842
2015-01-13 10:16:02.971 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.040842
2015-01-13 10:16:03.979 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.040842
2015-01-13 10:16:04.979 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.036694
2015-01-13 10:16:05.978 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: 0.036051
2015-01-13 10:16:06.977 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:07.977 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:08.974 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:09.977 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:10.973 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:11.977 RegionMonitoring[364:11017] didExitRegion
2015-01-13 10:16:11.978 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:12.974 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000
2015-01-13 10:16:13.977 RegionMonitoring[364:11017] Ranging Beacon: 77777777-1717-2727-7777-777777777777 and proximity: -1.000000

回答1:

The code looks correct. I suspect what is happening is you are simply seeing a delay on a new detection after you stop ranging. If you wait 15 minutes do you see second region entry event?

Ranging in the foreground absolutely speeds up beacon detections beacause it tells the OS to do as constant Bluetooth scan to look for beacons. Ranging causes detections to happen within a few seconds. If not ranging, iOS uses a 15 minute scan cycle to look for beacons, which may be accelerated by bluetooth hardware filters on iPhone 5+. The hardware filters are not 100% reliable so detections sonetimes are delayed up to 15 minutes anyway.

See here for details: http://developer.radiusnetworks.com/2013/11/13/ibeacon-monitoring-in-the-background-and-foreground.html



回答2:

Per startMonitoringForRegion is not calling didEnterRegion if the app is started within the region, "didEnterRegion is a threshold event, fired when a region is entered. Think about it: an event signaling that you're within a region would fire continuously." Perhaps the reason it is not firing is because when you call startRangingBeaconsInRegion you are already in the region and thus didEnterRegion doesn't get called.