公海赌船网址用以地理定位。①得到用户授权。

介绍

1.导入主头文件 #import <CoreLocation/CoreLocation.h>

2.地图及固定功能基于2只框架进行开发:
(1)Map Kit :用于地图显示
(2)CoreLocation:用于地理定位,有时只用定位,比如外卖,只有用展示地图才用map
kit

3.2独热门专业术语:
(1)LBS :Location Based Service 位置服务,又如一定服务
LBS的劳动综合为四类:定位(个人岗位一定)、导航(路径导航)、查询(查询有人要么某个对象)、识别(识别某个人或者对象)、事件检查(当起特别情形下于相关机关发送带求救或询问的私房岗位信息)。
(2)SoLoMo :Social Local Mobile(索罗门) 移动社交

4.天朝之经纬度范围:纬度范围:N 3°51′ ~ N 53°33′ 经度范围:E 73°33′ ~ E
135°05′


1、如果固定法不动由:
(1)没有布置 plist 键值
(2)模拟器 bug
(3)没有采取 strong 的性能

2、逻辑结构

逻辑结构


CoreLocation框架的动

// 首先导入头文件
#import <CoreLocation/CoreLocation.h>
  • CoreLocation框架中装有数据类型的前缀都是CL
  • CoreLocation中使CLLocationManager对象来做用户定位

请求用户授权法

注意:
  1. 平步代码,一步plist配置
  2. 伸手授权iOS8过后才产生,一定留神版本适配!
  3. 如又落实两独请求, 第一坏运行会弹出第一单,
    第二差运行会弹出第二只,大部分应用程序只需要采用用户采取中授权即可
  4. 一经程序列表中冒出了3履(即决不定位,使用使用中,始终稳定),说明实现了2种授权
设置界面
  1. plist添加的用户提示信息可以无写值,表示空白提示,一般写上待固定的案由,提高用户打开的几乎带领

1.CLLocationManager的使用

1. 代码:
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        // 永久授权
        [self.locationManager requestAlwaysAuthorization];
        //用户使用时授权,大部分的应用应该使用此种授权方式,当能看见程序时才能定位
        [self.locationManager requestWhenInUseAuthorization];
    }
}

CLLocationManager的常用操作

/**
 *  定位管理者,全局变量强引用,防止销毁
 */
@property (nonatomic ,strong) CLLocationManager *mgr;
2. plist文件配置

① 使用中授权:添加该键,值是用户提示信息
NSLocationWhenInUseUsageDescription

plist配置

② 永久始终授权:添加该键,值是用户提示信息
NSLocationAlwaysUsageDescription

plist配置

③ iOS9.0新特征:临时获取后台定位权限(永久授权)
专注:该法上后台后会见起提醒

iOS 9 新特性

代码:iOS9 临时打开后台定位,
allowsBackgroundLocationUpdates属性设置也YES

if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {
    self.locationManager.allowsBackgroundLocationUpdates = YES;
}

plist:需要配备Plist,不然会崩溃,是一个再三组,值添加到一个数组的目标中
键 :Required background modes
数组值:App registers for location updates

iOS 9 plist配置


设代理

// 2.成为CoreLocation管理者的代理监听获取到的位置
    self.mgr.delegate = self;

CLLocationManager 属性和方式

注意:

  1. 怀念使用固定, 必须采取CLLocationManager(位置管理器)创建一个靶
  2. iOS8之后, 要定位, 必须采用位置管理器授权,并配备plist
  3. 应用中授权:APP退及后台就无开展固化了
    一直授权:后台也会开展固定,例如记录跑步,持续稳定要针对电量做些优化(设置两只属性)
设置界面
  1. 诚如要定位在appDelegate中,在加载页面之前就是稳定好

①取用户授权

下面两单特性设置后得以减低代理方调用频率(默认大约一秒调用平等潮),以这个省电,始终不绝于耳稳定上建议利用

注意:

