1

我面临的一个问题是,当应用程序在后台运行时,我的应用程序需要用户位置,当他们收到推送通知时。iOS应用程序背景位置(推送通知)

做一点阅读后,我的印象是,这是不可能的,即下:

1)应用程序在后台

2)推送通知收到

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

我发现这post on here,这表明你可以每N分钟运行一个任务来获取用户的位置。所以使用这个我可以每十分钟检查一下会有效,但如果我继续激活GPS,这将浪费用户电池。因此,我想知道我可以告诉我的后台任务,如果用户有任何推送通知等待我的应用程序?这样我会检查他们是否每十分钟做一次,如果他们这样做,只会激活GPS。也许我正在走这个所有错误的方式,我真的很感激任何建议。对不起,没有任何后台任务的代码,因为我仍然试图让它工作。

[更新]

达斯汀感谢您的咨询。经过一些测试后,我决定选择一个更简单的选项。我现在正在使用Apple重大位置更改。我将更改存储在数组中,如果最后一次更改大于10分钟,我将其设置为仅更新。然后,当应用程序变为活动状态时,我会将阵列中最近的时间与发送推送通知的时间相匹配并使用该位置。

+0

什么发送推送通知?取决于你可能做KVO的内容。 – Dustin 2012-07-30 19:39:29

+0

它是一款基于回合的游戏/应用 - 当用户轮到他们时,推送通知会发送给对方,让他们知道轮到他们。 – dciso 2012-07-30 19:46:24

+0

让通知设置一个布尔值,该值对应于玩家是否轮到。对布尔值做KVO。 – Dustin 2012-07-30 19:49:36

回答

1

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

在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上,您可以使用您需要的任何逻辑来应用位置信息。