iOS:授权用户定位NSLocationManager的使用
//声明一个完成信息转换后的block函数
typedef void (^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error);
@interface CLGeocoder : NSObject
@property (nonatomic, readonly, getter=isGeocoding) BOOL geocoding; //是否正在编码
//将地图上的位置信息转化为地理信息
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;
//将地理信息转换为地图上的位置信息
- (void)geocodeAddressDictionary:(NSDictionary *)addressDictionary completionHandler:(CLGeocodeCompletionHandler)completionHandler;
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
- (void)geocodeAddressString:(NSString *)addressString inRegion:(CLRegion *)region completionHandler:(CLGeocodeCompletionHandler)completionHandler;
//取消位置信息编码
- (void)cancelGeocode;
@end
====================================================
//地图上的位置标记类(封装存放着一个位置转换到地图上的地理信息,包括国家、城市、大洋、街道等)
@interface MKMapItem : NSObject
@property (nonatomic, readonly) MKPlacemark *placemark;
@property (nonatomic, readonly) BOOL isCurrentLocation;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *phoneNumber;
@property (nonatomic, strong) NSURL *url;
//创建地图位置标记
+ (MKMapItem *)mapItemForCurrentLocation;
- (instancetype)initWithPlacemark:(MKPlacemark *)placemark;
//调用系统地图显示当前设置的位置
- (BOOL)openInMapsWithLaunchOptions:(NSDictionary *)launchOptions;
+ (BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)launchOptions;
封装的地理位置标记(一些地理信息)
@interface CLPlacemark : NSObject <NSCopying, NSSecureCoding>
- (instancetype)initWithPlacemark:(CLPlacemark *)placemark;
@property (nonatomic, readonly, copy) CLLocation *location;
@property (nonatomic, readonly, copy) CLRegion *region;
@property (nonatomic, readonly, copy) NSDictionary *addressDictionary;
@property (nonatomic, readonly, copy) NSString *name; // eg. Apple Inc.
@property (nonatomic, readonly, copy) NSString *thoroughfare; // street address, eg. 1 Infinite Loop
@property (nonatomic, readonly, copy) NSString *subThoroughfare; // eg. 1
@property (nonatomic, readonly, copy) NSString *locality; // city, eg. Cupertino
@property (nonatomic, readonly, copy) NSString *subLocality; // neighborhood, common name, eg.
@property (nonatomic, readonly, copy) NSString *administrativeArea; // state, eg. CA
@property (nonatomic, readonly, copy) NSString *subAdministrativeArea; // county, eg. Santa Clara
@property (nonatomic, readonly, copy) NSString *postalCode; // zip code, eg. 95014
@property (nonatomic, readonly, copy) NSString *ISOcountryCode; // eg. US
@property (nonatomic, readonly, copy) NSString *country; // eg. United States
@property (nonatomic, readonly, copy) NSString *inlandWater; // eg. Lake Tahoe
@property (nonatomic, readonly, copy) NSString *ocean; // eg. Pacific Ocean
@property (nonatomic, readonly, copy) NSArray *areasOfInterest; // eg. Golden Gate Park
@end
// 定位管理器
_mgr = [[CLLocationManager alloc] init];
// 获取授权
[_mgr requestAlwaysAuthorization];
// 设置代理
_mgr.delegate = self;
// 设置精度
_mgr.desiredAccuracy = kCLLocationAccuracyBest;
// 开始获取用户的位置
[_mgr startUpdatingLocation];
定位管理器的代理方法:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations•
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
通过地址获得经纬度 :
CLGeocoder:地理信息编解码
_geocoder = [[CLGeocoder alloc] init];
//将地理信息转换为地图信息
[_geocoder geocodeAddressString:@“东三旗" completionHandler:^(NSArray *placemarks, NSError *error) {
//没有找到符合要求的地址
if (placemarks.count == 0) return;
// 任意取出一个位置
CLPlacemark *firstPlacemark = placemarks[0];
// 添加大头针
MyAnnotation *anno = [[MyAnnotation alloc] init];
anno.title = firstPlacemark.name; // 名称
anno.subtitle = firstPlacemark.country; // 国家
anno.coordinate = firstPlacemark.location.coordinate; // 坐标
[_mapView addAnnotation:anno]; //将大头针添加到地图中
}];
大头针->获取地理地址
//转换地图信息(将地图信息转换为具体的地理信息)
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
//任意取出一个位置
CLPlacemark *placeMark = placemarks[0];
NSLog(@"%@,%@",placeMark.country,placeMark.locality);
}];
具体实例如下:
前期准备:
1、导入CoreLocation和Mapkit框架

