1

我有一个在后台运行的应用程序,我想在进入后台模式 30 分钟后停止所有定位服务。

所以在我的后台功能中,我这样做:

// 1800 sec = 30 min * 60 sec.
NSDate *date30min = [[NSDate alloc] initWithTimeIntervalSinceNow:1800.0];
NSLog(@"Date30min : %@", date30min);

self.timer = [[NSTimer alloc] initWithFireDate:date30min interval:1 target:self selector:@selector(stopLocation) userInfo:nil repeats:NO];

我的 stopLocation 函数是:

- (void)stopLocation
{
    NSLog(@"[My APP] [PASS INTO stopLocation]");
    [self.locationManager stopMonitoringSignificantLocationChanges];
    [self.locationManager stopUpdatingLocation];
    [self.locationManager stopUpdatingHeading];
}

但是我的计时器从不调用该函数,请问我的错误是什么?(我的函数已正确实现到我的 .h 和 .m 文件中,我在后台函数中对此进行了测试。

请帮忙..

4

1 回答 1

2

忘记将计时器添加到运行循环(在这种情况下)不是问题。

NSTimer当您的应用程序进入后台时,对象不会触发。所以,如果你想在后台处理 30 分钟后做某事,我会使用另一种技术。

例如,稍后使用后台任务运行您的方法:stopLocation

- (void)applicationDidEnterBackground:(UIApplication *)application {       

    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
         NSLog(@" expiration handler!"); 
    }];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 30 * 60 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{

         [self stopLocation];

         // we're done with this task now
         [application endBackgroundTask: bgTask]; 
         bgTask = UIBackgroundTaskInvalid;
    });
}

当然,您还需要声明:

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

在您的 Info.plist 文件中,但我假设您已经弄清楚了。

于 2012-09-06T21:32:34.123 回答