我正在开发使用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提取将以不稳定的间隔触发。所以这种方式不是解决方案......
答案 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
}];
}
bgTask
为UIBackgroundTaskIdentifier 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];
}
我已经检查了蓝牙扫描总是在后台运行。