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; 第二步 ...
随机推荐
- iframe 传值问题
当一个页面中插入了iframe或者由不同的框架组成(fieldset)时,这种情况下,需要处理的业务逻辑比较常见的就是数据进行交互了 1.页面中插入了iframe情况 由于页面中插入了iframe,那 ...
- VMM学习-vmm_log
功能类似verilog里的$display函数,在vmm里做了强化,可以在仿真过程中看到整个平台的运行信息,用来调试仿真平台. 函数原型在vmm.sv里(class vmm_log;),其构造函数为e ...
- Hibernate中启用日志
Problem How do you determine what SQL query is being executed by Hibernate? How can you see the Hibe ...
- web开发--文档下载
GOOGLE在线文档下载地址分享(GOOGLE的文档地址暂不能用了,会放在其它位置..) GOOGLE的在线文档功能好象挂掉了...等找个其它存放的位置把这些文档再上传上去... 存在GOOGLE里面 ...
- openstack与VMware workStation的区别
免责声明: 本文中使用的部分图片来自于网络,如有侵权,请联系博主进行删除 最近一直在研究云计算,恰好有个同事问了我一个问题:你们研究的openstack到底是什么东西?跟VMware Work ...
- 【CentOS】Eclipse中svn插件使用
目录: 1.安装 2.使用 3.错误 1.安装 svn插件地址: Subclipse 1.6.x Update Site - http://subclipse.tigris.org/update_1. ...
- 使用CSS时间打点的Loading效果的教程
基于box-shadow实现的打点效果 理论上,box-shadow可以实现任意的图形效果,自然我们可以利用box-shadow生成我们的点效果,然后通过animation控制不同时间点点的数目就可以 ...
- 7件你不知道但可以用CSS做的事
不管你信不信,CSS和JavaScript开始重叠,就像CSS增加了更多功能一新.在我写“你可能不知道的CSS和JavaScript互相影响的5种方式”一文时,人们对于JavaScript和CSS是如 ...
- HDU 1671 Phone List(字符处理)
题目 用字典树可以过,可是我写的字典树一直各种错误,,, 所以,我用了别的更简便的方法.. //去你妹的一直有问题的字典树!!! ////字典树,树的根是空的 // ////#include<i ...
- String Reduction
问题出自这里 问题描述: Given a string consisting of a,b and c's, we can perform the following operation: Take ...