1

除了我的 iPhone 设备,我可以在所有设备(模拟器和 iPad 设备)上接收位置更新。

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 消息),但在我按下主页按钮(即应用程序进入后台)后,我停止在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 设备)上。

4

2 回答 2

3

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

于 2013-10-07T18:30:52.497 回答
0

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

我成功设置了在前台、后台和挂起状态下收到的静默推送通知。收到 PN 后,我需要获取位置更新。当应用程序在前台时,我可以这样做,但是,当应用程序在后台时,我无法这样做。

我需要做的是在名为 NSLocationAlwaysUsageDescription 的 info.plist 文件中添加一个键并为其赋值。该值可以类似于“后台需要您的位置”。

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

// 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];
}

一旦我添加了这两个部分,我就能够在后台成功获取位置更新。

谢谢,听得见

于 2014-10-20T20:09:13.080 回答