当前位置: 首页 > 知识库问答 >
问题:

iOS不是典型的后台位置跟踪计时器问题

竺国兴
2023-03-14

我正在开发一个示例应用程序,跟踪用户的位置在后台,但我不想离开位置服务始终启用,但我的计时器中的一些行为不正常。

我的想法是,每x分钟,服务就会继续,当它有一个正确的新位置时,它会再次发布,现在设置为10秒,只是为了测试。(明显的位置变化不起作用,不够准确)

我搜索了很多(iOS开发中心StackOverflow),发现了“新的”后台位置功能,它允许您在进入后台后10分钟内运行代码,使用的是启动后台任务、几个块和计时器。

我将背景模式设置为Location,现在我认为我不需要处理背景时间的结束(首先,我希望每15-20秒获得一个位置)

代码工作“很好”,但是:

  • 计时器有时点火,有时不点火。
  • 当计时器启动时,至少需要10分钟才能完成。
  • 操作系统中的一些随机操作(如进入搜索桌面)似乎估计计时器要启动(不确定这一点,我不知道这是怎么可能的,但它是...)

通过代码将是另一个问题。

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秒的背景...但是我不确定!

共有2个答案

颛孙哲
2023-03-14

好的,问题是我调用beginBackgroundTaskWithExpirationHandler两次,一次在ApplicationIdentinterBackground中,另一次在initTimer中。。。

宗政唯
2023-03-14

当你的应用程序处于后台时,计时器将不再启动,除非你在应用程序的信息中设置了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全职后台