我的脸在我的应用程序需要用户的位置时,他们收到一个推送通知,而该应用程序在后台运行的问题。
做一点阅读后,我的印象是,这是不可能的,即下:
1)应用在背景
2)推送通知接收
3)获取用户位置和执行的代码块。
我发现这个放在这里后表明您可以运行任务分钟每N量,以获得用户位置。 因此,使用这个我可以检查说每十分钟这会工作,但如果我坚持激活GPS这将是用户电池的浪费。 因此,我想知道我可以在我的后台任务中告诉用户是否任何推送通知等待我的应用程序? 这样,如果他们做到了每十分钟,我会检查,只有当他们没有启动GPS。
也许我要对此都走错了路,我会很感激的任何建议。 对不起,没有任何的后台任务的代码却因为我仍然在试图得到它的工作。
[UPDATE]
达斯汀感谢您的咨询。 一个位的测试之后,我决定去与一个更容易的选择。 我现在用苹果的显着位置的变化。 我存储在数组中的变化,我如果最后的变化比前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你可以使用你需要应用的位置信息的任何逻辑。