ios 定位

ios 定位新功能----在程序中实现定位功能
Core Location是iOS SDK中一个提供设备位置的框架。可以使用三种技术来获取位置:GPS、蜂窝或WiFi。在这些技术中,GPS最为精准,如果有GPS硬件,Core Location将优先使用它。如果设备没有GPS硬件(如WiFi iPad)或使用GPS获取当前位置时失败,Core Location将退而求其次,选择使用蜂窝或WiFi。

Core Location的大多数功能是由位置管理器(CLLocationManager)提供的,可以使用位置管理器来指定位置更新的频率和精度,以及开始和停止接收这些更新。

要使用位置管理器,必须首先将框架Core Location加入到项目中,再导入其接口文件:


1

#import <corelocation corelocation.h=""></corelocation>

接下来,需要分配并初始化一个位置管理器实例、指定将接收位置更新的委托并启动更新:


1

2

3

4

CLLocationManager *locManager = [[CLLocationManager alloc] init];

locManager.delegate = self;

[locManager startUpdatingLocation];

//[locManager stopUpdatingLocation];

位置管理器委托(CLLocationManagerDelegate)有两个与位置相关的方法:


1

2

3

4

5

6

7

8

9

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

{

    

}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

{

    

}

第一个方法处理定位成功,manager参数表示位置管理器实例;locations为一个数组,是位置变化的集合,它按照时间变化的顺序存放。如果想获得设备的当前位置,只需要访问数组的最后一个元素即可。集合中每个对象类型是CLLocation,它包含以下属性:

coordinate — 坐标。一个封装了经度和纬度的结构体。

altitude — 海拔高度。正数表示在海平面之上,而负数表示在海平面之下。

horizontalAccuracy —
位置的精度(半径)。位置精度通过一个圆表示,实际位置可能位于这个圆内的任何地方。这个圆是由coordinate(坐标)和
horizontalAccuracy(半径)共同决定的,horizontalAccuracy的值越大,那么定义的圆就越大,因此位置精度就越低。如
果horizontalAccuracy的值为负,则表明coordinate的值无效。

verticalAccuracy — 海拔高度的精度。为正值表示海拔高度的误差为对应的米数;为负表示altitude(海拔高度)的值无效。

speed — 速度。该属性是通过比较当前位置和前一个位置,并比较它们之间的时间差异和距离计算得到的。鉴于Core Location更新的频率,speed属性的值不是非常精确,除非移动速度变化很小


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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

{

    CLLocation *curLocation = [locations lastObject];

    

    if(curLocation.horizontalAccuracy > 0)

    {

        NSLog(@"当前位置:%.0f,%.0f +/- %.0f meters",curLocation.coordinate.longitude,

              curLocation.coordinate.latitude,

              curLocation.horizontalAccuracy);

    }

    

    if(curLocation.verticalAccuracy > 0)

    {

        NSLog(@"当前海拔高度:%.0f +/- %.0f meters",curLocation.altitude,curLocation.verticalAccuracy);

    }

}

应用程序开始跟踪用户的位置时,将在屏幕上显示一个是否允许定位的提示框。如果用户禁用定位服务,iOS不会禁止应用程序运行,但位置管理器将生成错误。

第二个方法处理这种定位失败,该方法的参数指出了失败的原因。如果用户禁止应用程序定位,error参数将为kCLErrorDenied;如果Core

Location经过努力后无法确认位置,error参数将为kCLErrorLocationUnknown;如果没有可供获取位置的源,error参
数将为kCLErrorNetwork。

通常,Core Location将在发生错误后继续尝试确定位置,但如果是用户禁止定位,它就不会这样做;在这种情况下,应使用方法stopUpdatingLocation停止位置管理器。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

{

    if(error.code == kCLErrorLocationUnknown)

    {

        NSLog(@"Currently unable to retrieve location.");

    }

    else if(error.code == kCLErrorNetwork)

    {

        NSLog(@"Network used to retrieve location is unavailable.");

    }

    else if(error.code == kCLErrorDenied)

    {

        NSLog(@"Permission to retrieve location is denied.");

        [manager stopUpdatingLocation];

    }

}

