http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 2199|回复: 4

[新手开发之旅] 【iOS新手开发之旅】CoreLocation定位

[复制链接]
发表于 2018-12-11 15:11:29 | 显示全部楼层 |阅读模式
本帖最后由 竹林风 于 2018-12-12 14:31 编辑

  文章导航  

【iOS新手开发之旅】   http://www.sufeinet.com/thread-24000-1-1.html


要使用定位功能我们需要先引用

1.import <CoreLocation/CoreLocation.h>2.在info.plist文件中添加两个字段,声明是持续定位还是使用期间定位。


[Objective-C] 纯文本查看 复制代码
 Privacy - Location When In Use Usage Description
 Privacy - Location Always Usage Description


AFF80258-D80E-41C4-9812-496DE6360743.png

初始化LocationManger对象


[Objective-C] 纯文本查看 复制代码
//别忘了遵循代理CLLocationManagerDelegate
- (void)initializedLocationManager {
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.delegate = self;
    /*
     定位精确度
     kCLLocationAccuracyBestForNavigation    最适合导航
     kCLLocationAccuracyBest    精度最好的
     kCLLocationAccuracyNearestTenMeters    附近10米
     kCLLocationAccuracyHundredMeters    附近100米
     kCLLocationAccuracyKilometer    附近1000米
     kCLLocationAccuracyThreeKilometers    附近3000米
     */
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    /*
     每隔多少米更新一次位置,即定位更新频率
     */
    _locationManager.distanceFilter = kCLDistanceFilterNone; //系统默认值
}


申请定位权限

[Objective-C] 纯文本查看 复制代码
//申请定位权限
- (void)requestPermission {
    
    //iOS9.0以上系统除了配置info之外,还需要添加这行代码,才能实现后台定位,否则程序会crash
    if (@available(iOS 9.0, *)) {
        _locationManager.allowsBackgroundLocationUpdates = YES;
    } else {
        // Fallback on earlier versions
    }
    [_locationManager requestAlwaysAuthorization];  //一直保持定位
    [_locationManager requestWhenInUseAuthorization]; //使用期间定位
}


查看定位权限


[Objective-C] 纯文本查看 复制代码
- (BOOL)checkPermission {
    /*
     kCLAuthorizationStatusNotDetermined                  //用户尚未对该应用程序作出选择
     kCLAuthorizationStatusRestricted                     //应用程序的定位权限被限制
     kCLAuthorizationStatusAuthorizedAlways               //允许一直获取定位
     kCLAuthorizationStatusAuthorizedWhenInUse            //在使用时允许获取定位
     kCLAuthorizationStatusAuthorized                     //已废弃,相当于一直允许获取定位
     kCLAuthorizationStatusDenied                         //拒绝获取定位
     */
    if ([CLLocationManager locationServicesEnabled]) {
        switch ([CLLocationManager authorizationStatus]) {
            case kCLAuthorizationStatusNotDetermined:
                NSLog(@"用户尚未进行选择");
                break;
            case kCLAuthorizationStatusRestricted:
                NSLog(@"定位权限被限制");
                break;
            case kCLAuthorizationStatusAuthorizedAlways:
            case kCLAuthorizationStatusAuthorizedWhenInUse:
                NSLog(@"用户允许定位");
                return YES;
                break;
            case kCLAuthorizationStatusDenied:
                NSLog(@"用户不允许定位");
                break;
                
            default:
                break;
        }
    }
    
    return NO;
}


获取定位信息

startUpdatingLocation,该方法开启后,当位置改变时会在代理函数- (void)locationManager: (CLLocationManager *)manager didUpdateLocations: (NSArray<CLLocation *> *)locations中更新定位信息

[Objective-C] 纯文本查看 复制代码
[self.locationManager startUpdatingLocation];  //开始定位
[self.locationManager stopUpdatingLocation]; //停止定位

- (void)locationManager: (CLLocationManager *)manager didUpdateLocations: (NSArray<CLLocation *> *)locations
  //locations里就是更新出来的定位信息,一般取最后一个值
}


