【问题标题】:iOS App Background Location (Push Notifications)iOS 应用后台位置(推送通知)
【发布时间】:2012-07-28 12:08:15
【问题描述】:

我的应用在后台运行时收到推送通知时需要用户位置信息。

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

1) 后台应用

2) 收到推送通知

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

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

也许我的做法完全错误,我非常感谢任何建议。很抱歉还没有后台任务的任何代码,因为我仍在努力让它工作。

[更新]

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

【问题讨论】:

  • 什么发送推送通知?根据内容你可能会做 KVO。
  • 它是一个回合制游戏/应用程序 - 当用户完成他们的回合时,会向对方用户发送推送通知,让他们知道现在轮到他们了。
  • 让通知设置一个布尔值,该值对应于是否轮到玩家。对布尔值执行 KVO。
  • @dciso:您可以选择发布您的解决方案作为您自己问题的答案,以便其他用户可以快速看到您所做的解决了您的问题的方法。只是一个想法:)

标签: objective-c ios push-notification core-location cllocationmanager


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多