Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在后台以固定间隔重新启动CoreBooth manager实例_Ios_Background Process_Bluetooth Lowenergy_Core Bluetooth_Ibeacon - Fatal编程技术网

Ios 如何在后台以固定间隔重新启动CoreBooth manager实例

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

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

通常,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:
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
    }];
}
其中
bgTask
uibackgroundtask标识符bgTask


我唯一担心的是,根据我的观察,要获得另一个后台执行时间,用户必须触摸屏幕,使屏幕发光(屏幕可以锁定)。为了确保您的代码在后台工作,您可以设置计时器并定期在控制台上记录消息(例如,系统在后台给您的剩余时间执行
[UIApplication sharedApplication]。backgroundTimeRemaining
或重新启动蓝牙)。据我所知,这是一种非常普遍的做法

您是否需要此应用才能获得AppStore的批准?如果是这样,你必须向用户提供与你使用的任何后台黑客相关的服务,否则该应用将被拒绝。这将限制您的选择,除非您不关心AppStore分发。谢谢您的评论。此应用程序适用于AppStore。如果你知道的话,请告诉我这个坏黑客的描述在人机界面指南中的什么地方。我尝试了beginBackgroundTaskWithExpirationHandler的一些模式,最后找到了这个解决方案。非常感谢你。