我正在尝试制作一个应用程序来跟踪用户GPS,这个应用程序是一种车载GPS跟踪器,可以随时获取驱动程序的位置并将其发送到服务器。
我试图添加"位置更新"进入"背景模式"但该应用程序将在进入后台10分钟后自动暂停。
有没有办法让这个应用程序一直运行并获得GPS位置?
谢谢。
答案 0 :(得分:13)
您有两种选择:
1)定期跟踪。
这种类型的跟踪适用于kCLAuthorizationStatusAuthorizedWhenInUse
和kCLAuthorizationStatusAuthorizedAlways
授权。当CLLocationManager
在委托方法locationManager:didUpdateLocations:
中接收位置更新后,- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];
// Setup location tracker accuracy
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
// Distance filter
self.locationManager.distanceFilter = 50.f;
// Assign location tracker delegate
self.locationManager.delegate = self;
// This setup pauses location manager if location wasn't changed
[self.locationManager setPausesLocationUpdatesAutomatically:YES];
// For iOS9 we have to call this method if we want to receive location updates in background mode
if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
[self.locationManager startUpdatingLocation];
}
开始跟踪位置。应用程序可以进入暂停状态,但是当位置管理器收到新位置应用程序进入后台状态并在委托方法中处理新位置时。如何设置位置管理器:
kCLAuthorizationStatusAuthorizedAlways
2)通知位置更改跟踪。
此类跟踪仅适用于locationManager:didUpdateLocations:
授权。它每500米只接收一个新的位置,因此距离过滤器和所需的精确度在这里不起作用。应用程序可以进入暂停状态,甚至可以被系统终止,但是当位置更新应用程序进入后台状态并在委托方法UIApplicationLaunchOptionsLocationKey
中接收位置时。
如果应用程序被系统终止,它将是在didFinishLaunchingWithOptions
app委托方法的启动选项中使用- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];
// Assign location tracker delegate
self.locationManager.delegate = self;
// For iOS9 we have to call this method if we want to receive location updates in background mode
if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
[self.locationManager startMonitoringSignificantLocationChanges];
}
键在后台重新启动。如何在跟踪中设置此类型:
[self.locationManager startMonitoringSignificantLocationChanges];
您应该注意到这两种方法都不能保证您的申请不会进入暂停状态
此外,如果应用程序被用户终止(例如,通过轻扫来自应用程序切换器),则后台位置跟踪将无效。
更新(对应评论)
这是我的代码示例,对我有用:
For Regular tracking。运行示例,提供对用户位置的访问权限,点击开始按钮以启动位置更新。要在模拟器中测试位置,请在模拟器菜单中选择Debug>位置>高速公路。现在您可以通过主页按钮(Command + Shift + H)将应用程序推送到后台。离开模拟器超过10分钟,所有这些时间应用程序将收到位置。当您返回应用程序时,您将在地图上看到红色别针
For Significant changes。以与上一示例相同的方式运行应用程序并进行测试
监控重要更改只能通过方法['productRanking:LessPopularityEPC', 'productRanking:CtrEpcJob', 'productRanking:RandomPerVisitor']
更新(iOS 11)
iOS 11中位置跟踪的更改
iOS 11还对现有API进行了一些重大更改。其中一个受影响的区域是位置跟踪。 如果您的应用仅在应用处于前台时使用位置,就像大多数应用一样,您可能根本不需要更改任何内容;但是,如果它是那些在一天中持续跟踪用户位置的应用程序之一,那么您应该在今年夏天预订一些时间来对跟踪和测试可能的使用方案进行一些更改。
点击此链接:https://mackuba.eu/2017/07/13/changes-to-location-tracking-in-ios-11/
答案 1 :(得分:3)
回复解决方案中的评论1(我无法在任何地方评论):您似乎没有解决问题,因为您的应用程序被暂停,并且在10分钟后不再更新位置。
我遇到了同样的问题:我已将setAllowsBackgroundLocationUpdates
设置为YES
,我的NSLocationAlwaysUsageDescription
中有Info.plist
个密钥,但我的应用也用于停止跟踪10分钟后的位置。
我通过将NSLocationAlwaysUsageDescription
和NSLocationWhenInUseUsageDescription
添加到Info.plist
文件来解决它,所以它看起来像这样:
<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs to use your location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs to use your location</string>
答案 2 :(得分:3)
设置它。获取电池电量,但您的应用程序在Background.OS中运行不会暂停您的应用程序
[self.locationManager setPausesLocationUpdatesAutomatically:NO];
答案 3 :(得分:0)
我确信这对作者很有用,因为该问题是在2016年2月提出的,我将在2019年6月给出答案。这个答案可能对其他用户有用。
最近,我正在处理相同的要求。经过2-3周的努力,我做到了。对于其他用户,我为其创建了一个帮助器类。在GitHub中可用。
请根据需要使用HSLocationManager。我在一个项目Capchur中达到了相同的要求。
位置管理器,可让每个位置获取后台位置更新 n秒,并具有所需的定位精度。
优势:
如果位置管理器当前处于运行状态,则操作系统将永远不会杀死我们的应用程序 正在运行。
在需要时定期提供位置更新(范围介于2- 170秒(受允许的最大后台任务时间限制)
可自定义的位置准确性和时间段。
低内存消耗(Singleton类)