2013-10-07 46 views
1

我可以在所有(模拟器和iPad设备)上接收位置更新,但是可以接收我的iPhone设备。iOS 7 - 在应用程序进入后台后不会调用didUpdateLocations委托

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. 看来,iOS 6中对我的其他iPhone 3GS的安装工作正常。小地点图标不会消失。

  2. 在iPad设备上使用iOS 7进行测试,并且该应用程序保持在后台运行。

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

  4. 当我在iOS 7上对iPhone 4进行测试时,该应用程序不会在后台运行。所以很可能,这个问题只在iOS 7上(甚至是某些特定的iPhone设备上)。

回答

3

我想我找到了这个问题的原因。在iOS的7“设置”程序有常规>“后台应用刷新”,这是一旦关闭:( 因为我把它“ON”,我的应用程序开始在后台:)

+1

确保您处理,如果用户有过正常,因为我原来是掀起由于电池消耗 – RyanG

+0

感谢您的反馈意见。刚才,我正在和我的同事讨论这个问题,我们需要向用户提供适当的反馈,并避免不必要的帮助台呼叫。你知道如何获得这个标志“背景应用程序刷新”的价值在程序内的应用程序? – Ashok

+1

这可能有帮助(虽然我没有测试虽然):http://stackoverflow.com/a/19138393/480415 – RyanG

0
运行

上述解决方案在iOS 8.X中并不适用于我的特殊情况,因此,我希望发布能够帮助其他人的解决方案。

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

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

添加键后,我加入这个代码我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]; 
} 

一旦我将这两件我能成功获得背景位置更新。

感谢, 听见的

相关问题