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; 第二步 ...
随机推荐
- Java学习笔记--反射
什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...
- mysql开机脚本
#!/bin/bash basedir=/home/app/db/mysql datadir=$basedir/data conf=$basedir/etc/my.cnf pid_file=$data ...
- 【Convert Sorted Array to Binary Search Tree】cpp
题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...
- JavaScript对象进阶
要了解JavaScript对象,我们可以从对象创建.属性操作.对象方法这几个方面入手.概括起来,包括以下几模块: 1.创建对象 1.1 对象直接量 对象直接量是创建对象最简单的方式,由若干名/值对组成 ...
- 【BZOJ】【3522】【POI2014】Hotel
暴力/树形DP 要求在树上找出等距三点,求方案数,那么用类似Free Tour2那样的合并方法,可以写出: f[i][j]表示以 i 为根的子树中,距离 i 为 j 的点有多少个: g[i][j]表示 ...
- 在eclipse中配置maven
http://pansanday.blog.163.com/blog/static/381662802012727103454743/ 从eclipse 3.6开始,eclipse有一个marketp ...
- if in hlsl
seems that in HLSL_4, we can use if https://msdn.microsoft.com/en-us/library/bb313972(v=xnagamestudi ...
- 女性社区TOP10
“女性和孩子的钱是世界上最好赚的”并不是一句空话.据统计,女性掌管着家庭70%的支出,如果你能让女性为你掏出腰包,那么你基本就掌控了一个家庭的大部分的消费. 有趣的是,女性还是一个喜欢分享的群体,他们 ...
- 15万甚至30万以内的SUV值不值得买?
大家好,这个帖子比较长,也是我一直以来长期实践.思考.验证的结论,不当之处还请指正,也欢迎大家来共 同讨论,已经买了此价位SUV的战友们,看完后也不要生气,毕竟我的出发点是注重行车安全,人非神明,是个 ...
- .NET设计模式(13):享元模式(Flyweight Pattern)(转)
摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面 ...