Ios 如何在后台以固定间隔重新启动CoreBooth manager实例
我正在开发一个使用CoreBluetooth的iOS应用程序,我在应用程序后台遇到了一个问题。Ios 如何在后台以固定间隔重新启动CoreBooth manager实例,ios,background-process,bluetooth-lowenergy,core-bluetooth,ibeacon,Ios,Background Process,Bluetooth Lowenergy,Core Bluetooth,Ibeacon,我正在开发一个使用CoreBluetooth的iOS应用程序,我在应用程序后台遇到了一个问题。 通常,iOS应用程序不能在后台长期运行。(例如,按Home按钮。切换其他应用程序)但我的应用程序设置为“使用蓝牙LE附件”作为背景模式,因此我可以在后台监视区域我在迪登特地区实施了StarTrangBeaconRegion当输入一个区域时,测距区域将启动,并在大约10秒后由iOS停止。 但我想在背景中始终使用测距。因为我的应用程序只使用一个UUID来检测20多个信标(20表示startMonitori
通常,iOS应用程序不能在后台长期运行。(例如,按Home按钮。切换其他应用程序)但我的应用程序设置为“使用蓝牙LE附件”作为背景模式,因此我可以在后台监视区域
我在迪登特地区实施了StarTrangBeaconRegion
当输入一个区域时,测距区域将启动,并在大约10秒后由iOS停止。
但我想在背景中始终使用测距。因为我的应用程序只使用一个UUID来检测20多个信标(20表示startMonitoringForRegion的限制),我想知道一个区域中有多少信标。
(关于只使用一个UUID的原因,请参阅此提示。
)。
因此,我正在考虑在后台以固定间隔重新启动CoreBooth manager实例的方法。如果我可以交替地执行didEnterRegion->didRangeBeacons->reboot->didEnterRegion->didRangeBeacons->reboot->……,我可以以固定的间隔检查区域中的信标数量
也许我需要背景提取。。。我以后再试试
如果你知道这种方法是否可行,请告诉我。
或者如果你有任何建议,请告诉我,我会试试
更新日期2014/03/07 17:45
后台提取将在不稳定的时间间隔触发。所以这种方法不是解决方案…解决方案之一是。。。。 但有时进展不顺利
- (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];
}
我已经检查了蓝牙扫描始终在后台运行。您不需要为后台模式设置该要求。您可以在
ApplicationIdentinterBackground:
callstartBackgroundTask
- (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
为uibackgroundtask标识符bgTask代码>
我唯一担心的是,根据我的观察,要获得另一个后台执行时间,用户必须触摸屏幕,使屏幕发光(屏幕可以锁定)。为了确保您的代码在后台工作,您可以设置计时器并定期在控制台上记录消息(例如,系统在后台给您的剩余时间执行[UIApplication sharedApplication]。backgroundTimeRemaining
或重新启动蓝牙)。据我所知,这是一种非常普遍的做法 您是否需要此应用才能获得AppStore的批准?如果是这样,你必须向用户提供与你使用的任何后台黑客相关的服务,否则该应用将被拒绝。这将限制您的选择,除非您不关心AppStore分发。谢谢您的评论。此应用程序适用于AppStore。如果你知道的话,请告诉我这个坏黑客的描述在人机界面指南中的什么地方。我尝试了beginBackgroundTaskWithExpirationHandler的一些模式,最后找到了这个解决方案。非常感谢你。