欢迎来真孝善网,为您提供真孝善正能量书籍故事!

全面解析:iOS设备中的定位与地图功能

时间:11-08 神话故事 提交错误

本篇文章给大家谈谈全面解析:iOS设备中的定位与地图功能,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

在上述应用中,用到了定位和地图功能。在iOS开发中,如果要添加这两大功能,必须基于两个框架进行开发:

CoreLocation:用于地理定位,如:地理编码、区域监控等(重点关注功能实现)

MapKit:用于地图显示,如图钉、路线、叠加显示等(重点关注界面显示)

2个专业术语:

LBS:location Based Service(基于位置的服务)

ScLoMo:社交本地移动(所罗门)

定位

CoreLocation:用于地理定位、地理编码、区域监控等(重点关注功能实现)

地理编码:将位置转换为经纬度,如:北京天安门-100.333445, 22.88888

反向地理编码:将某个位置的经纬度转换为文字描述的具体位置,如:100.333445、22.88888——北京天安门

区域监控:监控某个位置是否在某个区域内。

核心位置的使用

第一种方式:

导入框架:CoreLocation.frameWork

导入头文件:#import

第二种方式:

只需导入头文件即可。前提是,如果代码使用了CoreLocation框架中的类创建的对象,则在链接过程中会隐式链接相应的框架。

经验:CoreLocation框架中所有类型数据的前缀都是以CL开头。

CLLocationManager 对象在CoreLocation 框架中用于提供位置服务。

iOS8.0之前的定位实现:

1. 创建位置管理器:

_manager=[[CLLocationManager 分配] init];

2、设置代理:通过代理获取位置信息等,并遵守代理协议。

_manager.delegate=自我;

3、开始定位:startUpdatingLocation调用该方法开始定位,会不断获取用户的位置信息。

[self.manager startUpdatingLocation];

4、实现代理方法:获取用户的位置信息等。

*每当获得用户位置时就会被调用(非常频繁)

* @param manager 位置管理器

* @paramlocations数组,位置信息等,全部在number的最后一个元素中

- (void)locationManager:(CLLocationManager*)经理didUpdateLocations:(NSArray *)位置

{

NSLog(@"%@",位置);

CLLocation*位置=[locationslastObject];

}

至此定位已经完成。

运行时会出现弹窗:

PS: 从iOS6开始,苹果在保护用户隐私方面下了很大的功夫。只要它想要获取用户的位置,访问用户的通讯录、日历、拍照、相册等操作,都必须经过用户的同意。开发用户可以在Info.plist中设置NSLocationUsageDescription来描述定位的目的。

如何判断授权状态?

通过代理方法didChangeAuthorizationStatus:

*授权状态发生变化时调用

* @param manager 位置管理器

* @param status当前授权状态有五种状态

- (void)locationManager:(CLLocationManager*)经理didChangeAuthorizationStatus:(CLAuthorizationStatus)状态

{

开关(状态){

案例kCLAuthorizationStatusNotDetermined:

NSLog(@"用户未定");

休息;

案例kCLAuthorizationStatusRestricted:

NSLog(@"受限");

休息;

案例kCLAuthorizationStatusDenied:

//判断当前设备是否支持定位以及是否启用定位

if([CLLocationManager locationServicesEnabled])

{

NSLog(@"位置已启用但被拒绝");

//ios8.0之前需要截图来提醒用户如何接受授权。

//iOS8.0之后,只需调用系统提供的API,就会自动跳转到设置界面。

}别的{

NSLog(@"未启用定位");

}

休息;

案例kCLAuthorizationStatusAuthorizedAlways:

NSLog(@"正面和背面");

休息;

案例kCLAuthorizationStatusAuthorizedWhenInUse:

NSLog(@"前台");

休息;

默认:

休息;

}

}

其他属性设置

- (void)stopUpdatingLocation:停止定位(用于一次性定位,例如定位到用户位置后停止),可以在上面的代理方法中使用。

distanceFilter:定位多远的位置,例如:_manager.distanceFilter=10;意思是每10米定位一次。

desiredAccuracy:定位精度(越精确,消耗的电量越多)。它有6 个值,如下:

kCLLocationAccuracyBestForNavigation //最适合导航

kCLLocationAccuracyBest; //最好的

kCLLocationAccuracyNearestTenMeters;//附近10米

kCLLocationAccuracyHundredMeters;//附近100米

kCLLocationAccuracyKilometer;//附近1000米

kCLLocationAccuracyThreeKilometers;//附近3000米

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

坐标:纬度和经度

海拔高度: 海拔高度

course:航线、航向(取值范围0.0~359.9,0.0代表正北方向)

speed:移动速度(单位为m/s)

如果horizontalAccuracy为负数,则表示当前位置不可用。

PS:目前的定位只是前台定位。当APP进入后台后,将不再定位。如果要实现前后端定位,就必须手动设置后台模式。如图所示

iOS8.0之后的定位实现

在iOS8.0+运行上述代码时,不会弹出授权提示框。这是因为从iOS8.0开始,苹果进一步加强了对用户隐私的保护。当APP想要访问用户的隐私信息时,系统不再自动弹出对话框进行用户授权。

解决方案:调用iOS8.0的API,主动请求用户授权