可根据实际情况来指定位置精度。例如,对于只需确定用户在哪个国家的应用程序,没有必要要求Core
Location的精度为10米。要指定精度,可在启动位置更新前设置位置管理器的desiredAccuracy。有6个表示不同精度的枚举值


1

2

3

4

5

6

extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation;

extern const CLLocationAccuracy kCLLocationAccuracyBest;

extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;

extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;

extern const CLLocationAccuracy kCLLocationAccuracyKilometer;

extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;

对位置管理器启动更新后,更新将不断传递给位置管理器委托,直到停止更新。您无法直接控制这些更新的频率,但可使用位置管理器的属性
distanceFilter进行间接控制。在启动更新前设置属性distanceFilter,它指定设备(水平或垂直)移动多少米后才将另一个更新发
送给委托。下面的代码使用适合跟踪长途跋涉者的设置启动位置管理器:


1

2

3

4

5

CLLocationManager *locManager = [[CLLocationManager alloc] init];

locManager.delegate = self;

locManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;

locManager.distanceFilter = 200;

[locManager startUpdatingLocation];

P.s. 定位要求的精度越高、属性distanceFilter的值越小,应用程序的耗电量就越大。

位置管理器有一个headingAvailable属性,它指出设备是否装备了磁性指南针。如果该属性为YES,就可以使用Core
Location来获取航向(heading)信息。接收航向更新与接收位置更新极其相似,要开始接收航向更新,可指定位置管理器委托,设置属性
headingFilter以指定要以什么样的频率(以航向变化的度数度量)接收更新,并对位置管理器调用方法
startUpdatingHeading:

位置管理器委托协议定义了用于接收航向更新的方法。该协议有两个与航向相关的方法:


1

2

3

4

5

6

7

8

9

- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager

{

    return YES;

}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading

{

    

}

第一个方法指定位置管理器是否向用户显示校准提示。该提示将自动旋转设备360°。由于指南针总是自我校准,因此这种提示仅在指南针读数剧烈波动时才有帮助。当设置为YES后,提示可能会分散用户的注意力,或影响用户的当前操作。

第二个方法的参数newHeading是一个CLHeading对象。CLHeading通过一组属性来提供航向读数:magneticHeading和
trueHeading。这些值的单位为度,类型为CLLocationDirection,即双精度浮点数。这意味着:

如果航向为0.0,则前进方向为北;

如果航向为90.0,则前进方向为东;

如果航向为180.0,则前进方向为南;

如果航向为270.0,则前进方向为西。

CLHeading对象还包含属性headingAccuracy(精度)、timestamp(读数的测量时间)和description(这种描述更适合写入日志而不是显示给用户)。下面演示了利用这个方法处理航向更新:


1

2

3

4

5

6

7

8

9

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading

{

    if(newHeading.headingAccuracy >=0)

    {

        NSString *headingDesc = [NSString stringWithFormat:@"%.0f degrees (true), %.0f degrees (magnetic)",newHeading.trueHeading,newHeading.magneticHeading];

        

        NSLog(@"%@",headingDesc);

    }

}

trueHeading和magneticHeading分别表示真实航向和磁性航向。如果位置服务被关闭了,GPS和wifi就只能获取magneticHeading(磁场航向)。只有打开位置服务,才能获取trueHeading(真实航向)。

时间: 2024-11-05 13:14:12

ios 定位的相关文章

iOS定位服务与地图开发(1)---获取经纬度

定位服务是通过GPS等方式查找定位自己的位置的,再通过地图标注出来. 在iOS中定位服务和地图开发是使用两套API分别完成的. 1.定位服务: iOS系统提供3种不同定位途径: 1>WiFi定位:通过查询一个WiFi路由器的地理位置信息,iPhone.iPod Touch.iPad都可以采用. 2>蜂窝式移动电话基站定位:通过移动运营商基站定位 3>GPS卫星定位:通过3~4颗GPS卫星位置定位,最为准确,但是耗电量大 iOS不像Android系统在定位服务编程时可以指定采用哪种途径进行

