关于CoreLocation定位服务的简单使用
来源:互联网 发布:软件租赁报价单模板 编辑:程序博客网 时间:2024/05/16 03:00
在我们发微博,发表空间内容,以及在朋友圈发表动态的时候,会发现有一个位置信息的控件。iOS中是如何定位我们的位置信息的呢?基于此写一个小Demo,供大家参考使用。
在iOS中,用于定位时需要我们导入以下框架:
#import <CoreLocation/CoreLocation.h>
该框架中的CLLocationManager类可以实时的获取我们位置的经纬度。CLLocationManager相当于一个位置管家,常用的属性和方法有:
(1)每隔多少米定位一次
@property(assign, nonatomic) CLLocationDistance distanceFilter;
(2)定位的精确度
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
(3)定位信息
@property(readonly, nonatomic, copy) CLLocation *location;
(4)开始定位与关闭定位
- (void)startUpdatingLocation;- (void)stopUpdatingLocation;
CLLocation类是用来表示某一位置的经纬度,常用属性有和方法:
(1)经纬度
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;//(2)海波高度@property(readonly, nonatomic) CLLocationDistance altitude;
(3)路线,航向 (范围在 0.0°~359.9°,0° 是正北 方向)
@property(readonly, nonatomic) CLLocationDirection course;
(4)行走速度
@property(readonly, nonatomic) CLLocationSpeed speed;
(5)计算两个位置之间的距离
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
CLLocationCoordinate2D 是一个枚举类型
<span style="font-size:14px;">typedef struct {CLLocationDegrees latitude; // 纬度CLLocationDegrees lo</span><span style="font-family: Menlo;"><span style="font-size:12px;">ngitude; // 经度</span></span><span style="font-size:14px;">} CLLocationCoordinate2D;</span>
typedef double CLLocationDistance;
< Demo如下 >:
- (void)viewDidLoad { [super viewDidLoad]; // 是否打开定位服务 if ([CLLocationManager locationServicesEnabled]) { NSLog(@"开启定位服务"); } else { NSLog(@"没有开启定位服务"); } // 创建manager locationManager = [[CLLocationManager alloc] init]; // 设置代理 locationManager.delegate = self; if ([[UIDevice currentDevice].systemVersion floatValue] > 8.0) { /* kCLAuthorizationStatusNotDetermined = 0, // 用户还没决定 要不要授权 kCLAuthorizationStatusRestricted, // 应用程序受限制,没有授权 kCLAuthorizationStatusDenied, // 被用户拒绝授权 kCLAuthorizationStatusAuthorizedAlways, // 始终 kCLAuthorizationStatusAuthorizedWhenInUse // 使用应用程序期间 */ // 如果程序定位设置不是 使用应用程序期间,则设置为 使用应用程序期间 if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) { [locationManager requestWhenInUseAuthorization]; } } // 设置精确度,精度越高越耗电! [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; [locationManager startUpdatingLocation]; // 定位频率,每隔10米定位一次 CLLocationDistance distance = 10.0; locationManager.distanceFilter = distance;}
注意:用户授权APP访问定位服务
1.不允许访问 2.使用应用程序期间 3.后台(始终)
iOS8 app想要获取定位,必须申请授权,在info.plist中添加:
NSLocationAlwaysUsageDescription 始终
NSLocationWhenInUseUsageDescription使用应用程序期间
< Delegate >:
#pragma mark - CLLocationManagerDelegate/** * 实时定位,当定位到用户的位置时,就会调用 */- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ // locations数组里边存放的是CLLocation对象,一个CLLocation对象就代表着一个位置 for (CLLocation *newLocation in locations) { //拿到经纬度 CLLocationCoordinate2D coor2D = newLocation.coordinate; NSLog(@"纬度为:%f, 经度为:%f", coor2D.latitude, coor2D.longitude); //海拔高度 CLLocationDistance altitude = newLocation.altitude; NSLog(@"高度为:%f", altitude); //水平精确度, 垂直精确度 CLLocationAccuracy horizontalAcc = newLocation.horizontalAccuracy; CLLocationAccuracy verticalAcc = newLocation.verticalAccuracy; NSLog(@"%f, %f", horizontalAcc, verticalAcc); //北京站 经纬度 CLLocation *anyLocation = [[CLLocation alloc] initWithLatitude:39.909843 longitude:116.433015]; CLLocationDistance distance = [newLocation distanceFromLocation:anyLocation]; NSLog(@"当前位置到北京站的距离为:%f米", distance); //位置反编码(根据当前的经纬度获取具体的位置信息) CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { for (CLPlacemark *placeMark in placemarks) { NSLog(@"位置:%@", placeMark.name); NSLog(@"街道:%@", placeMark.thoroughfare); NSLog(@"子街道:%@", placeMark.subThoroughfare); NSLog(@"市:%@", placeMark.locality); NSLog(@"区\\县:%@", placeMark.subLocality); NSLog(@"行政区:%@", placeMark.administrativeArea); NSLog(@"国家:%@", placeMark.country); } }]; //停止定位,定位是一个很耗能的功能,在不需要时应当停止定位 [manager stopUpdatingLocation]; }}
(1)确定在程序第一次运行时弹出的提示框,你是否选择了允许,如果没有此时你应当去查看你的模拟器设置->隐私->位置->当前程序->是否允许位置信息<建议选中『使用应用程序期间』>
(2)方法(1)确认过后,还是没解决,此时查看你的程序的Supporting Files->info.plist 文件,是否添加了:
NSLocationWhenInUseUsageDescription 或者 NSLocationAlwaysUsageDescription
(3)若以上方法都试过了,还是没有进入到Delegate方法里,那么你该检查一下你的程序了
检查没问题?!好吧,下面来看看小编犯的错误:#pragma mark - startUpdatingHeading 和 startUpdatingLocation 及其类似啊,别写错了// [locationManager startUpdatingHeading]; [locationManager startUpdatingLocation];如果此时你发现错得和小编一样的话,请下次一定要提防着Xcode的了,因为你稍不留神 敲出 startupdat, 然后潇洒的按下TAB键或者回车的时候,错误就已经产生了,若不一个字母一个字母的检查,你还真找不出问题所在!
- (void)startUpdatingLocation; // 是开始定位
- (void)startUpdatingHeading; // 是更新方向
开发路上与君共勉,编程一定要严谨
附上查阅资料时看到的一篇定位文章:一篇关于CoreLocation定位的文章点击打开链接
- 关于CoreLocation定位服务的简单使用
- 关于iOS8中使用CoreLocation定位的小变化
- 定位CoreLocation的基本使用
- iOS定位服务CoreLocation
- CoreLocation定位服务2
- CoreLocation定位服务
- CoreLocation定位服务
- CoreLocation定位服务
- CoreLocation定位服务
- iOS定位服务 CoreLocation
- CoreLocation定位服务
- CoreLocation定位服务
- iOS--CoreLocation的简单使用
- 关于地图:CoreLocation的使用
- iOS 使用CoreLocation定位
- iOS-使用CoreLocation定位
- 使用CoreLocation定位
- 使用CoreLocation定位
- &与&&区别
- 什么是前同步码 (preamble) http://www.blogbus.com/sunnyleevip-logs/160791598.html
- tkinter绑定鼠标滚轮滚动事件
- XCode7以上免证书真机调试教程
- nyoj39水仙花数
- 关于CoreLocation定位服务的简单使用
- Quartus Ⅱ的原型机上的cpu指令开发
- chrome浏览器默认搜索栏一直加载的问题
- Camera中对焦模式总结
- (NO.00002)iOS游戏精灵战争雏形(六)
- 喝液氮是一种什么样的体验
- 3-4 计算长方形的周长和面积--SDUT
- POJ-2390
- css三列布局(一)