- (void)requestAlwaysAuthorization//前后端均请求获取用户位置授权的权限

- (void)requestWhenInUseAuthorization//前台请求授权获取用户位置

选择以上其中一项。

一定要在info.plist文件中配置相应的key值,否则上述请求授权的方法不会生效。

NSLocationAlwaysUsageDescription: 允许在前后端获取GPS的描述

NSLocationWhenInUseDescription: 允许在前台获取GPS 描述

以上两者任选其一,并与上面的调用方式保持一致。

if([UIDevice currentDevice].systemVersion.floatValue=8.0) {

[_managerrequestAlwaysAuthorization];

}

iOS9.0之后的定位实现

如果iOS9.0当前处于前台授权状态,则默认无法在后台获取用户的位置。不过,可以将以下属性设置为YES,也可以继续获取后台位置,但是会出现一个蓝色条;

if([UIDevice currentDevice].systemVersion.floatValue=8.0) {

[_managerrequestAlwaysAuthorization];

if([UIDevicecurrentDevice].systemVersion.floatValue=9.0)

{

_manager.allowsBackgroundLocationUpdates=是;

}

}

PS:iOS9.0可以一次性请求用户位置

- (void)requestLocation注意:此方法不能与startUpdatingLocation一起使用。

-(void)locationManager:(nonnullCLLocationManager*)managerdidUpdateLocations:(nonnullNSArray *)locations//调用成功

-(void)locationManager:(nonnullCLLocationManager*)managerdidFailWithError:(nonnullNSError*)error//调用失败

地理编码:CLGeocoder

“地理编码”和“反地理编码”可以使用CLGeocoder完成。

地理编码方法

- (void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;

反向地理编码方法

- (void)reverseGeocodeLocation:(CLLocation*)位置completionHandler:(CLGeocodeCompletionHandler)completionHandler;

CLGeocodeCompletionHandler

当geodegeocoding 完成时,调用CLGeocodeCompletionHandler

typedefvoid(^CLGeocodeCompletionHandler)(NSArray*placemarks,NSError*error);

该块传递2 个参数

error:编码出现错误时有值(例如无法编码特定信息)

placemarks:包含CLPlacemark 对象

CLP地标

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

@property(非原子,只读)CLLocation *位置;

地理位置

@property(非原子,只读)CLRegion *区域;

区域

@property(非原子,只读)NSDictionary*addressDictionary;

详细地址信息

@property(非原子,只读)NSString*name;

地址名称

@property(非原子,只读)NSString*locality;

城市

地理编码案例:输入经纬度,点击地理编码按钮即可获取详细地址;输入详细地址,点击反地理编码按钮即可获取对应的经纬度。如图所示:

首先在storyboard布局好界面,连好线。

code:

案例:封装一个简单的定位工具类(代理模式转为块模式),获取用户位置,通过blcok回调返回用户位置信息。

1.创建单例工具类

YWZLocationTools.h

YWZ定位工具.m

YWZLocationTools.h 中的代码

YWZLocationTools.m中的代码

用户评论

(り。薆情海

iOS 的定位功能越来越精准了呀!

    有12位网友表示赞同!

颓废人士

之前用其他手机打车经常迷路,现在用 iPhone 真好使。

    有7位网友表示赞同!

致命伤

苹果地图真是太棒了,导航路线清晰易懂。

    有14位网友表示赞同!

小清晰的声音

想知道有没有什么 App 可以用来查看附近的所有餐厅呢?

    有9位网友表示赞同!

矜暮

我的 iphone 定位功能有时候会出问题,不知道是怎么回事。

    有9位网友表示赞同!

岁岁年年

最近在用一些新的定位服务,感觉体验都挺不错的。

    有14位网友表示赞同!

逾期不候

iOS 地图更新后界面更简洁了,好上手。

    有5位网友表示赞同!

陌颜

手机地图能直接调语音导航吗?

    有6位网友表示赞同!

留我一人

苹果地图的实时交通状况功能真实惠!

    有14位网友表示赞同!

颓废i

希望 iOS 定位以后还能加入一些新的功能,比如室内定位什么的。

    有6位网友表示赞同!

男神大妈

iOS 地图上标示的路线图是不是比较详细呢?

    有6位网友表示赞同!

景忧丶枫涩帘淞幕雨

想问下用 iPhone 的朋友们,你们平时都使用哪款地图比较好呢?

    有20位网友表示赞同!

千城暮雪

在国外旅行的时候, iOS 定位真的很方便!

    有20位网友表示赞同!

夏以乔木

手机定位的功能越来越普遍了,真好!

    有17位网友表示赞同!

念旧情i

苹果地图现在好像连公交线路都能导航了?真厉害

    有15位网友表示赞同!

长裙绿衣

感觉现在的定位技术越来越精准了,以前总是迷路,现在还好多了。

    有12位网友表示赞同!

别伤我i

不知道为什么我的手机定位有时候会显示在错的地方呀?

    有8位网友表示赞同!

爱你的小笨蛋

iOS 地图有历史轨迹的功能吗?我想看看我过去一段时间都在哪里走过呢。

    有19位网友表示赞同!

短发

手机地图能记录路线吗?想看看自己之前经过的哪些地方。

    有7位网友表示赞同!

【全面解析:iOS设备中的定位与地图功能】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活