我正在开发一个示例应用程序,跟踪用户的位置在后台,但我不想离开位置服务始终启用,但我的计时器中的一些行为不正常。
我的想法是,每x分钟,服务就会继续,当它有一个正确的新位置时,它会再次发布,现在设置为10秒,只是为了测试。(明显的位置变化不起作用,不够准确)
我搜索了很多(iOS开发中心StackOverflow),发现了“新的”后台位置功能,它允许您在进入后台后10分钟内运行代码,使用的是启动后台任务、几个块和计时器。
我将背景模式设置为Location,现在我认为我不需要处理背景时间的结束(首先,我希望每15-20秒获得一个位置)
代码工作“很好”,但是:
通过代码将是另一个问题。
App委托的方法:
//应用程序标识符背景
- (void)applicationDidEnterBackground:(UIApplication *)application{
NSLog(@"to background");
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task.
_triggertimer = nil;
[self initTimer];
});
NSLog(@"backgroundTimeRemaining: %.0f", [[UIApplication sharedApplication] backgroundTimeRemaining]);}
//initTimer
- (void) initTimer{
NSLog(@"InitTimer ");
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
_triggertimer = [NSTimer scheduledTimerWithTimeInterval:10.0
target:self
selector:@selector(checkUpdates:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_triggertimer forMode:NSDefaultRunLoopMode] ;
[[NSRunLoop currentRunLoop] run];
}];}
//检查更新
- (void)checkUpdates:(NSTimer *)timer{
NSLog(@"CheckUpdates ");
UIApplication* app = [UIApplication sharedApplication];
if (nil == _locationManager) _locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.distanceFilter = 10;
_locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[_locationManager startUpdatingLocation];
[_locationManager startMonitoringSignificantLocationChanges];
double remaining = app.backgroundTimeRemaining;
NSLog(@"Reminaing %f", remaining);}
我尝试了很多方法来解决这个问题,也许我弄错了或者错过了什么。。。你看到了什么?可能是一些概念上的错误,我试图介绍我自己的块,我还没有领域他们
顺便问一下,为什么在使用beginBackgroundTaskWithExpirationHandler执行任何操作之前,我发现的所有代码都包含这个?
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
我以为这是为了拍摄那600秒的背景...但是我不确定!
好的,问题是我调用beginBackgroundTaskWithExpirationHandler两次,一次在ApplicationIdentinterBackground中,另一次在initTimer中。。。
当你的应用程序处于后台时,计时器将不再启动,除非你在应用程序的信息中设置了UIBackgroundModes键的“位置”值。普利斯特。
您可以使用beginBackgroundTaskWithExpirationHandler延长允许在后台运行的时间(如果您没有设置“位置”),但这应该始终与相应的结束调用配对。
我目前正在编写一个应用程序,它依赖于位置跟踪,并将有关位置的数据发送到服务器。然而,问题是它必须24/7运行,目前我正在经历每2-3天发生一次的随机崩溃。为了让应用程序在后台持续运行,我在beginBackgroundTaskWithExpirationHandler方法的右边放置了一个NSTimer,它位于ApplicationIdentinterBackground方法的后面。计时器每分钟执行
问题内容: 我希望我的iOS应用程序在后台运行并且关闭时启动计时器。计时器必须每30分钟检查一次新的通知。在计时器函数中,它们每30分钟调用另一个函数showNotification()。 当应用未在后台运行/在后台运行时,我该如何执行此计时器以及必须在哪个位置调用计时器。 问题答案: 如果应用程序不在前台且具有100%的确定性,则无法执行任何操作。您可以使用后台获取来定期唤醒,但是您无法控制它何
我想实现一个长时间运行的后台计时器,它定期将用户的位置发送到服务器。 为此,我为设置模式,并在应用程序转到后台时调用。对于,我使用方法(不希望使用重大更改,因为我需要高精度的定位)。 但是大约在应用程序进入后台26分钟后,它会停止向服务器发送位置。但是应用程序没有崩溃,所以在我把应用程序带到前台后,它可以恢复计时器。 26分钟来自实验,iOS6.1,苹果5。 这里有一些问题,, > 我不明白为什么
为了创建一个位置跟踪系统(基于fusedlocationprovider),该系统必须跟踪一个人在特定时间段内的位置。 在特定的时间间隔内,需要广播位置,即使应用程序关闭,也不应终止服务。 我应该使用前台还是后台服务,或者两者结合使用,再加上一个解释会很有帮助。
问题内容: 我希望每t毫秒定期跟踪一次鼠标光标的位置。因此,从本质上讲,当页面加载时- 该跟踪器应该启动,并且每(例如)每100毫秒启动一次,我应该获取posX和posY的新值并以表格形式打印出来。 我尝试了以下代码-但值没有刷新-表单框中仅显示posX和posY的初始值。关于如何启动和运行它的任何想法? 问题答案: 在事件处理程序接收到的对象上报告鼠标的位置,您可以将其附加到窗口(事件冒泡):
我正在编写一个应用程序,需要高精度和低频率的背景位置更新。解决方案似乎是一个后台NSTimer任务,它启动location manager的更新,然后立即关闭。这个问题以前有人问过: 如何在iOS应用程序中每n分钟更新一次后台位置? 在应用程序进入后台后每n分钟获取一次用户位置 iOS不是典型的后台位置跟踪计时器问题 iOS长时间运行的后台计时器,具有“位置”后台模式 基于位置跟踪的iOS全职后台