iOS应用程序背景位置(推送通知)

我遇到一个问题,当应用程序在后台运行时,我的应用程序在收到推送通知时需要用户位置。

在做了一些阅读后,我觉得这是不可能的,即:

1)应用程序在后台

2)收到推送通知

3)获取用户位置并执行代码块。

我在这里发现了这篇文章 ,建议你可以每N分钟运行一次任务来获取用户位置。 所以使用这个我可以检查说每十分钟可以工作,但如果我继续激活GPS将浪费用户电池。 因此,我想知道我可以在后台任务中告诉用户是否有任何推送通知等待我的应用程序? 这样我会检查他们是否每十分钟做一次,如果他们这样做,只会激活GPS。

也许我会以错误的方式解决这个问题,我真的很感激任何建议。 很抱歉没有任何后台任务的代码,因为我仍然试图让它工作。

[UPDATE]

感谢Dustin的建议。 经过一些测试后,我决定采用更简单的选择。 我现在正在使用Apple重要位置更改。 我将更改存储在一个数组中,我将其设置为仅在最后一次更改大于10分钟前更新。 然后,当应用程序变为活动状态时,我将数组中最接近的时间与发送推送通知的时间进行匹配并使用该位置。

正如所讨论的,我使用了替代解决方案,这里是:

在viewDidLoad或didFinishingLaunchingWithOptions下添加:

locationsLogged = [[NSMutableArray alloc] init]; lastLocationTime = [[NSDate alloc] init] locationManager = [[CLLocationManager alloc] init]; [locationManager setDelegate:self]; [locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 

在applicationDidEnterBackground下添加:

 [locationManager startMonitoringSignificantLocationChanges]; 

加:

 -(void) storeLocations:(CLLocation *)location { bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }]; [locationsLogged addObject:location]; if (bgTask != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } } -(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { BOOL isInBackground = NO; if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { isInBackground = YES; } NSDate *now = [NSDate date]; NSTimeInterval diff = [now timeIntervalSinceDate:lastLocationTime]; if ((int)diff > 600) { if (isInBackground) { [lastLocationTime release]; lastLocationTime = [[NSDate alloc] init]; [self storeLocations:newLocation]; } else { // ... } } } 

然后在applicationDidBecomeActive上,您可以使用您需要的任何逻辑来应用位置信息。