IOS定位服务的应用

IOS定位服务的应用

一、授权的申请与设置

在IOS8之后,IOS的定位服务做了优化,若要使用定位服务,必须先获取用户的授权。

首先需要在info.plist文件中添加一个键:NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription。其中NSLocationAlwaysUsageDescription是要始终使用定位服务,NSLocationWhenInUseUsageDescription是只在前台使用定位服务。

IOS8中CLLocationManager新增的两个新方法:

- (void)requestAlwaysAuthorization;

- (void)requestWhenInUseAuthorization;

这两个方法对应上面的两个键值,用于在代码中申请定位服务权限。

二、定位服务相关方法

IOS的定位服务在CoreLocation.framework框架内,首先引入这个框架:

开启定位服务的代码非常简单,示例如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#import "ViewController.h"

#import <CoreLocation/CoreLocation.h>

@interface ViewController ()<CLLocationManagerDelegate>//定位服务的代理

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    CLLocationManager* manager = [[CLLocationManager alloc]init];//初始化一个定位管理对象

    [manager requestWhenInUseAuthorization];//申请定位服务权限

    manager.delegate=self;//设置代理

    [manager startUpdatingLocation];//开启定位服务

}

//定位位置改变后调用的函数

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

    NSLog(@"%@",locations);

}

@end

CLLocationManager相关方法解读:

+ (BOOL)locationServicesEnabled;

判断设备是否支持定位服务

+ (BOOL)headingAvailable;

判断设备是否支持航向信息功能(海拔,速度,方向等传感器的支持)

+ (BOOL)significantLocationChangeMonitoringAvailable;

判断设备是否支持更新位置信息

+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass;

判断设备是否支持区域检测,regionClass是地图框架中的类。

+ (BOOL)isRangingAvailabl;

判断设备是否支持蓝牙测距

+ (CLAuthorizationStatus)authorizationStatus;

获得定位服务的授权状态,CLAuthorizationStatus的枚举如下:

?


1

2

3

4

5

6

7

typedef NS_ENUM(int, CLAuthorizationStatus) {

    kCLAuthorizationStatusNotDetermined = 0,//用户还没有做选择

    kCLAuthorizationStatusRestricted,//应用拒接使用定位服务

    kCLAuthorizationStatusDenied,//用户拒绝授权

    kCLAuthorizationStatusAuthorizedAlways,//8.0后可用,始终授权位置服务

    kCLAuthorizationStatusAuthorizedWhenInUse,//8.0后可用,只在前台授权位置服务

};

@property(assign, nonatomic) CLActivityType activityType;

这个属性用来设置位置更新的模式,枚举如下:

?


1

2

3

4

5

6

typedef NS_ENUM(NSInteger, CLActivityType) {

    CLActivityTypeOther = 1,//未知模式,默认为此

    CLActivityTypeAutomotiveNavigation,    //车辆导航模式

    CLActivityTypeFitness,                //行人模式

    CLActivityTypeOtherNavigation         //其他交通工具模式

};

模式的应用可以起到节省电量的作用,例如车辆导航模式,当汽车停止时,位置更新服务会暂停。

@property(assign, nonatomic) CLLocationDistance distanceFilter;

设置位置更新的敏感范围,单位为米。

@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

设置定位服务的精确度,系统定义好的几个参数如下:

kCLLocationAccuracyBestForNavigation;//导航最高精确
kCLLocationAccuracyBest;//高精确
kCLLocationAccuracyNearestTenMeters;//10米
kCLLocationAccuracyHundredMeters;//百米
kCLLocationAccuracyKilometer;//千米
kCLLocationAccuracyThreeKilometers;//三公里

@property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically;

设置位置更新是否自动暂停

@property(readonly, nonatomic, copy) CLLocation *location;

最后一次更新的位置信息,只读属性

@property(assign, nonatomic) CLLocationDegrees headingFilter;

相关航向更新的敏感范围

@property(assign, nonatomic) CLDeviceOrientation headingOrientation;

定位航向时的参照方向默认为正北,枚举如下:

?


1

2

3

4

5

6

7

8

9

typedef NS_ENUM(int, CLDeviceOrientation) {

    CLDeviceOrientationUnknown = 0,//方向未知

    CLDeviceOrientationPortrait,//纵向模式

    CLDeviceOrientationPortraitUpsideDown,//纵向倒置模式

    CLDeviceOrientationLandscapeLeft,//左向横向模式

    CLDeviceOrientationLandscapeRight,//右向横向模式

    CLDeviceOrientationFaceUp,//水平屏幕向上模式

    CLDeviceOrientationFaceDown//水平屏幕下模式

};

@property(readonly, nonatomic, copy) CLHeading *heading;

最后一个定位得到的航向信息

- (void)startUpdatingLocation;

开启定位服务

- (void)stopUpdatingLocation;

停止定位服务

- (void)startUpdatingHeading;

开启航向地理信息服务

- (void)stopUpdatingHeading;

停止航向地理信息服务

三、定位服务代理的相关方法

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

