iOS后台定位实现

iOS后台定位实现

(2013-01-24 16:43:12)

工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置。

苹果对iOS的规范性在提升了app的品质的同时也带来了对开发者的限制。翻阅了各种官方文档和资料,得出结论如下:

1、实现后台定位有2种方式:

  • standard location service(调用CLLocationManager的startUpdatingLocation
  • significant-change location service(调用CLLocationManager 的startMonitoringSignificantLocationChanges

2、两者区别:

  • 前者(startUpdatingLocation)是标准定位,想要在后台使用必须在info.plist文件中增加Required background modes属性,并选择App registers for location updates值。
  • 前者(startUpdatingLocation)在后台运行时可能会因为资源问题被系统挂起(suspend)或终止(terminate),但一旦有更新会被唤起,但是当更新时系统任然资源紧张,则会被延迟调用委托。如果对于实时性要求高的可能不适合这个,很难控制用户机器性能状况。
  • 前者(startUpdatingLocation)如果被用户手动关闭,就不会再被唤醒。
  • 前者定位基于gps/基站/wifi定位,具体使用哪一种CoreLocation框架有一套自己的规则。
  • 后者(startMonitoringSignificantLocationChanges)是使用基站定位的,所以设备一定要有电话模块,在plist中可以设置xx属性来限制可被下载安装的设备。
  • 后者(startMonitoringSignificantLocationChanges)不管是在后台还是用户手动关闭都会被唤醒调用委托,只有3种方法可以阻止它的更新。(1)用户关闭定位服务(2)用户关闭对该app的定位服务(3)设备处于飞行模式或者无法开启必要的硬件(猜测是定位模块的硬件)。
  • 后者(startMonitoringSignificantLocationChanges)什么时候更新呢?是在更换基站的时候更新。所以更新频率与基站密度有关。市区更新频率较郊区高。所以很多同学说没有更新是因为还在同一组基站范围内。
  • 前者较后者耗电且精度高。

3、两者共性:

  • 两者都更新位置信息时都回调相同的委托方法:-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

4、上传信息:

由于后台任务只分配了有限时间执行必要的操作,所以如果在超时之前未完成(比如网络请求),app将会被终止。这里有一个方法,可以申请额外的10分钟让你执行想要的操作,申请后台任务:beginBackgroundTaskWithExpirationHandler(不详细说了,使用方法可以查一下资料)。

5、总结:

2种方式各有利弊,根据使用场景而决定,前台运行的app通常要求准确实时定位,并且运行时间有限,考虑用第一种标准定位,比如导航应用。如果移动速度快(距离变化明显),长时间定位(监控),可以考虑后者,比如打车应用。

reference:

[1]http://www.mindsizzlers.com/2011/07/ios-background-location/

[2]https://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html

时间: 2024-10-25 15:33:59

iOS后台定位实现的相关文章

iOS 后台定位被拒注意事项

iOS 后台定位被拒的原因很简单就是没有达到苹果对后台定位的要求. 本地要求: 1.在plist文件中添加字段 "Privacy - Location Always Usage Description" ,值就填写在你的运用程序中使用后台定位的地方.如"高德地图会在搜索和导航服务中使用你的位置信息." 2.在plist文件中添加字段 "Required background modes" 数组类型添加一个值item 值的话就填 "App

iOS后台定位

iOS地理定位 app正常运行时可以,按下home键后app在后台也可以,双击home键后台杀死app也可以,甚至重启机器后也可以.(iOS 10 测试代码) 1)设置一些请求参数 就像正常的CLLocationManager一样申请权限以及后台更新请求 后台更新: plist请求地理位置(需要跑始终使用) 2)与往常一样的初始化定位管理器等步骤 CLLocationManager *locationMgr = [[CLLocationManager alloc]init]; [location

iOS后台定位,实时向服务器发送最新位置

第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Paste_Image.png 第二步,在info.list 文件中添加如下配置: 允许 http 请求 ,ios 9 之后需要添加,便于向服务器发送请求 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArb

iOS 后台定位

http://www.cocoachina.com/ios/20150724/12735.html 前言 之前的文章说过 我现在做的是LBS定位的社交APP 其中主要的一个功能就是能够实时定位社交圈中各个成员的位置 后台实时上传位置则是非常重要的一个技术点 接下来就来说说我关于这方面的实践经验 需求 先来看看实现这个功能的具体需求是什么 由于我们是实时定位的生活类社交APP 所以我们需要做到一下几点 1. 如果用户的位置在持续变化 则隔一段时间上报一次 由于我们希望能够实时的将用户的位置变化反馈

iOS 后台定位审核被拒How to clarify the purpose of its use in the locatio

4.5 - Apps using background location services must provide a reason that clarifies the purpose of the use, using mechanisms described in the Human Interface Guidelines 4.5 Details Your app uses background location services but does not clarify the pu

iOS 9适配系列教程:后台定位

http://www.cocoachina.com/ios/20150624/12200.html Demo:GitHub地址 [iOS9在定位的问题上,有一个坏消息一个好消息]坏消息:如果不适配iOS9,就不能偷偷在后台定位(不带蓝条,见图)!好消息:将允许出现这种场景:同一App中的多个location manager:一些只能在前台定位,另一些可在后台定位,并可随时开启或者关闭特定location manager的后台定位. 如果没有请求后台定位的权限,也是可以在后台定位的,不过会带蓝条:

iOS 后台持续定位详解(支持ISO9.0以上)

iOS 后台持续定位详解(支持ISO9.0以上) #import <CoreLocation/CoreLocation.h>并实现CLLocationManagerDelegate 代理,.h文件完整代码如下: [objc] view plain copy #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController : UIViewController&l

iOS地图定位(Map)

1.地图的简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如    导航:去任意陌生的地方    周边:找餐馆.找酒店.找银行.找电影院    手机软件:微信摇一摇.QQ附近的人.微博.支付宝等 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这两大功能,必须基于两个框架进行开发    Map Kit :用于地图展示    Core Location :用于地理定位 地图定位(CoreLocation框架,地理编码与反地理编码)地图显示(MapKit框架)自定义大头针

IOS 后台不断网处理

收藏 Snaiper 发表于 1年前 阅读 34 收藏 0 点赞 1 评论 0 破译"粽"子代码,拿最高悬赏!>>>   摘要: IOS 后台不断网处理 后台不断网处理  地图服务 // //  AppDelegate.m //  networkdemo // //  Created by siteview on 16/2/1. //  Copyright ? 2016年 数据结构. All rights reserved. // #import "AppD