CLLocation对象属性说明:


  • location.altitude:海拔高度,正数表示在海平面之上,而负数表示在海平面之下
  • location.verticalAccuracy:海拔高度的精度。为正值表示海拔高度的误差为对应的米数;为负表示altitude(海拔高度)的值无效
  • location.horizontalAccuracy:位置的精度(半径)。位置精度通过一个圆表示,实际位置可能位于这个圆内的任何地方。这个圆是由coordinate(坐标)和horizontalAccuracy(半径)共同决定的,horizontalAccuracy的值越大,那么定义的圆就越大,因此位置精度就越低。如果horizontalAccuracy的值为负,则表明coordinate的值无效
  • location.speed:速度。该属性是通过比较当前位置和前一个位置,并比较它们之间的时间差异和距离计算得到的。鉴于Core Location更新的频率,speed属性的值不是非常精确,除非移动速度变化很小


不是每次定位都能成功,而定位失败的原因可以在失败的回调中看到,当没有定位权限导致定位失败的时候,locationManager依旧会持续定位,此时应该手动让其停止

[Objective-C] 纯文本查看 复制代码
- (void)locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error {
    if(error.code == kCLErrorLocationUnknown) {
        NSLog(@"无法检索位置");
    }
    else if(error.code == kCLErrorNetwork) {
        NSLog(@"网络问题");
    }
    else if(error.code == kCLErrorDenied) {
        NSLog(@"定位权限的问题");
        [self.locationManager stopUpdatingLocation];
        self.locationManager = nil;
    }
}


获取指南针的信息

[Objective-C] 纯文本查看 复制代码
//指南针信息将在这里回调
- (void)locationManager: (CLLocationManager *)manager didUpdateHeading: (CLHeading *)newHeading {
    //这里的数值和自带应用指南针显示的一致
    NSLog(@"数值: %f",newHeading.magneticHeading)
}


地理编码
将地理位置名(NSString)进行传参,即可获取到CLPlacemark对象,解析该对象即可获取位置信息。先初始化CLGeocoder对象


[Objective-C] 纯文本查看 复制代码
_geocoder = [[CLGeocoder alloc] init];

[self.geocoder geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
  //解析CLPlacemark即可获取返回信息
  // placemark.name:位置名称
  //placemark.addressDictionary:位置信息,字典
  //placemark.location:位置坐标,不一定和传入参数一致
}];


1C342C33E0010CC32F288736B8B3434F.png

反地理编码
将地理坐标(CLLocation)进行传参


[Objective-C] 纯文本查看 复制代码
[self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) 
//一样,一般取最后一位
}];


B409B292CB26AF1F0573E2AA507A3FE0.png

附件: Test-CLLocation.zip (167.96 KB, 下载次数: 0)


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2018-12-11 15:18:42 | 显示全部楼层
使用之前需要先添加CoreLocation.framework,添加方法:
82B4900C270EDD744B5469B6BD105AA1.jpg

CEA169050A94B795616C7AB85FA409AF.jpg

搜索框中搜索CoreLocation选中点击Add即可
 楼主| 发表于 2018-12-11 15:20:53 | 显示全部楼层
CLLocation类属性详解:

[Objective-C] 纯文本查看 复制代码
CLPlacemark *placemark=[placemarks firstObject];

     CLLocation *location=placemark.location;//位置
     CLRegion *region=placemark.region;//区域
     NSDictionary *addressDic= placemark.addressDictionary;//详细地址信息字典,包含以下部分信息
     //        CLPlacemark *placemark = [placemarks firstObject];
     //        placemark.addressDictionary
     NSString *name=placemark.name;//地名
     NSString *thoroughfare=placemark.thoroughfare;//街道
     NSString *subThoroughfare=placemark.subThoroughfare; //街道相关信息,例如门牌等
     NSString *locality=placemark.locality; // 城市
     NSString *subLocality=placemark.subLocality; // 城市相关信息,例如标志性建筑
     NSString *administrativeArea=placemark.administrativeArea; // 州
     NSString *subAdministrativeArea=placemark.subAdministrativeArea; //其他行政区域信息
     NSString *postalCode=placemark.postalCode; //邮编
     NSString *ISOcountryCode=placemark.ISOcountryCode; //国家编码
     NSString *country=placemark.country; //国家
     NSString *inlandWater=placemark.inlandWater; //水源、湖泊
     NSString *ocean=placemark.ocean; // 海洋
     NSArray *areasOfInterest=placemark.areasOfInterest; //关联的或利益相关的地标

欢迎加入苏飞论坛(IOS),群聊号码:284526528


发表于 2018-12-11 16:06:45 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-11 16:19:20 | 显示全部楼层
ios  关键字 都好长啊
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-24 16:37

© 2014-2021

快速回复 返回顶部 返回列表