位置更新后调用的方法,数组中是所有定位到的位置信息,最后一个是最新的。

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

航向信息更新后调用的方法

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

定位异常时调用的方法

四、定位服务获取到的位置对象

上面也提到,定位后返回的数组中存放的都是CLLocation对象,这里面有很详细的位置信息,属性如下:

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

经纬度属性,CLLocationCoordinate2D是一个结构体,如下:

?


1

2

3

4

typedef struct {

    CLLocationDegrees latitude;//纬度

    CLLocationDegrees longitude;//经度

} CLLocationCoordinate2D;

@property(readonly, nonatomic) CLLocationDistance altitude;

海拔高度,浮点型

@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;

水平方向的容错半径

@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;

竖直方向的容错半径

@property(readonly, nonatomic) CLLocationDirection course;

设备前进的方向,取值范围为0-359.9,相对正北方向

@property(readonly, nonatomic) CLLocationSpeed speed;

速度,单位为m/s

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

定位时的时间戳

五、航标定位得到的航标信息对象

CLHeading对象的属性信息:

@property(readonly, nonatomic) CLLocationDirection magneticHeading;

设备朝向航标方向,0为北磁极。

@property(readonly, nonatomic) CLLocationDirection trueHeading;

设备朝向真实方向,0被地理上的北极

@property(readonly, nonatomic) CLLocationDirection headingAccuracy;

方向偏差

@property(readonly, nonatomic) CLHeadingComponentValue x;

x轴的方向值

@property(readonly, nonatomic) CLHeadingComponentValue y;

y轴方向值

@property(readonly, nonatomic) CLHeadingComponentValue z;

z轴方向值

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

方向定位时间戳

时间: 2025-01-29 23:41:52

IOS定位服务的应用的相关文章

iOS 6定位服务编程详解

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

iOS8中的定位服务

iOS8中的定位服务 My app that worked fine in iOS 7 doesn't work with the iOS 8 SDK. CLLocationManager doesn't return a location, and I don't see my app under Settings > Location Services either. I did a Google search on the issue but nothing came up, what c

iOS6定位服务编程详解

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

ios-iOS 9在使用定位服务获取经纬度的时候,系统不调用代理方法,怎么解决?

问题描述 iOS 9在使用定位服务获取经纬度的时候,系统不调用代理方法,怎么解决? @interface NearbyViewController (){ // CLLocationManager *_locationManager; CLGeocoder *_lgeocoder; } @property (strong, nonatomic) CLLocationManager *locationManager; @end (void)viewDidLoad { [super viewDidL

谷歌官方定位服务在苹果软件商店上线

本周,Google官方的谷歌纵横(Google Latitude)软件 终于在苹果App Store在线软件商店上线,距离Google 2009年2月份宣布这款软件已 经过去了近两年时间.Google Latitude是一款基于定位服务的社交网络应用,用户可以与好友分享自己当前的所在位置,也可以在好友允许的 前提下查看其所在位置.家人朋友约会碰面时,此软件 往往有相当实际的用途.Google最初宣布该应用时曾希望直接进入App Store.但苹果以此应用功能与iPhone自带Maps过于相似为由

苹果或在下一代iPhone中增加室内定位服务 - 新闻中心

[赛迪网讯]3月26日消息,据国外http://www.aliyun.com/zixun/aggregation/31646.html">媒体报道,苹果日前收购了室内GPS导航服务提供商WiFiSlam公司,看起来苹果在准备与谷歌开战.WiFiSlam是一家向用户提供室内定位服务的公司,收购WiFiSlam之举表明苹果可能在iPhone 6增加室内定位服务功能. 苹果以2000万美元的价格收购了WiFiSlam,此举表明苹果可能会向其iOS智能手机及平板电脑用户提供室内地图及定位服务.为解

百度地图-在android开发中使用百度LBS定位服务无法稳定准确获得地理位置

问题描述 在android开发中使用百度LBS定位服务无法稳定准确获得地理位置 程序代码如下所示,我是仿照网上的实例编写的,在manifests文件中已经添加了识别码以及百度定位的service,权限也按照百度的说明文档添加好了,在虚拟机中运行效果为无法获取地理位置,错误码62,真机运行则毫无反应,我完全找不到是什么地方出了问题,哪位大大可以帮我看一下吗? import android.os.Bundle; import android.support.v4.app.Fragment; impo

ags 地图服务 ios-AGS之ios地图服务只能显示一个地图服务

问题描述 AGS之ios地图服务只能显示一个地图服务 AGSTiledMapServiceLayer用他来显示普通地图和影像地图,可是如果我先加载哪个服务就只能显示哪个服务,我的功能是默认显示影像地图的服务,之后可以切换为普通地图服务,可是切换的时候就是不显示普通地图服务.不知道为什么,求大神们指教.

短信发送-在通过百度API提供的定位服务实现发送包含地理位置短信的功能时软件报错,求解~~

问题描述 在通过百度API提供的定位服务实现发送包含地理位置短信的功能时软件报错,求解~~ 请问如何将获取到的地理位置信息转换成可以在短信发送代码中调用的字符呢??