IOS 定位 单例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + (SCLocationController *)sharedController {      static SCLocationController *sharedController = nil;     

iOS定位服务编程详解

现在的移动设备很多都提供定位服务,使用iOS系统的iPhone.iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星 iOS 不像Android系统在定位服务编程时,可以指定采用哪种途径进行定位.iOS的API把底层这些细节屏蔽掉了,开发人员和用户并不知道现在设备是采用 哪种方式进行定位的,iOS系统会根据设备的情况和周围的环境,采用一套最佳的解决方案.这个方案是这样的,如果能够接收GPS信息,那么设备优先采用 GP

iOS定位服务与地图开发(4)---显示地图

iOS 6之前,苹果使用的是谷歌地图,iOS 6之后,苹果使用了自己的地图(国内好像用的是高德地图),但是API编程接口与iOS 5相比没有太大变化. iOS 应用程序中使用Map Kit API开发地图应用程序,使用MKMapView类作为地图显示视图,其委托协议是MKMapViewDelegate. 1.显示地图: .h文件中代码 #import <MapKit/MapKit.h> @interface YXCViewController <MKMapViewDelegate>

iOS定位和地图

iOS定位和地图功能要用到两个框架:mapkitcoreLocation 两个专门术语:lbs(Location Based Service)基于定位服务的APP和solomo(Social Local Mobile)社交+本地+手机. CoreLocation 1.导入框架,导入头文件. 2.创建CALocationManager对象. 3.设置代理. 4.实现方法 - (void)locationManager:(CLLocationManager *)manager didUpdateLo

iOS定位服务与地图开发(3)---地理信息编码查询

即根据一个NSString的文字描述对象获取相关的地理坐标. 采用CLGeocoder类操作,具体方法: 1>geocodeAddressDictionary:completionHandler: 通过指定一个地址信息字典对象参数进行查询 2>geocodeAddressString:completionHandler:通过指定一个地址信息字符串参数进行查询 3>geocodeAddressString:inRegion:completionHandler:通过制定地址信息字符串和查询范

iOS定位服务与地图开发(2)---地理信息反编码

上节我们通过定位获取了经度和纬度数值,但是一般人很难看懂这些数字. 地理信息反编码:就是根据这些经纬数字返回地点的相关文字描述信息,这些文字描述信息被封装在CLPlacemark类中,我们称这个类为"地标"类. 地理信息反编码使用CLGeocoder类实现,这个类能够实现在地理坐标与地理文字描述信息之间的转换. CLGeocoder类中进行地理信息反编码的方法是:reverseGeocodeLocation: completionHandler: location:是要定位的地理位置对

iOS定位开发之CoreLocation

有时候我们并不需要查看地图,而仅仅需要自己的当前位置就可以,这时候就没有必要去使用MapKit可,直接使用定位服务就好了 苹果提供了CoreLocation框架来做定位功能 首先要想项目中导入CoreLocation框架 定位服务开启之前最好查看一下定位服务是否可用,有可能用户已经拒绝或者用户手机定位模块有问题,无法定位 定位服务是由CLLocationManager来管理的 定位成功等信息也是通过代理发送给对象的,另外定位中经常需要用到地理位置的解码和反解码(其实就是经纬度和地名之间的转换)

iOS定位原理和使用建议

看到很多网友讨论iOS设备定位的问题,这里将我们所了解的关于iPhone.iPad.iPod等的定位原理做详细的介绍,希望能为大家增加知识,减少误区,更好地使用iOS设备. 介绍之前,先声明一下关于地图加加的"偏移修正"功能,地图加加可以对齐中国地区(地点.线路和照片的)坐标和中国地图之间的偏移,这个是我国测绘法规要求的一个数学意义的偏移,每个地方的偏移是固定的,法定的,和当前定位的方式.定位的精度与准确度没有任何关系.即地图加加只对齐偏移,并不能提升.降低或者改变iOS定位的速度.精