互联网已成为当今世界不可缺少的一部分,它使整个地球成为一个可以互通的网络村,定位服务在其中起到了非常重要的作用,只要跟位置相关的内容处处都离不开定位服务,定位服务在iOS上面是怎么实现的?(自己挖个坑,详细了解一下定位服务的应用范围等等)已埋👉详情
iPhone定位服务
在iOS中定位功能是用Core Location框架来进行操作的,首先创建一个CLLocationManager,通过这个管理者进行定位服务。
方法以及属性
类方法
+ (BOOL)locationServicesEnabled
告知开发者手机是否启用了定位服务,跟App的定位权限打开与否是上下级关系,只有当用户在设置中打开定位开关以后才能正常的获取到定位功能权限;当用户在设置里面将定位功能的总开关关闭的时候,这个返回的是NO,反之为YES。 iOS4.0以后增加。
如果定位管理器支持获取设备的真实的方向,那么这个方法返回YES,反之NO。iOS4.0以后增加。
+ (BOOL)significantLocationChangeMonitoringAvailable
此方法告诉开发者是否仅仅根据重要的位置变化能够给予通知更新。 可以YES 不可以NO,iOS4.0以后增加。
+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass
设备是否支持对指定类型区域进行监视并获取通知,可以YES,不可以NO,如果返回NO所有的制定区域的监视都会失败。regionClass的类型必须是CLRegion。iOS7.0增加
+ (BOOL)regionMonitoringAvailable
此方法在iOS7.0以后被弃用,请用+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass,主要作用判断当前的设备是否支持区域监视。
+ (BOOL)regionMonitoringEnabled
此方法告诉开发者,用户是否允许区域检测。就算用户允许,还需要判断 + (BOOL)regionMonitoringAvailable 当前设备是否允许区域检测。
此方法在iOS6.0以后被弃用,可以使用 + (BOOL)isMonitoringAvailableForClass:(Class)regionClass 或者 + (CLAuthorizationStatus)authorizationStatus
此方法告诉开发者,蓝牙信号是否可用。此方法不是很了解(挖坑找到相关的应用场景,或者是有知道请告知在下,感激不尽,已埋👉介绍)此方法iOS 7.0以后新增。
+ (CLAuthorizationStatus)authorizationStatus
此方法告诉开发者具体的定位授权的状态,CLAuthorizationStatus是一个枚举,具体请移步详解。
实例方法
- (void)requestWhenInUseAuthorization
此方法iOS8.0以后新增,开发者在请求权限的时候调用,在使用期间允许定位。弹框内容:是否允许使用期间定位。
必须在plist文件当中添加:NSLocationWhenInUseUsageDescription Key 以及为什么使用定位的说明。
- (void)requestAlwaysAuthorization
此方法iOS8.0以后新增,弹出框的内容有:1.仅在使用应用期间;2.始终允许;3.不允许;
必须在plist文件当中添加 NSLocationAlwaysAndWhenInUseUsageDescription and NSLocationWhenInUseUsageDescription key 以及为什么使用定位。
此方法告诉位置管理器开始更新定位数据。
此方法告诉位置管理器停止更新定位数据。此方法可以取消:挂起的定位,定位回调慢,连续定位。
iOS9.0以后新增,此方法是调用一次更新位置信息的回调,含意是调用一次该方法拿到的回调只有一次,并且这个方法需要跟desiredAccuracy 这个属性对应,但用户设置好desiredAccuracy(精度)拿到与之对应的位置信息,
注意:当精度设置过高时,回调特别慢的情况下,拿到的位置信息是粗糙的定位,原因未知。
当回调太慢的时候也可以直接调用- (void)stopUpdatingLocation 取消定位。
iOS3.0新增,此方法开始检测设备正前方头方向,连续更新;参照物:地球磁场北极。
iOS3.0新增,此方法停止检测设备正前方头方向;
- (void)dismissHeadingCalibrationDisplay
iOS3.0新增,此方法立即停止更新标题方向,就是箭头方向(箭头方向永远是设备正前方)立即停止矫正。
- (void)startMonitoringSignificantLocationChanges
iOS4.0新增,启动重要位置更改的更新,例:位置有显著变化的时候调用该方法,这个方法,更新位置信息。
应用场景:后台更新startUpdatingLocation完全够用,但是当App被杀死的情况下, 怎么还能获取到位置信息呐,此方法应运而生。
- (void)stopMonitoringSignificantLocationChanges
iOS4.0新增,停止重要位置更改的更新,与startMonitoringSignificantLocationChanges配对。
应用场景,当不想用重要位置更改的更新的时候需要,位置管理器主动调用该方法.
- (void)startMonitoringForRegion:(CLRegion *)region desiredAccuracy:(CLLocationAccuracy)accuracy
iOS4.0~6.0,6.0以后被弃用,当前设备是否在某个区域,这个区域称之为监视区域,accuracy是精度,监视某个区域与设备的关系的状态。
- (void)stopMonitoringForRegion:(CLRegion *)region
iOS4.0新增,停止检测指定区域。
- (void)startMonitoringForRegion:(CLRegion *)region
iOS5.0新增,开始监视指定的区域。Monitoring模式用来监测是否进入到一个iBeacon的基站区域内,可以在后台运行。
- (void)requestStateForRegion:(CLRegion *)region
iOS7.0新增,异步检索指定区域的缓存状态。状态返回给委托, locationManager:didDetermineState:forRegion:
- (void)startRangingBeaconsInRegion:(CLBeaconRegion *)region
iOS7.0新增,开始为指定的beacon区域发送通知。
注意:检测指定区域有两种模式Ranging模式,Monitoring模式
1. 两种模式可以同时运行,只是调用的delegate methods不同。
2. 当App进入到后台后,Monitoring可以继续运行,而Ranging则不行!这点很重要! 转自:Apple iBeacons
- (void)stopRangingBeaconsInRegion:(CLBeaconRegion *)region
iOS7.0新增,停止为指定的beacon区域发送通知。
此方法iOS6.0新增,就是你可以设置让系统每隔多远或者每隔多长时间更新一次位置。注意是“或”的关系,满足一个就会更新。
使用这个方法有很多要注意的地方:
desiredAccuracy必须设置成kCLLocationAccuracyBest
distanceFilter必须设置成kCLErrorDeferredDistanceFiltered
必须能够使用GPS进行定位(而不仅仅是移动数据或者Wi-Fi)
非常重要的一点,DeferredUpdates只会出现在设备进入低耗电量的状态,App运行在前台或者设备连接在Xcode上正在调试是不会触发的。(所以不可能在Debug的时候打印Log来检验,要调试的话,需要写一些Log存在本地的数据库) 转自: iOS定位服务
- (void)disallowDeferredLocationUpdates
此方法iOS6.0新增,取消更新位置延迟回调,更新位置。
+ (BOOL)deferredLocationUpdatesAvailable
此方法iOS6.0新增,是否该设备支持延迟回调,更新位置。
属性
id<CLLocationManagerDelegate>delegate @property(assign, nonatomic, nullable)
委托的对象,此属性表示遵守该协议的对象接收调用该协议方法的对象的通知,具体协议接口信息请移步详情。
locationServicesEnabled(BOOL) @property(readonly, nonatomic)
此属性4.0以后被弃用,请用 + (BOOL)locationServicesEnabled 方法。 告知开发者手机是否启用了定位服务,跟App的定位权限打开与否是上下级关系,只有当用户在设置中打开定位开关以后才能正常的获取到定位功能权限;当用户在设置里面将定位功能的总开关关闭的时候,这个返回的是NO,反之为YES。
purpose(NSString) @property(copy, nonatomic, nullable)
此属性在iOS6.0以后被弃用,向用户解释为什么要使用定位功能,这个必须在使用位置服务之前调用,
activityType(CLActivityType) @property(assign, nonatomic)
此属性在iOS6.0以后新增,用户的出行活动类型题,详情👈
distanceFilter(CLLocationDistance) @property(assign, nonatomic)
设置此属性,当设备每动多少(米)距离以后更新新的定位数据。具体设置的类型可以查看详情👈
desiredAccuracy(CLLocationAccuracy)@property(assign, nonatomic)
设置此属性,是代表着定位的精度,应用:1.当需要拿到大概的位置不需要知道具体信息的时候请用最粗糙的定位,2.如果需要知道详细的位置信息的时候需要用更高精度,相对来说精度越高,功率消耗肯定会越高,耗电量也会越高。 可以自己选定特定的值赋值。 @property(assign, nonatomic)
pausesLocationUpdatesAutomatically(BOOL) @property(assign, nonatomic)
在iOS6.0以上默认是YES,设置是否允许系统自动暂停定位,应用的场景:如果需要在后台持续定位,需要将该属性设置为NO,如果不设置,当App在后台一段时间后,iOS系统会自动关闭该应用的定位功能。
allowsBackgroundLocationUpdates(BOOL) @property(assign, nonatomic)
iOS9.0以上新增,
应用:如果用户在选择权限的时候只允许在前台定位,设置为YES可以临时开始在后台定位的功能,要想正常使用还需要在plist文件中设置键值对: Required background modes : App registers for location updates,
注意:只不过在App切到后台以后,iphone的屏幕最上方会占用屏幕一个蓝条。
showsBackgroundLocationIndicator(BOOL) @property(assign, nonatomic)
iOS11.0以上新增,这个值默认为NO,
应用:当App使用后台定位功能是,App切到后台控制iPhone状态条变成蓝色的定位条。
location(CLLocation)@property(readonly, nonatomic, copy, nullable)
此属性是位置管理器最后更新拿到的位置信息。
注意:只能读,默认是nil直到接收到数据
headingAvailable(BOOL)@property(readonly, nonatomic)
此属性iOS4.0以后弃用。 如果定位管理器支持获取设备的真实的方向,那么这个方法返回YES,反之NO。
headingFilter(CLLocationDegrees)@property(assign, nonatomic)
此属性是一个double类型,默认值是1度,其含义是每多少度更新一次位置信息。
headingOrientation(CLDeviceOrientation)@property(assign, nonatomic)
此属性iOS4.0以上新增,表示设备的物理摆放的位置,具体详情请戳👉详情。
heading(CLHeading)@property(readonly, nonatomic, copy, nullable)
此属性iOS4.0以上新增,表示设备的方向,相对于磁场跟北极。
maximumRegionMonitoringDistance(CLLocationDistance)@property (readonly, nonatomic)
此属性iOS4.0以上新增,表示分配一个区域边界最大的距离,要清楚这个距离是个半径。
monitoredRegions(NSSet<__kindof CLRegion *>)@property(readonly, nonatomic, copy)
此属性iOS4.0以后新增,监视区域的对象的合集。此属性不能直接写入,必须注册区域通过调用startMonitoringForRegion: 方法,并且这个对象并不一定会是你注册的对象,系统只会维护区域数据本身而不是一定是一个对象,因此判断是否是这个对象只能跟这个对象的标识符来判定, 该属性中的区域集合由App中的CLLocationManager类的所有实例共享。如果应用程序被终止了,然后重新启动后会被先前注册区域的对象重新填充。
rangedRegions(NSSet<__kindof CLRegion *> )@property (readonly, nonatomic, copy)
目前正在使用检测的区域合集。
参考:
网友评论