如何让GPS应用程序在后台运行而不会暂停

时间:2013-03-20 07:48:21

标签: ios gps core-location background-process

我在保持GPS在后台运行时遇到问题。

当应用程序处于后台时,我成功地保持GPS运行,但有时会停止。我注意到,当我进入一幢建筑物并在那里待了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;
                }

            });

        });
    }
    }

3 个答案:

答案 0 :(得分:3)

在您的信息播放器中,添加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

答案 1 :(得分:0)

在建筑物内,您通常无法获得任何GPS位置。 GPS需要自由观看天空。如果您没有获得职位,当然缺少让您的应用程序在后台运行的唯一原因,因此ios会使您的应用程序处于非活动状态,直到您获得下一个GPS位置(靠近窗口或外部)

进一步你停止gps了。在后台,[self stopGPS]为什么?让它活着!

答案 2 :(得分:0)

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