iOS 7 - 在应用程序进入后台后未调用didUpdateLocations委托

时间:2013-10-07 18:23:10

标签: iphone cocoa-touch ios7 core-location

我能够在所有(模拟器和iPad设备)上接收位置更新,但我的iPhone设备。

self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.locationManager.pausesLocationUpdatesAutomatically = NO;
self.locationManager.delegate = self;

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations.lastObject;
    NSLog(@"didUpdateLocations newLocation = %@", newLocation);
.
.
}

只要应用程序处于前台,我就会收到 didUpdateLocations (NSLog消息)但是在我按下Home按钮(即应用程序进入后台)后,我停止在didUpdateLocations中接收通知。 “控制台”不显示NSLog消息,此后即使状态栏中的位置图标也会在10秒内消失。

什么不起作用 -

  1. 似乎在我的其他iPhone 3gs上安装的iOS 6运行正常。小位置图标不会消失。

  2. 使用iOS 7在iPad设备上测试,应用程序在后台继续运行。

  3. iOS 6以及iOS 7的所有模拟器(iPhone和iPad)均按预期工作。

  4. 当我在带有iOS 7的iPhone 4上测试时,该应用程序无法在后台运行。所以可能,这个问题仅适用于iOS 7(甚至某些特定的iPhone设备)。

2 个答案:

答案 0 :(得分:3)

我想我找到了这个问题的原因。 iOS 7中的“设置”应用具有常规> “后台应用刷新”已关闭:( 我一打开它“开启”,我的应用就开始在后台运行了:)

答案 1 :(得分:0)

上述解决方案对于我在iOS 8.X中的特定情况不起作用,因此,我想发布对我有用的解决方案,希望它可以帮助其他人。

我成功设置了我在前景,背景和暂停状态下收到的静音推送通知。收到PN后,我需要获取位置更新。当应用程序在前台时,我能够这样做,但是,当应用程序在后台时,我无法这样做。

我需要做的是在Info.plist文件中添加一个名为NSLocationAlwaysUsageDescription的密钥并为其赋值。值可以是“您的位置在后台需要。”

添加密钥后,我在AppDelegate.m的应用程序中添加了此代码:didFinishLaunchingWithOptions:method -

// Check for iOS 8.X. Without this guard the code will crash with "unknown selector" on iOS 7.
if([[self locationManager] respondsToSelector:@selector(requestAlwaysAuthorization)])
{
    [[self locationManager] requestAlwaysAuthorization];
}

一旦我添加了这两件,我就能在后台成功获得位置更新。

谢谢, 可听