如何让GPS应用程序在没有停顿的情况下在后台运行

我有一个问题,保持GPS在后台运行。

当应用程序在后台时,我成功保持GPS运行,但有时会停止。 我注意到,当我进入一个build筑物时停下来,我在那里停留2-3个小时。 “停止”意味着即使位置服务图标仍然打开,我仍然没有收到任何GPS点。 然后,当我离开,我没有收到任何积分,直到我把我的应用程序前景。

我将pausesLocationUpdatesAutomatically属性设置为NO。

所以,一切工作正常,直到我进入一个弱gps信号的位置。 当我离开那个地区时,我不再收到积分,即使我应该因为GPS信号现在是好的。

当应用程序进入后台时,这是我的代码:

- (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"[AppDelegate]: Application entering in background!"); if(doesUserWantGPSTracking) { [self stopGPS]; UIApplication *app = [UIApplication sharedApplication]; bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{ dispatch_async(dispatch_get_main_queue(), ^{ if( bgTask != UIBackgroundTaskInvalid ) { [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } }); }]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self startGPS]; dispatch_async(dispatch_get_main_queue(), ^{ if( bgTask != UIBackgroundTaskInvalid ) { [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } }); }); } } 

在你的信息plist中,添加Required background modes

并将一个项目设置为App registers for location updates

更新:

当ios返回到- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation当距离发生显着变化时。 我想你需要改变:

 // Set the movement threshold. locationManager.distanceFilter = 500; // meters 

在build筑物内,你通常不会得到任何GPS位置。 GPS需要免费观看天空。 如果你没有得到一个位置,当然,保持你的应用程序在后台运行的唯一原因是缺less,因此ios把你的应用程序不活动,直到你得到你的下一个GPS位置(靠近窗口,或外面)

此外,当你停止GPS。 在后台,[self stopGPS]为什么? 让它活着!

如果您使用的是手机而不是GPS,则可以使用networking进行位置服务。 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 300, 5, konumDinleyicisiNetwork);