1

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

在做了一些阅读之后,我的印象是这是不可能的,即:

1)后台应用

2) 收到推送通知

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

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

也许我正在以错误的方式处理这一切,我真的很感激任何建议。很抱歉还没有后台任务的任何代码,因为我仍在努力让它工作。

[更新]

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

4

1 回答 1

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

于 2012-07-30T23:19:22.520 回答