0

我在保持 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;
                }

            });

        });
    }
    }
4

3 回答 3

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
于 2013-03-20T10:28:20.657 回答
0

在建筑物内,您通常不会获得任何 GPS 位置。GPS 需要免费查看天空。如果您没有获得位置,那么让您的应用程序在后台运行的唯一原因当然是丢失了,因此 ios 使您的应用程序处于非活动状态,直到您获得下一个 GPS 位置(靠近窗口或室外)

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

于 2013-03-27T01:33:10.847 回答
0

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

于 2014-11-25T15:47:23.193 回答