属性:

  1. 离筛选器,每隔多少米恒一蹩脚,单位:米,当用户发肯定位置的转移时,
    再夺调用代理方, 以此实现省电

@property(assign, nonatomic) CLLocationDistance distanceFilter;

事例:每隔十米恒一次

self.locationManager.distanceFilter = 10;
  1. 固化精确度(越规范就进一步耗电)

@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

跌精准度,实际上降低了同卫星之间的算计,以此节省电量

Iphone的稳法:(1)GPS(2)wifi定位(3)移动基站定位(流量)

事例:设置定位精度误差一千米
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
枚举值:iOS9缘前默认kCLLocationAccuracyBest
kCLLocationAccuracyBestForNavigation 最纯粹的定势
kCLLocationAccuracyBest; 最好的
kCLLocationAccuracyNearestTenMeters; 十米误差
kCLLocationAccuracyHundredMeters; 一百米
kCLLocationAccuracyKilometer; 一千米
kCLLocationAccuracyThreeKilometers; 三千米

iOS7要开始定点, 系统便会见活动要求用户对您的应用程序授权. 但是从iOS8初始, 想只要稳住要优先”自己””主动”要求用户授权

  • 上加好提示,在info.plist文件中上加字段
    • Privacy – Location Usage Description

方法:

1.起来用户定位

- (void) startUpdatingLocation;

2.住用户定位

- (void) stopUpdatingLocation;

当iOS8中不仅仅要再接再厉请求授权,而且要再次info.plist文件中安排一件属性才能够弹来授权窗口

  • NSLocationWhenInUseDescription,允许在前台获取GPS的叙说
  • NSLocationAlwaysUsageDescription,允许在后台获取GPS的描述

 /*
     用户从未选择过权限
     kCLAuthorizationStatusNotDetermined
     无法使用定位服务,该状态用户无法改变
     kCLAuthorizationStatusRestricted
     用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态
     kCLAuthorizationStatusDenied
     已经授权(废弃)
     kCLAuthorizationStatusAuthorized
     用户允许该程序无论何时都可以使用地理信息
     kCLAuthorizationStatusAuthorizedAlways
     用户同意程序在可见时使用地理位置
     kCLAuthorizationStatusAuthorizedWhenInUse
     */

    // 1.获得用户授权状态
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    // 2.判断用户是否授权
    if (status == kCLAuthorizationStatusNotDetermined) {
        NSLog(@"等待用户授权");
    }else if (status == kCLAuthorizationStatusAuthorizedAlways ||
              status == kCLAuthorizationStatusAuthorizedWhenInUse)

    {
        NSLog(@"授权成功");
        // 开始定位
        [self.mgr startUpdatingLocation];

    }else
    {
        NSLog(@"授权失败");
    }

代办方

当调用了startUpdatingLocation方法后,就开始不断地调用该代理方定位用户的职,locations参数里面装着同样组CLLocation对象,持续稳定要安装
distanceFilter 和 desiredAccuracy 属性

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

iOS8请求授权得无交提拔的原因

  • 1.从未有过发送请求
    • 随便求代码
  • 2.CLLocationManager无是大局的成员属性
    • 吃提前销毁,没有大引用
  • 3.没有当info.plist文件中上加字段
    • NSLocationAlwaysUsageDescription
    • NSLocationWhenInUseDescription

CLLocation 位置对象介绍

CLLocation用来表示有位置的地理信息,比如经纬度、海拔等等,创建一个
CLLocation对象仅需要少独参数:纬度以及经度

②发端用户定位

- (void)startUpdatingLocation;

属性:

(1)2D位置坐标,经纬度

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

CLLocationDegrees latitude 纬度
CLLocationDegrees longitude 经度

(2)海拔

@property(readonly, nonatomic) CLLocationDistance altitude;

(3)速度(单位是m/s)

@property(readonly, nonatomic) CLLocationSpeed speed;

(4)水平 垂直精准度

@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;
@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;

(5)航向(取值范围是0.0° ~ 359.9°,0.0°代表真北动向)

