当应用程序在后台时,我想发送用户的位置。在应用程序中,用户可以设置计时器,从1分钟到24小时。我试着让这个应用程序在后台运行,它只工作了十分钟。如果我设置了一个超过10分钟的计时器,然后在后台运行应用程序,应用程序不会在后台运行超过10分钟。有没有可能让应用程序运行超过10分钟?至少两个小时?
以下是我尝试过的方法:
我将这个添加到我的plist:

我将以下代码添加到我的applicationDidEnterBackground:方法中:
__weak BADAppDelegate * weakSelf = self;
self.backgroundTaskIdentifier =
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
int timeTilDone = timerSeconds;// two hours
self.bgTimer =
[NSTimer timerWithTimeInterval:timeTilDone
target:weakSelf
selector:@selector(startTrackLocation)
userInfo:nil
repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:self.bgTimer
forMode:NSDefaultRunLoopMode];
self.testTimer =
[NSTimer timerWithTimeInterval:60
target:weakSelf
selector:@selector(playSilentSound)
userInfo:nil
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.testTimer
forMode:NSDefaultRunLoopMode];
});我试图通过每分钟播放一次声音来迫使它存活下来。
-(void)playSilentSound
{
if(self.silentSnd == nil)
{
NSString *soundFile;
if ((soundFile = [[NSBundle mainBundle] pathForResource:@"halfsec" ofType:@"caf"]))
{
NSURL *url = [[NSURL alloc] initFileURLWithPath:soundFile];
self.silentSnd = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
self.silentSnd.delegate = self;
[self.silentSnd setNumberOfLoops:1];
}
}
[self.silentSnd prepareToPlay];
[self.silentSnd play];
}但这也没什么用。
谢谢!
更新:
下面是我的locationManager初始化代码:
NSLog(@"StartTrackLocation");
if(self.locationManager == nil)
{
self.locationManager = [[CLLocationManager alloc] init];
}
self.locationManager.delegate = self;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.pausesLocationUpdatesAutomatically = NO;
[self.locationManager startUpdatingLocation];发布于 2013-08-06 03:40:32
在初始化时,将CLLocationManager属性pausesLocationUpdatesAutomatically设置为false。
如果设置为true,则Apple认为用户不需要GPS并关闭该服务。
强烈建议您在每次主要ios更新时读取CLLocationManager Class reference的每行(下一次将为7.0)
(尽管您的问题并未真正记录在案)
忘记你的方法beginBackgroundTaskWithExpirationHandler,这是不必要的。
发布于 2013-08-06 03:58:29
为了跟踪位置,你需要告诉系统你想要更新。您可以通过调用startUpdatingLocation (获取细粒度更新)和/或startMonitoringSignificantLocationChanges (获取低能耗,但频率较低的更新,大约500M次更改,通常是在用户更换基站时)来实现这一点。两者都使用是很常见的(因为如果你被终止,...SignificantChanges会启动你,而startUpdatingLocation不会)。您还可以使用startMonitoringForRegion:设置一个区域,当用户进入或离开该区域时,系统会提醒您。
除此之外,您还试图用计时器之类的工具来智胜系统。这只会给你带来麻烦。
也就是说,在最一般的情况下,您的特定请求是不可能的。你不能说“我想在某某时间醒来”。这在iOS 6中不是一个可以解决的问题,你可以说你是一个定位应用程序,可以不断更新定位信息。然后,你可以在每次更新位置时,检查是否是时候做点什么了。但如果用户静静地坐了几个小时,而你在后台(特别是如果你被终止了),那么就没有办法被唤醒。
这个问题在iOS的未发布版本中可能有解决方案,但您必须在开发人员论坛上讨论这个问题。
https://stackoverflow.com/questions/18063701
复制相似问题