如何在后台以固定间隔重新启动CoreBluetooth管理器实例

时间:2014-03-07 06:57:07

标签: ios background-process bluetooth-lowenergy core-bluetooth ibeacon

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

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

但我想总是在背景中使用范围。因为我的应用程序只使用一个UUID来检测20多个信标(20表示startMonitoringForRegion的限制),我想知道一个区域中的信标是多少。
(关于仅使用一个UUID的原因,请参阅此提示。
iBeacon / Bluetooth Low Energy (BLE devices) - maximum number of beacons。)

所以我正在考虑在后台以固定间隔重启CoreBluetooth管理器实例的方法。如果我可以做替换didEnterRegion - > didRangeBeacons->重启 - > didEnterRegion - > didRangeBeacons - >重启 - > ...,我可以固定的间隔检查该地区的信标。
也许我需要背景提取......我会稍后再试。
如果您知道这种方式是否可用,请告诉我。
或者如果您有任何建议,请告诉我,我会试试。

更新2014/03/07 17:45

BackGround提取将以不稳定的间隔触发。所以这种方式不是解决方案......

2 个答案:

答案 0 :(得分:1)

您无需为背景模式设置该要求。您可以尝试applicationDidEnterBackground:来电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;

的位置

我唯一担心的是,根据我的观察,再次获得后台执行时,用户必须触摸屏幕以使屏幕亮起(屏幕可以锁定)。为确保您的代码在后台工作,您可以定期设置计时器并在控制台上记录消息(例如,系统在后台执行[UIApplication sharedApplication].backgroundTimeRemaining或重新启动蓝牙时为您提供的剩余时间)。据我所知,这种problems很常见。

答案 1 :(得分:0)

其中一个解决方案是...... 但有时候进展不顺利..

- (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];
}

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