@property(readonly, nonatomic) CLLocationDirection course;

(6)时间戳,什么时间开展的永恒

@property(readonly, nonatomic, copy) NSDate *timestamp;

方法:
(1)创建一个 CLLocation对象就待简单单参数:纬度以及经度

- (instancetype)initWithLatitude:(CLLocationDegrees)latitude
longitude:(CLLocationDegrees)longitude;

(2)计算2个职务之间的离开,比较的凡直线距离,单位凡米,除以1000足以换算成千米

- (CLLocationDistance)distanceFromLocation:(constCLLocation *)location;

③止用户定位

- (void) stopUpdatingLocation;

事例:计算都与西安底位置直线距离

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:40.06 longitude:116.39];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:34.27 longitude:108.93];
CGFloat distance = [location2 distanceFromLocation:location1];
NSLog(@"distance: %f",distance / 1000);

③设置当用户移动多少米,重新定位

- self.mgr.distanceFilter = 50;

事例:定位功能实现

1、 创建位置管理器
self.locationManager = [CLLocationManager new];

2、 请求用户授权(iOS8以后才有) 同时配置 plist 列表,注意:必须使用版本判断,建议结合使用
-----------------------------
有两种授权方式,还有一种始终 requestAlwaysAuthorization
if([self.locationManagerrespondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}

3、 设置 <CLLocationManagerDelegate>代理, 来获取用户位置数据
self.locationManager.delegate = self;

4、调用开始定位方法
[self.locationManager startUpdatingLocation];

5、实现代理方法拿到数据,当用户更新位置的时候调用此方法,频繁调用, 非常耗电
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    //CLLocation 位置对象 --> 经纬度
    //CLLocationCoordinate2D coordinate 经纬度

    //获取最后一次位置信息
    CLLocation *location = locations.lastObject;
    //输出纬度和经度
    NSLog(@"latitude: %f,longitude: %f",location.coordinate.latitude, location.coordinate.longitude);
    // 停止定位
    [self.locationManager stopUpdatingLocation];
}

④装置获取位置的精确度

  • 进一步规范就越耗电

    /*
      kCLLocationAccuracyBestForNavigation 最佳导航
      kCLLocationAccuracyBest;  最精准
      kCLLocationAccuracyNearestTenMeters;  10米
      kCLLocationAccuracyHundredMeters;  百米
      kCLLocationAccuracyKilometer;  千米
      kCLLocationAccuracyThreeKilometers;  3千米
     */
    self.mgr.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
  • 当调用了startUpdatingLocation方法后,就起不停地定位用户的岗位,中途会频繁地调用代理的底方法调用频率非常高

  • 设单单待得到一不善, 可以拿走到岗位然后虽止

    • [manager stopUpdatingLocation];

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
//locations参数里面装着CLLocation对象

老三、地理编码的兑现

  1. 赶巧地理编码:将地名转换成经纬度的历程
    步骤:
    (1公海赌船网址)创建一个GLGeocoder对象

(2)实现地理编码方法
(3)遍历数组,获取数据(可能回多独一样地名),如果目标超过1,应该吃用户一个列表选择

  1. 反地理编码:将由此纬度转换成地名的过程
    步骤:
    (1)创建一个GLGeocoder对象
    (2)创建一个CLLoction对象(经纬度)
    (3)实现反地理编码方法
    (4)遍历数组,获取数组

当startUpdatingLocation 代理方中好抱用户之坐标信息

    // 1.获取最后一次的位置
 CLLocation *location = [locations lastObject];
    /*
     location.coordinate; 坐标, 包含经纬度
     location.altitude; 设备海拔高度 单位是米
     location.course; 设置前进方向 0表示北 90东 180南 270西
     location.horizontalAccuracy; 水平精准度
     location.verticalAccuracy; 垂直精准度
     location.timestamp; 定位信息返回的时间
     location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行
     */
    /*
     可以设置模拟器模拟速度
     bicycle ride 骑车移动
     run 跑动
     freeway drive 高速公路驾车
     */
    CLLocation *location = [locations lastObject];
    NSLog(@"%f, %f speed = %f", location.coordinate.latitude , location.coordinate.longitude, location.speed);

