相关知识点 CLLocationManager
CLAuthorizationStatus
Accuracy Constants
distanceFilter
CLActivityType
开发环境 iOS 8.4
Xcode 6.4
API地址
简述
The Core Location framework lets you determine the current location or heading associated with a device. The framework uses the available hardware to determine the user’s position and heading. You use the classes and protocols in this framework to configure and schedule the delivery of location and heading events. You can also use it to define geographic regions and monitor when the user crosses the boundaries of those regions. In iOS, you can also define a region around a Bluetooth beacon.
根据苹果官方文档的描述,Core Location Framework的用途是使用户通过移动设备来获取定位信息和方向信息,还有你的范围,当用户走过某些范围边界就能马上监控到,在iOS上,甚至可以连同beacon联动来确定周边信息。
现在我主要是通过一些案例来学习这个Framework积累经验,写得不好的话,麻烦吐槽
开始——
首先新建一个项目,这篇文件是讲Core Location Framework,那当然要引入这个Framework,引入后我们在新建项目的ViewController.h引入这个框架ViewController.m
引入#import <CoreLocation/CoreLocation.h>
并且添加CLLocationManagerDelegate
然后按着Command点击<CoreLocation/CoreLocation.h>,进入看看框架里面的内容,里面就包含了以下这些Class
在viewDidLoad
函数里面,我们添加以下这段代码
/************ 初始化地理位置~begin **************/
if (locationManager == nil){
locationManager = [[CLLocationManager alloc] init];
//要求的精准度
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//设置最小距离范围数据更新,单位为米,例如:10.0f为如果水平移动超过10米范围则会更新地理位置信息
locationManager.distanceFilter = 10.0f;
/**
* @author 老区
*
* 这个值是和更新位置信息有关,当一定时间范围内没有检测用户的位置变化的话,则自动暂停位置服务,等到位置发生变化后才唤醒,这个目的是为了节省系统电量
* 默认值为CLActivityTypeOther
* CLActivityTypeAutomotiveNavigation, // 汽车使用
* CLActivityTypeFitness, // 徒步使用
* CLActivityTypeOtherNavigation // 船,火车,飞机使用
*/
locationManager.activityType = CLActivityTypeAutomotiveNavigation;
locationManager.delegate = self;
}
//检查授权,如果没有这句判断的话在iOS执行会直接出现"unknown selector"
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[locationManager requestAlwaysAuthorization];//for iOS 8
}
//获取地址位置
[locationManager startUpdatingLocation];
/************ 初始化地理位置~end **************/
CLLocationManager
The CLLocationManager
class is the central point for configuring the delivery of location- and heading-related events to your app. You use an instance of this class to establish the parameters that determine when location and heading events should be delivered and to start and stop the actual delivery of those events. You can also use a location manager object to retrieve the most recent location and heading data.
这里意思是传递location和heading相关事件到APP上显示。还有就是控制开启和关闭获取地址位置信息和数据,取回之前的位置和方向数据。
这里有几点要注意的地方,就是使用CLLocationManager会询问获取定位功能的授权Requesting Permission to Use Location Services
,我们可以根据[Constants]CLAuthorizationStatus来查看其授权状态,
CLAuthorizationStatus(授权状态 )
这里分别有以下几种授权状态——
kCLAuthorizationStatusNotDetermined
——第一次安装应用的时候用户还没选择是否使用定位服务功能kCLAuthorizationStatusRestricted
——这个App的定位服务功能受限,用户无法改变这个App的状态,有可能是由于开启某些限制例如家长控制之类的操作kCLAuthorizationStatusDenied
——用户明细地拒绝此App使用定位服务功能或者在用户设置那里禁用定位服务kCLAuthorizationStatusAuthorizedAlways
——该APP授权在App任何时候包括前端运行和后端运行使用定位服务kCLAuthorizationStatusAuthorizedWhenInUse
——该APP授权在App前端运行的时候使用定位服务
其中这里的两种授权状态WhenInUse
和Always
都能获取定位服务信息,但WhenInUse
只允许用户在App在foreground(前台运行)状态下才能获取位置数据,而Always
是任何时候,包括在foreground和background状态下都能获取到数据
重要:如果是iOS 8或之后,你还需要添加 NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription到Info.plist上才会弹出授权提示
//检查授权,如果没有这句判断的话在iOS执行会直接出现"unknown selector"
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[locationManager requestAlwaysAuthorization];//for iOS 8
}
注意:如果您是先使用
requestWhenInUseAuthorization
来获取授权的话,之后再使用requestAlwaysAuthorization
获取授权的话,会弹出提示用户变更授权状态,但反过来则不行,我认为是Always
这个授权是高于WhenInUse
,如果你真的要将Always
改为WhenInUse
的话,则可以通过Setting那里去设置
Accuracy Constants
//要求的精准度
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
这里我大概截了下图片,知道有哪些常量就OK
CLActivityType
相关代码说明:
/**
* @author 老区
*
* 这个值是和更新位置信息有关,当一定时间范围内没有检测用户的位置变化的话,则自动暂停位置服务,等到位置发生变化后才唤醒,这个目的是为了节省系统电量
* 默认值为CLActivityTypeOther
* CLActivityTypeAutomotiveNavigation, // 汽车使用
* CLActivityTypeFitness, // 徒步使用
* CLActivityTypeOtherNavigation // 船,火车,飞机使用
*/
locationManager.activityType = CLActivityTypeOther;
distanceFilter
//设置最小距离范围数据更新,单位为米,例如:10.0f为如果水平移动超过10米范围则会更新地理位置信息
locationManager.distanceFilter = 10.0f;
其中还有一个kCLDistanceFilterNone
,这个常量的意思是没有任何范围限制,只要位置发生任何变化都执行更新,但这样会很耗电
最后——
这些都准备好之后执行startUpdatingLocation
来获取定位信息
[locationManager startUpdatingLocation];
当成功授权后,便可以通过- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
这个Delegate来获取位置数据
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *newLocation = [locations lastObject];
NSLog(@"newLocation lat:%f", newLocation.coordinate.latitude);
NSLog(@"newLocation lng:%f", newLocation.coordinate.longitude);
}
相关参考文章:
http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/
原创作者:老区
Email: leo.au@foxmail.com
QQ:81508056
微信ID:kingOU