如何以固定的时间间隔在后台重启CoreBluetoothpipe理器实例

我正在开发使用CoreBluetooth的iOS应用程序,并且在应用程序BackGround中有一个问题。

通常,iOS应用程序无法在后台长期运行。 (例如,按HomeButton切换其他应用程序)但我的应用程序设置为“使用蓝牙LE配件”作为BackGroundMode,所以我可以在后台监控区域。
我在didEnterRegion中实现了startRangingBeaconsInRegion。
当进入一个地区时,测距区域将被启动,并在iOS大约10秒后停止。

但是我想总是在后台使用范围。 因为我的应用程序只使用一个UUID来检测超过20个信标(20意味着限制startMonitoringForRegion),我想知道如何在一个地区的信标。
(关于只使用一个UUID的原因,请看这个技巧。
iBeacon /蓝牙低功耗(BLE设备) – 信标的最大数量 。)

所以我想在后台以固定的时间间隔重新启动CoreBluetoothpipe理器实例的方式。 如果我可以做交替didEnterRegion – > didRangeBeacons->重新启动 – > didEnterRegion – > didRangeBeacons – >重新启动 – > …,我可以检查如何在这个区域以固定的时间间隔的信标。
也许我需要后台获取…我会稍后尝试。
如果你知道这种方式是否可用,请告诉我。
或者如果您有任何build议,请告诉我,我会尝试。

更新2014/03/07 17:45

BackGround获取将以UNSTABLE间隔触发。 所以这种方式不是解决scheme…

您不需要为背景模式设置该要求。 您可以尝试applicationDidEnterBackground: call startBackgroundTask

 - (void)startBackgroundTask { if(bgTask != UIBackgroundTaskInvalid){ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"your time is over"); //you can call start once again to get more time }]; } 

其中bgTaskUIBackgroundTaskIdentifier bgTask;

我唯一担心的是,从我的观察得到的另一个时间背景执行用户必须触摸屏幕,使屏幕照亮(屏幕可以locking)。 为了确保你的代码在后台工作,你可以设置一个计时器并定期在控制台上logging一条消息(例如,在后台执行[UIApplication sharedApplication].backgroundTimeRemaining或者重新启动蓝牙时系统给你的时间。 据我所知,这种问题是相当普遍的做法。

其中一个解决scheme是…但是有时候不好。

 - (void) startProcess { [_manager startMonitoringForRegion:beacon]; } - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { // some process... [_manager startRangingBeaconsInRegion:beacon]; } - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { // some process... [_manager stopRangingBeaconsInRegion:beacon]; } - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { // some process... [_manager stopRangingBeaconsInRegion:beacon]; [_manager stopMonitoringForRegion:beacon]; [_manager startMonitoringForRegion:beacon]; } 

我已经检查了蓝牙扫描总是在后台运行。