背景位置服务不适用于IOS 7

背景位置服务不适用于IOS 7

我最近升级了我的iOS设备以使用iOS 7。我们正在开发的一个应用程序使用后台定位服务来跟踪设备位置,我们的所有测试人员都报告说,该应用程序似乎不再跟踪iOS 7下的背景信息。

我们已经证实,在设备上的设置中启用了该应用程序的回退,而之前的构建在iOS 6下运行得非常完美。即使该设备被循环使用,该应用程序在位置更新后也会重新启动。

在iOS 7下,是否还需要做一些其他的工作呢?


繁星淼淼
浏览 444回答 3
3回答

凤凰求蛊

这里是我用来从iOS 7设备上获得连续定位的解决方案,不管它是在前台还是在后台。您可以从Blog和GitHub找到完整的解决方案和解释:-iOS 7和8的背景位置更新编程GitHub项目:iOS 7和8的背景位置更新编程方法和解释:-我每1分钟重新启动一次位置管理器。DIDUpdateLocations我允许位置管理器从设备中获取10秒的位置,然后关闭它(以节省电池)。以下部分法典:--(void)locationManager:(CLLocationManager&nbsp;*)manager&nbsp;didUpdateLocations:(NSArray&nbsp;*)locations{for(int&nbsp;i=0;i<locations.count;i++){ &nbsp;&nbsp;&nbsp;&nbsp;CLLocation&nbsp;*&nbsp;newLocation&nbsp;=&nbsp;[locations&nbsp;objectAtIndex:i]; &nbsp;&nbsp;&nbsp;&nbsp;CLLocationCoordinate2D&nbsp;theLocation&nbsp;=&nbsp;newLocation.coordinate; &nbsp;&nbsp;&nbsp;&nbsp;CLLocationAccuracy&nbsp;theAccuracy&nbsp;=&nbsp;newLocation.horizontalAccuracy; &nbsp;&nbsp;&nbsp;&nbsp;NSTimeInterval&nbsp;locationAge&nbsp;=&nbsp;-[newLocation.timestamp&nbsp;timeIntervalSinceNow]; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(locationAge&nbsp;>&nbsp;30.0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue; &nbsp;&nbsp;&nbsp;&nbsp;//Select&nbsp;only&nbsp;valid&nbsp;location&nbsp;and&nbsp;also&nbsp;location&nbsp;with&nbsp;good&nbsp;accuracy &nbsp;&nbsp;&nbsp;&nbsp;if(newLocation!=nil&&theAccuracy>0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&theAccuracy<2000 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&(!(theLocation.latitude==0.0&&theLocation.longitude==0.0))){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.myLastLocation&nbsp;=&nbsp;theLocation; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.myLastLocationAccuracy=&nbsp;theAccuracy; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSMutableDictionary&nbsp;*&nbsp;dict&nbsp;=&nbsp;[[NSMutableDictionary&nbsp;alloc]init]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[dict&nbsp;setObject:[NSNumber&nbsp;numberWithFloat:theLocation.latitude]&nbsp;forKey:@"latitude"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[dict&nbsp;setObject:[NSNumber&nbsp;numberWithFloat:theLocation.longitude]&nbsp;forKey:@"longitude"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[dict&nbsp;setObject:[NSNumber&nbsp;numberWithFloat:theAccuracy]&nbsp;forKey:@"theAccuracy"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add&nbsp;the&nbsp;vallid&nbsp;location&nbsp;with&nbsp;good&nbsp;accuracy&nbsp;into&nbsp;an&nbsp;array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Every&nbsp;1&nbsp;minute,&nbsp;I&nbsp;will&nbsp;select&nbsp;the&nbsp;best&nbsp;location&nbsp;based&nbsp;on&nbsp;accuracy&nbsp;and&nbsp;send&nbsp;to&nbsp;server &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self.shareModel.myLocationArray&nbsp;addObject:dict]; &nbsp;&nbsp;&nbsp;&nbsp;}}//If&nbsp;the&nbsp;timer&nbsp;still&nbsp;valid,&nbsp;return&nbsp;it&nbsp;(Will&nbsp;not&nbsp;run&nbsp;the&nbsp;code&nbsp;below)if&nbsp;(self.shareModel.timer) &nbsp;&nbsp;&nbsp;&nbsp;return;self.shareModel.bgTask&nbsp;=&nbsp;[BackgroundTaskManager&nbsp;sharedBackgroundTaskManager];[self.shareModel.bgTask&nbsp;beginNewBackgroundTask];//Restart&nbsp;the&nbsp;locationMaanger&nbsp;after&nbsp;1&nbsp;minuteself.shareModel.timer&nbsp;=&nbsp;[NSTimer&nbsp;scheduledTimerWithTimeInterval:60&nbsp;target:self &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selector:@selector(restartLocationUpdates) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userInfo:nil &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeats:NO];//Will&nbsp;only&nbsp;stop&nbsp;the&nbsp;locationManager&nbsp;after&nbsp;10&nbsp;seconds,&nbsp;so&nbsp;that&nbsp;we&nbsp;can&nbsp;get&nbsp;some&nbsp;accurate&nbsp;locations//The&nbsp;location&nbsp;manager&nbsp;will&nbsp;only&nbsp;operate&nbsp;for&nbsp;10&nbsp;seconds&nbsp;to&nbsp;save&nbsp;batteryNSTimer&nbsp;*&nbsp;delay10Seconds;delay10Seconds&nbsp;=&nbsp;[NSTimer&nbsp;scheduledTimerWithTimeInterval:10&nbsp;target:self &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selector:@selector(stopLocationDelayBy10Seconds) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userInfo:nil &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeats:NO]; &nbsp;}我收到了一些请求,要求在一定时间间隔内向服务器发送位置时添加示例代码。我添加了示例代码,并结合了背景任务管理器的修复来解决后台运行较长时间的故障。如果您有任何问题,欢迎您加入我们的讨论:iOS 7的后台位置更新编程与位置更新到服务器讨论如果您希望在应用程序被挂起时获得位置更新,请参见:获取iOS应用程序的位置更新,即使挂起

一只斗牛犬

我认为他们做了一个优化(可能使用运动传感器),以检测手机的“相对”静止定位,他们停止位置更新。这只是猜测,但我目前的测试显示:开始位置更新;(测试精度为10米和100米,每次3次)关闭设备屏幕,将应用程序放到后台;将设备静止不动(例如在桌子上)30分钟。我记录的数据显示,地学更新在大约15米和30米之后停止。这样,您所做的所有其他后台处理也将终止。我的设备是iPhone 5和iOS 7。我95%肯定,iOS 6/6.1的情况并非如此。在那里获得100米精度的地理更新,可以让你在后台连续运行。如果每8分钟重新启动一次位置管理器,它应该会连续运行。我还没有在最新的测试,但这是我如何重新启动它时,我写了这篇文章。我希望这是有帮助的。-&nbsp;(void)tryRestartLocationManager{ &nbsp;&nbsp;&nbsp;&nbsp;NSTimeInterval&nbsp;now&nbsp;=&nbsp;[[NSDate&nbsp;date]&nbsp;timeIntervalSince1970]; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;seconds&nbsp;=&nbsp;round(floor(now&nbsp;-&nbsp;locationManagerStartTimestamp)); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;seconds&nbsp;>&nbsp;(60&nbsp;*&nbsp;8)&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[locationManager&nbsp;stopUpdatingLocation]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[locationManager&nbsp;startUpdatingLocation]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locationManagerStartTimestamp&nbsp;=&nbsp;now; &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS