6

我希望我的应用程序通过定位服务继续在后台运行。为此,我使用了:

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

    [locationManager stopUpdatingLocation];
    [locationManager startUpdatingLocation];

    //timer=[NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(UpdateLocation) userInfo:nil repeats:YES];

}

但是当我使用NSTimer它时不会调用UpdateLocation. 我尝试使用另一种方法调用它,但它也只调用了一次。

我想在后台连续运行应用程序,定期检测位置。

4

3 回答 3

6

我在我正在开发的应用程序中做到了这一点。当应用程序处于后台但应用程序不断接收位置更新时,计时器不起作用。我在文档的某处读到(我现在似乎找不到它,当我找到它时我会发布更新),当应用程序在后台时,只能在活动的运行循环中调用方法。即使在 bg 中,应用程序委托也有一个活动的运行循环,因此您无需创建自己的运行循环即可使其工作。[我不确定这是否是正确的解释,但这就是我从阅读中理解的方式]

首先,在应用程序的 info.plist 中为键“背景模式”添加“位置”对象。现在,您需要做的是在您的应用程序的任何位置开始位置更新:

CLLocationManager locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;//or whatever class you have for managing location

[locationManager startUpdatingLocation];

接下来,在应用程序委托中编写一个处理位置更新的方法,例如 -(void)didUpdateToLocation:(CLLocation*)location。然后在启动位置管理器的类中实现 CLLocationManagerDelegate 的 locationManager:didUpdateLocation:fromLocation 方法(因为我们将位置管理器委托设置为“self”)。在此方法中,您需要检查您必须处理位置更新的时间间隔是否已过。您可以通过每次保存当前时间来做到这一点。如果该时间已过,请从您的应用委托中调用 UpdateLocation 方法:

NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;

int locationUpdateInterval = 300;//5 mins

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {

        lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];

        if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
            //NSLog(@"New Location: %@", newLocation);
            [(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
            [userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
        }
    }
}

即使您的应用程序在后台,这也会每 5 分钟调用一次您的方法。Imp:此实现会耗尽电池电量,如果您的位置数据的准确性不重要,您应该使用 [locationManager startMonitoringSignificantLocationChanges]

在将此添加到您的应用程序之前,请阅读位于 http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html的位置感知编程指南

于 2011-06-23T07:38:00.047 回答
0

我知道这已经很晚了。但是,如果您仍然没有得到答案,这就是我所做的,我的应用程序在后台持续运行。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
     UIApplication *app = [UIApplication sharedApplication];
     UIBackgroundTaskIdentifier bgTask = 0;

     backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self  selector:@selector(backgroundTask) userInfo:nil repeats:YES];

     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
}

现在在backgroundTask方法中做任何你想做的事情。

于 2012-12-20T06:38:21.787 回答
0

您可以用于在后台运行应用程序以执行特定任务。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];
    UIBackgroundTaskIdentifier bgTask = 0;

    backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
}
于 2013-04-29T06:13:34.010 回答