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

Iphone iOS 7-应用程序进入后台后未调用didUpdateLocations委托,iphone,cocoa-touch,ios7,core-location,Iphone,Cocoa Touch,Ios7,Core Location,除了我的iPhone设备外,我可以在所有设备(模拟器和iPad设备)上接收位置更新 self.locationManager = [[[CLLocationManager alloc] init] autorelease]; self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; self.locationManager.pausesLocationUpdatesAutomatically = NO

除了我的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消息),但当我按下Home按钮(即应用程序进入后台)后,我就停止在didUpdateLocations中接收通知。“控制台”不会显示NSLog消息,此后,状态栏中的位置图标也会在10秒内消失

什么有效什么无效-

  • 看来我的另一部iPhone 3gs上安装的iOS 6运行良好。小位置图标不会消失

  • 在配备iOS 7的iPad设备上进行测试,该应用程序在后台持续运行

  • 所有配备iOS 6和iOS 7的模拟器(iPhone和iPad)都能正常工作

  • 当我在iPhone4和iOS7上测试它时,该应用程序不会在后台运行。因此,这个问题可能只出现在iOS 7(甚至一些特定的iPhone设备)上


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

    上述解决方案不适用于我在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];
    }
    
    一旦我添加了这两个部分,我就能够成功地在后台获得位置更新

    谢谢,
    声音

    如果用户关闭了该功能,请确保您能够优雅地处理,因为我关闭了该设置,因为电池耗尽了对该反馈的渴望。刚才,我和同事讨论了这个问题,我们需要向用户提供适当的反馈,避免不必要的求助电话。你知道如何在应用程序中以编程方式获取这个标志“后台应用程序刷新”值吗?这可能会有所帮助(虽然我没有进行测试):即使是在我删除了上面的注释后偶然发现了相同的帖子<代码>UIApplication.sharedApplication.backgroundRefreshStatus按定义工作。我核实了!!谢谢,我不明白。这只会对重要位置跟踪/访问监控或地理围栏产生影响。它不应该影响正常的位置跟踪。。。