2、在info.plist文件中添加用户定位授权

3、主要的文件截图为:

下面就是代码的操作了:
1、声明相关的属性并实现定位协议
#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate> //实现定位管理者协议
@property (strong,nonatomic)CLLocationManager *locationManager; //声明定位管理者
@end
2、创建定位管理者,设置代理,开始定位
- (void)viewDidLoad {
[super viewDidLoad];
//创建位置管理者
self.locationManager = [[CLLocationManager alloc]init];
//获取用户授权
[self.locationManager requestAlwaysAuthorization];
//定位授权状态(始终定位、当使用时定位)
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
{
NSLog(@"授权通过");
}
else
{
NSLog(@"授权不通过");
}
//设置定位管理器的代理
self.locationManager.delegate = self;
//设置精度
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//开始定位
[self.locationManager startUpdatingLocation];
}
3、实现定位协议的代理方法,从地图上获取任意一个位置的地理信息,以及定位失败时的处理
#pragma mark -实现定位管理者的代理方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"%@",locations); //取出一个位置信息
CLLocation *location = [locations lastObject]; //定义地理信息编解码
CLGeocoder *geocoder = [[CLGeocoder alloc]init]; //转换地图信息(将地图信息转换为具体的地理信息)
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { //取出位置标记
CLPlacemark *placeMark = placemarks[]; NSLog(@"%@,%@",placeMark.country,placeMark.locality);
}];
} //定位失败
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"%@",[error localizedDescription]);
}
4、实现触摸开始事件,将两个地理位置添加到地图中并设置大头针,调用系统地图,最终显示两个地点的线路
//触摸开始处理
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//定义地理信息编解码
CLGeocoder *geocoder = [[CLGeocoder alloc]init]; //转换地理信息(将地理信息转换为具体的地图信息)
[geocoder geocodeAddressString:@"东三旗" completionHandler:^(NSArray *placemarks, NSError *error) {
if ([placemarks count] == )
{
NSLog(@"没找到相应的信息");
}
else
{
//取出位置标记
CLPlacemark *placeMark = placemarks[];
NSLog(@"%@%@",placeMark.country,placeMark.locality); //位置标记被封装在地图上的具体信息(包括国家、城市等等)
MKMapItem *mapitem = [[MKMapItem alloc]initWithPlacemark:(MKPlacemark*)placeMark]; //转换地理信息(将地理信息转换为具体的地图信息)
[geocoder geocodeAddressString:@"八达岭长城" completionHandler:^(NSArray *placemarks, NSError *error)
{ //当前位置在地图上的具体信息
MKMapItem *mapitem2 = [[MKMapItem alloc]initWithPlacemark:((MKPlacemark*)placemarks[])]; //调用系统地图显示当前设置的位置
[MKMapItem openMapsWithItems:@[mapitem,mapitem2] launchOptions:nil];
}];
}
}];
}
演示结果:
一开始时的用户授权:

点击Allow后输出:(此位置时间一直在更新,我只给出部分结果)
切换位置,选择此处的Hong Kong,China位置后:

输出结果:
-- ::59.989 -CLLocation[:] 授权通过
-- ::00.026 -CLLocation[:] (
"<+22.28468100,+114.15817700> +/- 5.00m (speed -1.00 mps / course -1.00) @ 15/10/20 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f4\U4e0b\U53481:33:50"
)
-- ::00.034 -CLLocation[:] (
"<+22.28468100,+114.15817700> +/- 5.00m (speed -1.00 mps / course -1.00) @ 15/10/20 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f4\U4e0b\U53481:37:00"
)
-- ::00.846 -CLLocation[:] 中國,香港特別行政區
-- ::01.007 -CLLocation[:] (
"<+22.28468100,+114.15817700> +/- 5.00m (speed -1.00 mps / course -1.00) @ 15/10/20 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f4\U4e0b\U53481:37:01"
)
-- ::01.043 -CLLocation[:] 中國,香港特別行政區
-- ::01.443 -CLLocation[:] 中國,香港特別行政區
-- ::02.007 -CLLocation[:] (
"<+22.28468100,+114.15817700> +/- 5.00m (speed -1.00 mps / course -1.00) @ 15/10/20 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f4\U4e0b\U53481:37:02"
)
-- ::02.036 -CLLocation[:] 中國,香港特別行政區
触摸开始后,将设置的两个位置显示在地图上的截图为:

iOS:授权用户定位NSLocationManager的使用的更多相关文章
- iOS 获取用户授权的用户隐私保护-地图定位
获取用户授权的用户隐私保护地图定位示例://导入定位框架#import<CoreLocation/CoreLocation.h>@interfaceViewController()< ...
- Ios开发之定位CLLocationManager
Ios中的定位功能是通过 Core Location框架实现的.它和地图开发框架是相互独立的.在Core Location中主要实现了定位和地理编码的功能! 下面我们就来介绍一下它的属性,方法和代理方 ...
- ios 判断用户是否开启权限---并跳转设置
ios 判断用户是否开启权限---并跳转设置 ios 判断用户是否开启权限---并跳转“系统设置” 1.判断 访问相册 或 相机 权限是否开启 2.检测是否开启定位 后面将持续更新 只有在应用请求过位 ...
- iOS获取用户设备崩溃日志并分析
项目最近发布,部分用户在内侧使用,正好遇到一些问题,由于用户在其他城市,所以对于用户设备产生的崩溃日志,不好直接拿设备连接电脑. 对于这种情况,我们可以这样: 1.引导用户开启iOS设备设置-> ...
- [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息
因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...
- ios 底部用定位 fixed。在软件盘出来后,页面元素被顶上去一部分,fixed定位的footer也跑到了上面去。解决方法
ios 底部用定位 fixed.在软件盘出来后,页面元素被顶上去一部分,fixed定位的footer也跑到了上面去.解决方法 $("input").focus(function() ...
- iOS检测用户截屏并获取所截图片
iOS检测用户截屏并获取所截图片 微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好.在iOS7之前, 如果用户截屏 ...
- 微博API怎么爬取其它未授权用户的微博/怎么爬取指定用户公布的微博
获取某个用户最新发表的微博列表:http://open.weibo.com/wiki/2/statuses/user_timeline 原接口已经被封.很多人都在问怎么获取指定用户的微博,于是写这篇B ...
- oracle 创建用户,授权用户,创建表,查询表
原文:oracle 创建用户,授权用户,创建表,查询表 oracle 创建用户,授权用户,创建表,查询表 假设oracle10g所有的都已经安装和配置好 第一步:win+R,进入运行,cmd; 第二步 ...
随机推荐
- 集成Spring后HibernateTemplate实现分页
spring 整合 hibernate 时候用的 HibernateTemplate 不支持分页,因此需要自己包装一个类进行分页,具体实现如下...使用spring的hibernateTemplate ...
- opencv 2.4.9+pcl 1.6+vs2010+win7 32开发环境配置
最近在做图像方面的开发,需要对软件开发平台进行配置,我查找了关于这些方面的内容,由于软件版本很多,每个人的开发平台又不一样所以在对平台进行搭建过程中遇到了很多问题,下面我将我搭建平台的流程做一个记录. ...
- 【转】C#通过Expression获取指定属性的名称
原文:http://www.cnblogs.com/powerwu/articles/3393582.html 大家所熟悉的是通过对象属性来访问该属性的值,或是由字符串通过反射来获取属性,并取值.今天 ...
- GS玩家登录
玩家上线 这个过程看了很多很多次了,这里在看下 客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中 .客户端发送c2s_log ...
- linux 配置ssh免密码登录
1.确保主机名唯一 主机名修改方法: a.修改/etc/sysconfig/network,HOSTNAME=想要设置的主机名称 b.修改/etc/hosts,127.0.0.1 localhos ...
- 20+个可重复使用的jQuery代码片段
jQuery已经成为任何web项目的重要组成部分.它为网站提供了交互性的通过移动HTML元素,创建自定义动画,处理事件,选择DOM元素,检索整个document ,让最终用户有一个更好的体验. 在这篇 ...
- POJ 1548 Robots (Dilworth)
Robots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3621 Accepted: 1643 Description Yo ...
- HDOJ 1062 Text Reverse
Text Reverse Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- wifidog源码分析 - 初始化阶段
Wifidog是一个linux下开源的认证网关软件,它主要用于配合认证服务器实现无线路由器的认证放行功能. wifidog是一个后台的服务程序,可以通过wdctrl命令对wifidog主程序进行控制. ...
- C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...