我想在应用在后台时发送用户位置。在应用程序中,用户可以设置一个计时器,从1分钟到24小时。我试图让应用程序在后台运行,它只能工作十分钟。如果我将计时器设置为超过十分钟,那么应用程序背景,应用程序不会在后台运行超过十分钟。是否有可能让应用程序运行超过十分钟?至少两个小时?
以下是我的尝试:
我把它添加到我的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];
答案 0 :(得分:1)
在初始设置CLLocationManager
属性pausesLocationUpdatesAutomatically
为false
如果设置为true,Apple认为用户不需要GPS并关闭该服务。
强烈建议您在每个主要ios更新(下一个将是7.0)的CLLocationManager Class reference每行的读取行
(尽管你的问题没有真正记载),
忘记你的方法beginBackgroundTaskWithExpirationHandler
,这不是必要的。
答案 1 :(得分:1)
要跟踪位置,您需要告诉系统您想要更新。您可以通过调用startUpdatingLocation
(以获得细粒度更新)和/或startMonitoringSignificantLocationChanges
(以获得低能耗,但不太频繁,更新,~500米更改,通常通常在用户使用时)改变细胞塔)。通常使用两者(因为...SignificantChanges
会在您终止时启动您,而startUpdatingLocation
则不会启动您。您还可以设置一个startMonitoringForRegion:
的区域,当用户进入或离开时,您将收到提醒。
除此之外,你还试图通过计时器等来超越系统。这只会让你陷入困境。
尽管如此,在最一般的情况下,您的具体要求是不可能的。你不能说“我想在这样的时间醒来”。这不是iOS 6中可解决的问题。你可以说你是一个位置应用程序,并获得不断更新的位置。然后,您可以在每次更新位置时检查是否该做某事。但是如果用户静坐几个小时,并且你在后台(特别是如果你被终止),那么就没有办法被唤醒。
在未发布的iOS版本中可能会出现此问题的解决方案,但您必须在开发者论坛上讨论这个问题。