美文网首页
对 'CoreLocation' say so

对 'CoreLocation' say so

作者: Manba_小洛 | 来源:发表于2016-08-08 13:33 被阅读27次

    应用场景

    • 定位
    • 地图
      • CoreLocation : 用于地理定位, 地理编码, 区域监听等(着重功能实现)
      • MapKit : 用于地图展示, 例如大头针, 路线, 覆盖层展示等(着重界面展示)

    1.CoreLocation框架的使用

    • CoreLocation框架使用前提
      • 导入框架 (Xcode5.0之后可以省略, 在使用框架里类的时候会自动导入, 但是如果是使用xib或者storyboard导入的MapKit框架类似, 没有使用类初始化就会崩溃!)
        导入CoreLocation框架
    • 导入主头文件
    ```objc
    #import <CoreLocation/CoreLocation.h>
    ```
    
    • CoreLocation框架使用须知
      • CoreLocation框架中的所有数据类型的前缀都是CL
      • CoreLoaction中使用CLLocationManager对象来做用户定位

    2.CLLocationManager

    • CLLocationManager常用操作
      • 开始更新用户位置
        - (void)startUpdatingLocation;
      
      • 停止更新用户位置
        - (void)stopUpdatingLocation;
      
    • 当调用了startUpdatingLocation方法后, 就开始不断地请求/刷新用户的位置, 一旦请求到用户位置就会调用代理的下面的方法
    -(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations;
    
    - `locations`参数里面装着所有的`CLLocation`对象, 一般取`lastObject`即可
    
    • CLLocationManager补充
      • 为了严谨起见, 最好在使用定位功能之前判断当前应用的定位功能是否已经可用
      • CLLocationManager有个类方法可以判断当前应用的定位功能是否可用
        + (BOOL)locationServicesEnabled;
        
      • 每隔多少米定位一次->distanceFilter
      • 位置精确度 (越精确就越耗电, 所以要根据需求合理选择) -> disiredAccuracy

    3.CLLocation

    • CLLocaiton用来表示某个位置的地理位置信息, 比如经纬度/海拔等
    • 经纬度
    @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
    
    • 海拔
    @property(readonly, nonatomic) CLLocationDistance altitude;
    
    • 路线, 航向 (取值范围是0.0° - 359.9° , 0.0° 代表正北方向)
    @property(readonly, nonatomic) CLLocationDirection course 
    
    • 移动速度 (单位m/s)
    @property(readonly, nonatomic) CLLocationSpeed speed
    
    • 计算两个位置之间的距离
    - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
    

    4.用户隐私的保护

    • 从IOS6开始, 苹果在用户隐私方面做了很大的加强, 以下操作都必须经过用户批准授权
      • 想要获取用户的位置信息
      • 想访问用户的通讯录/日历/相机/相册/发送通知等等
    • 当想访问用户的隐私信息时, 系统会自动弹出一个对话框让用户授权


      授权批准
    • 开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的提示给用户(Privacy - Location Usage Description) 然后就能看到上面类似的请求访问
      授权描述
      • 一旦用户选择了Don't Allow, 这意味着您的应用以后都无法使用定位功能, 除非到设置里面找到隐私对应用开启定位授权或者卸载重新安装
      • 为了提高用户的授权概率, 所以描述信息一定要吸引用户!

    5. iOS 8.0+ 的定位适配

    • iOS 8.0开始, 苹果进一步加强了对用用户隐私的保护.
      • 当APP想访问用户的隐私信息时,根据iOS8.0之前的配置系统不在自动弹出对话框让用户授权
    • 解决方案
      • (1) 调用 *iOS 8.0API, 主动请求用户授权

    // 请求允许在前后台都能获取用户授权

    • (void)requestAlwaysAuthorization
      // 请求允许在前台获取用户位置的授权
    • (void)requestWhenInUseAuthorization
      - (2) 务必在**Info.plist**文件中配置对应的键值信息, 否则以上请求授权的方法也不生效**(配合步骤(1)联合使用才有效)**
      ```objc
      

    NSLocationAlwaysUsageDescription: 允许在前后台获取GPS信息的描述
    NSLocationWhenInUseDescription: 允许在前台获取GPS的描述
    ```

    • 注意: 所有想在后台获取位置信息的情况, 都必须开启App的后台模式: location updates
      设置后台模式

    6. iOS 9.0 定位补充

    • iOS 9.0 如果当前处于前台授权状态, 默认是不可以后台获取用户位置. 但可以设置一下属性为YES, 就可以继续后去后台位置, 但是会在屏幕上方出现蓝条

    @property(assign, nonatomic) BOOL allowsBackgroundLocationUpdates
    ```


    蓝条
    • iOS 9.0 可以单次请求用户位置
    - (void)requestLocation  // 单次请求
    - (void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations  // 成功调用
    - (void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error  // 失败调用
    

    7. CLLocationCoordinate2D

    • CLLocationCoordinate2D是一个用来表示经纬度的结构体, 定义如下
    typedef struct {
        CLLocationDegress latitude;  // 经度
        CLLocationDegress longitude;   // 纬度
    } CLLocationCoordinate2D;
    
    • 一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D
    ----
    ####8. 模拟位置
    - 如果是模拟器, 可以自定义位置(经纬度)
    ![模拟器自定义位置](https://img.haomeiwen.com/i1176549/9c98843b16c95cbf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ![设置经纬度](https://img.haomeiwen.com/i1176549/48b799cd0b5648f4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ----
    ####9. CLGeocoder
    - 使用`CLGeocoder`可以完成"地理编码" 和 "反地理编码" 
      - 地理编码: 根据给定的地名, 获得具体的位置信息 (比如经纬度, 地址的全称等)
      - 反地理编码: 根据给定的经纬度, 获得具体的位置信息
    - 地理编码方法
    ```objc
    - (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
    
    • 反地理编码方法
    - (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;
    
    • CLGeocodeCompletionHandler
      • 当地理/反地理编码完成时, 就会调用CLGeocodeCompletionHandler

    typedef void (^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error);
    ```
    - 这个block传递两个参数
    - error: 当编码出错时 (比如编码不出具体的信息) 有值
    - placemarks: 里面装着CLPlacemark对象


    10. CLPlacemark

    • CLPlacemark的字面意思是地标, 封装相信的地址位置信息
      • 地理位置

    @property (nonatomic, readonly, copy, nullable) CLLocation *location;
    - 区域objc
    @property (nonatomic, readonly, copy, nullable) CLRegion *region;
    - 详细的地址信息objc
    @property (nonatomic, readonly, copy, nullable) NSDictionary *addressDictionary;
    - 地址名称objc
    @property (nonatomic, readonly, copy, nullable) NSString *name;
    - 城市objc
    @property (nonatomic, readonly, copy, nullable) NSString *locality;
    ```

    相关文章

      网友评论

          本文标题:对 'CoreLocation' say so

          本文链接:https://www.haomeiwen.com/subject/ptolsttx.html