CLGeocoder地理编码对象

算算两地之间的直线距离

  • (CLLocationDistance)distanceFromLocation:(const CLLocation
    *)location;

    // 北京:39.6 116.39
    // 广州:23.08 113.15
    CLLocation *BeiJing = [[CLLocation alloc] initWithLatitude:39.6 longitude:116.39];
    CLLocation *GuangZhou = [[CLLocation alloc] initWithLatitude:23.08 longitude:113.15];

    // 得到两地之间的距离
    CLLocationDistance distance = [BeiJing distanceFromLocation:GuangZhou];
    NSLog(@"%.2f", distance);
一个性能:
@property (nonatomic, readonly, getter=isGeocoding) BOOL geocoding;

2、CLLocation

  • CLLocation用来表示有位置的地理信息,比如经纬度、海拔等等

// 属性
    location.coordinate; 坐标, 包含经纬度
     location.altitude; 设备海拔高度 单位是米
     location.course; 设置前进方向 0表示北 90东 180南 270西
     location.horizontalAccuracy; 水平精准度
     location.verticalAccuracy; 垂直精准度
     location.timestamp; 定位信息返回的时间
     location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行

// 可以计算2个位置之间的距离
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
方法:

1、三独刚刚地理编码方法

(1)
- (void)geocodeAddressDictionary:(NSDictionary *)addressDictionary completionHandler:(CLGeocodeCompletionHandler)completionHandler;

(2)最简单的,填入要搜索的位置,回调出搜索信息
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

(3)
- (void)geocodeAddressString:(NSString *)addressString inRegion:(nullable CLRegion *)region completionHandler:(CLGeocodeCompletionHandler)completionHandler;

2、一个倒地理编码方法

- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

3、取消编码

- (void)cancelGeocode;

回调的block参数CLGeocodeCompletionHandler
typedef void (^CLGeocodeCompletionHandler)(NSArray< CLPlacemark
*> * __nullable placemarks, NSError * __nullable error);

3、CLGeocoder

  • 以CLGeocoder可以好“地理编码”和“反地理编码”
block参数:
  1. placemarks:CLPlacemark
    地标对象,里面封装各种详细地址信息,如街道名,城市名,国家名等
  2. error :当编码出错时有值(比如编码不产生切实可行的音讯)

地理编码:根据加的地名,获得实际的职位信息(比如经纬度、地址的完备等)

CLPlacemark 地标对象:
- (instancetype)initWithPlacemark:(CLPlacemark *) placemark;
1、主要获取的属性,位置对象,能获取到经纬度信息
@property (nonatomic, readonly, copy, nullable) CLLocation *location;

@property (nonatomic, readonly, copy, nullable) CLRegion *region;

@property (nonatomic, readonly, copy, nullable) NSTimeZone *timeZone ( 9_0))
@property (nonatomic, readonly, copy, nullable) NSDictionary *addressDictionary;
详细地址名(包括等到门牌等)
@property (nonatomic, readonly, copy, nullable) NSString *name;
街道名
@property (nonatomic, readonly, copy, nullable) NSString *thoroughfare;
子街道名
@property (nonatomic, readonly, copy, nullable) NSString *subThoroughfare;
城市
@property (nonatomic, readonly, copy, nullable) NSString *locality;
子城市
@property (nonatomic, readonly, copy, nullable) NSString *subLocality;
行政区域
@property (nonatomic, readonly, copy, nullable) NSString *administrativeArea;
子行政区域
@property (nonatomic, readonly, copy, nullable) NSString *subAdministrativeArea;
@property (nonatomic, readonly, copy, nullable) NSString *postalCode;
@property (nonatomic, readonly, copy, nullable) NSString *ISOcountryCode;
国家
@property (nonatomic, readonly, copy, nullable) NSString *country;
@property (nonatomic, readonly, copy, nullable) NSString *inlandWater;
@property (nonatomic, readonly, copy, nullable) NSString *ocean;
@property (nonatomic, readonly, copy, nullable) NSArray<NSString *> *areasOfInterest;

