locationManager:didEnterRegion和didExitRegion永远不会被调用:iBeacon

当使用信标(ios设备)进行testing时,我发现听者信标给出了一些意想不到的行为。 即使信标进入区域,locationManager:didEnterRegion方法也不会被调用。 但是locationManager:didRangeBeacons:inRegion:正在调用正确,并且在那里显示检测到的信标。

- (void)startListening{ self.locationManager = [[CLLocationManager alloc] init]; [self.locationManager setDelegate:self]; NSUUID *myProximityUUID = [[NSUUID alloc] initWithUUIDString:IDENTIFIER]; _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myProximityUUID identifier:kPFTransmitterIdentifier]; _beaconRegion.notifyEntryStateOnDisplay = YES; _beaconRegion.notifyOnEntry =YES; [self.locationManager startMonitoringForRegion:self.beaconRegion]; [self.locationManager requestStateForRegion:self.beaconRegion]; //[self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; 

}

这是我写的代码。

当侦听器应用程序进入特定区域时,即使应用程序未运行,我也需要创build本地通知。

以下是我将使用的故障排除过程:

  1. 首先让它在前台工作。 在前台运行你的应用程序,并closures你的iBeacon(如果它没有开关,然后拔出电池或拿走它200英尺远)。等待10秒钟(你应该在这个时候出现区域通知)然后再打开你的iBeacon,并确认你得到了一个区域内的通知。 如果你没有得到,我怀疑你的callback定义有什么问题。 如果是这种情况,请张贴该代码。

  2. 一旦你在前台工作,尝试使用肩button在后台工作。 总是将手机置于不在该区域内的已知状态(使用上述步骤),因为在后台进行此操作需要很长时间。 一旦你知道你不在该地区,通过closures你的屏幕把你的应用程序放到后台。 然后再打开你的iBeacon。 由于您有_beaconRegion.notifyOnEntry = YES,当您通过点击肩膀或家庭button强制您的显示时,您应该在一秒内得到一个回叫。

  3. 一旦你有这个工作,你可以继续让手机检测到在背景中的存在,而不必按肩button。 但要明白,这可能需要比您预期的更长的时间。 看到这个讨论了解更多细节。

你有没有注册你的应用程序在info.plist文件中的后台位置更新? 您需要添加一个包含数组UIBackgroundModes的行并添加一个项目location : 请参阅参考

在使用notifyEntryStateOnDisplay之前,didEnterRegion方法在监视之前有时候不会被调用。我也在我的设备上testing了这个条件。可能你可以在不通知notifyEntryStateOnDisplay或者notifyOnEntry条件的情况下testing一次。

你的代码可能没有什么问题。 我注意到,如果您在探测器已经在信标区域内(旁边)的时候打开testing信标,您将不会收到您进入信标区域的任何通知。 这很可能是因为iOS没有检测到跨界。 当iOS检测到你已经越过了“超出区域”和“内部区域”(在任何一个方向)之间的边界并且只是调用相应的委托方法时,似乎会通知iOS。 要testing这个,只需打开你的信标,但离开你的探测器closures。 然后,如上面的davidgyoung所示,从你的烽火台走200英尺。 然后打开探测器,走向信标。 input区域时,您应该收到“didEnterBeaconRegion”通知。 另一个可以尝试的方法是实现“locationManagerDidDetermineStateForRegion”委托方法,该方法在定义的受监视区域的状态发生变化时调用,每当您打开检测器时都会发生这种情况。 如果你这样做,即使你的探测器在启动时已经在信标区域内,你也应该得到一个回叫。 但请注意,这不会发生在后台,所以你还需要其他的callback。