当应用程序处于后台时,如何在计时器用完后让应用程序发送GPS位置?

时间:2013-08-05 17:05:49

标签: iphone ios background-process

我想在应用在后台时发送用户位置。在应用程序中,用户可以设置一个计时器,从1分钟到24小时。我试图让应用程序在后台运行,它只能工作十分钟。如果我将计时器设置为超过十分钟,那么应用程序背景,应用程序不会在后台运行超过十分钟。是否有可能让应用程序运行超过十分钟?至少两个小时?

以下是我的尝试:

我把它添加到我的plist:

enter image description here

我将此添加到我的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];

2 个答案:

答案 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版本中可能会出现此问题的解决方案,但您必须在开发者论坛上讨论这个问题。