凑巧地理编码例子

//1. 创建 Geocoder
CLGeocoder *geocoder = [CLGeocoder new];
//2. 调用方法
[geocoder geocodeAddressString:self.addressTF.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    //3.1 防错处理
    if (placemarks.count == 0 || error) {
        NSLog(@"没有数据或数据解析出错");
        return;
    }
    //3.2 遍历地标数组placemarks,地理编码容易出现多个地标,应该给用户一个列表去选择
    for (CLPlacemark *pm in placemarks) {
        //3.3 设置纬度
        self.latitudeLabel.text = [NSString stringWithFormat:@"%f",pm.location.coordinate.latitude];
        //3.4 设置经度
        self.longitudeLabel.text = [NSString stringWithFormat:@"%f",pm.location.coordinate.longitude];
        //3.5 设置地址
        self.detailAddressLabel.text = pm.name;
    }
}];

倒地理编码例子

//1. 创建 Geocoder 对象
CLGeocoder *geocoder = [CLGeocoder new];
//2. 创建 CLLocation对象,输入经纬度信息
CLLocation *location = [[CLLocation alloc] initWithLatitude:[self.latitudeTF.text floatValue] longitude:[self.longitudeTF.text floatValue]];
//3. 调用反地理编码方法
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    //3.1 防错处理
    if (placemarks.count == 0 || error) {
        NSLog(@"没有数据或数据解析出错");
        return;
    }
    //3.2 遍历数据
    for (CLPlacemark *pm in placemarks) {
        //3.3. 获取城市信息, 如果有城市信息就显示, 否则可以显示行政区域
        if (pm.locality) {
            //locality : 城市
            self.cityLabel.text = pm.locality;
        } else {
            //administrativeArea : 行政区域
            self.cityLabel.text = pm.administrativeArea;
        }
    }
}];

反而地理编码:根据加的中纬度,获得实际的岗位信息

// 地理编码方法
- geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {};

// 反地理编码方法
- reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {};

CLPlacemark的字面意思是地标,封装详细的地址位置信息

1.CLPlacemark的addressDictionary属性 遍历字典数据

addressDictionary enumerateKeysAndObjectsUsingBlock

2.block是在主线程调用,所以可以直接在block刷新UI

name                    :   地名
thoroughfare            :   街道
ubThoroughfare          :   街道相关信息,例如门牌等
locality                :   城市
subLocality             :   城市相关信息,例如标志性建筑
administrativeArea      :   直辖市
subAdministrativeArea   :   其他行政区域信息
postalCode              :   邮编
ISOcountryCode          :   国家编码
country;                :   国家
inlandWater             :   水源、湖泊
ocean;                  :   海洋
areasOfInterest         :   关联的或利益相关的地标

@property (nonatomic, readonly) CLLocation *location;
// 地理位置

@property (nonatomic, readonly) CLRegion *region;
// 区域

@property (nonatomic, readonly) NSDictionary *addressDictionary;
// 详细的地址信息

@property (nonatomic, readonly) NSString *name;
// 地址名称

@property (nonatomic, readonly) NSString *locality;
// 城市

张冠李戴:使用CoreLocation获取地理位置信息,报错

Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"

釜底抽薪方式:

  • 1.规定模拟器(手机)已经联网同时同意程序取得地理位置
  • 2.重置地理位置服务或者网络服务

  • PS:万一是模拟器就果断直接重置模拟器吧 IOS Simulator – Reset
    Content and Settings..。

华经纬度

华之中纬度范围

  • 纬度范围:N 3°51′ ~ N 53°33′
  • 经度范围:E 73°33′ ~ E 135°05′

华夏有些都的中纬度

公海赌船网址 1

相关文章