码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发 -- 实现简单的定位功能

时间:2015-10-15 21:49:37      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

一、定位的说明

现在的应用很多都拥有定位功能。确实,定位功能是很好用的,对我们的生活也有很大的帮助。例如帮你找酒店,找银行等等。。。

要实现定位有三种方式:

   1. 手机基站:(依赖于手机机战(信号塔)的密集程度)
   2. GPS:卫星定位,精确度高,但是费电
     3. WIFI:根据上网的IP地址,(必须要能上网)

而我们开发中一般都是用GPS定位比较多,我们要实现定位需要用到CoreLocation框架,CoreLocation中主要包含了定位、地理编码(包括反编码)功能。

在iOS8.0以后要实现定位还需要往Info.plist文件添加两个键值对NSLocationAlwaysUsageDescription和NSLocationWhenInUsageDescription,分别代表着“允许应用程序在您并未使用该应用程序时访问您的位置吗?“、“允许应用程序在您使用该应用程序时访问您的位置吗?”

二、实现定位功能:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>

// 位置管理者
@property (nonatomic, strong) CLLocationManager *manager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self location];
}

- (CLLocationManager *)manager{
    if (!_manager) {
        _manager = [[CLLocationManager alloc] init];
    }
    return _manager;
}

#pragma mark --定位
- (void)location{
    
    // 1. 创建位置管理者
    self.manager = [[CLLocationManager alloc] init];
    // 判断当前的系统版本号
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        // 向用户请求我们的程序使用位置
        [self.manager requestAlwaysAuthorization];
        [self.manager requestWhenInUseAuthorization];
    }
    
    // 设置定位的更新距离(10m更新一次)实质就是让代理方法重新走一次
    self.manager.distanceFilter = 10.0f;
    
    // 设置代理
    self.manager.delegate = self;
    
    // 开启定位功能
    [self.manager startUpdatingLocation];
    // 开启手机朝向的功能
    [self.manager startUpdatingHeading];
    
    NSLog(@"%@",self.manager.location);
    
}

#pragma mark --更新手机位置信息
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
//    NSLog(@"locations = %@",locations);
    // 获得当前的最新的位置
    CLLocation *location = (CLLocation *)[locations lastObject];
    double lat = location.coordinate.latitude;
    double lon = location.coordinate.longitude;
    NSLog(@"lat = %f,lon = %f",lat,lon);
    
    // 使用位置反编码解析位置信息
    // 创建一个位置反编码的对象
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    // 使用该对象获得位置信息
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        // 遍历解析出来的位置信息
        for (CLPlacemark *placeMark in placemarks) {
            // 名字
            NSLog(@"name = %@",placeMark.name);
            // 街道
            NSLog(@"thoroughfare = %@",placeMark.thoroughfare);
            // 子街道
            NSLog(@"subThoroughfare = %@",placeMark.subThoroughfare);
        }
    }];
    //根据地址获得坐标的方法
    [geocoder geocodeAddressString:@"广州" completionHandler:^(NSArray *placemarks, NSError *error) {
        //取得第一个地标,地标中存储了详细的地址信息,注意:一个地名可能搜索出多个地址
        CLPlacemark *placemark=[placemarks lastObject];
        
        CLLocation *location=placemark.location;//位置
        CLRegion *region=placemark.region;//区域
        NSDictionary *addressDic= placemark.addressDictionary;//详细地址信息字典,包含以下部分信息
        //        NSString *name=placemark.name;//地名
        //        NSString *thoroughfare=placemark.thoroughfare;//街道
        //        NSString *subThoroughfare=placemark.subThoroughfare; //街道相关信息,例如门牌等
        //        NSString *locality=placemark.locality; // 城市
        //        NSString *subLocality=placemark.subLocality; // 城市相关信息,例如标志性建筑
        //        NSString *administrativeArea=placemark.administrativeArea; ////        NSString *subAdministrativeArea=placemark.subAdministrativeArea; //其他行政区域信息
        //        NSString *postalCode=placemark.postalCode; //邮编
        //        NSString *ISOcountryCode=placemark.ISOcountryCode; //国家编码
        //        NSString *country=placemark.country; //国家
        //        NSString *inlandWater=placemark.inlandWater; //水源、湖泊
        //        NSString *ocean=placemark.ocean; // 海洋
        //        NSArray *areasOfInterest=placemark.areasOfInterest; //关联的或利益相关的地标
        NSLog(@"位置:%@,区域:%@,详细信息:%@",location,region,addressDic);
    }];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    // 停止定位更新
    [self.manager stopUpdatingLocation];
}

#pragma mark --更新手机朝向
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
    // 获得手机里面的磁力计和地磁北极之间的夹角
    int header = newHeading.magneticHeading;
    
    if ((header > 315 && header < 360) && (header >= 0 && header <= 45)) {
        NSLog(@"你现在的手机朝向是北面");
    }
    else if (header > 45 && header <= 135){
        NSLog(@"你现在的手机朝向是东面");
    }
    else if (header > 135 && header < 225){
        NSLog(@"你现在的手机朝向是南面");
    }
    else{
        NSLog(@"你现在的手机朝向是西面");
    }
}

 

注意:

1.定位频率和定位精度并不应当越精确越好,需要视实际情况而定,因为越精确越耗性能,也就越费电。

2.定位成功后会根据设置情况频繁调用-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations方法,这个方法返回一组地理位置对象数组,每个元素一个CLLocation代表地理位置信息(包含经度、纬度、海报、行走速度等信息),之所以返回数组是因为有些时候一个位置点可能包含多个位置。

3.使用完定位服务后如果不需要实时监控应该立即关闭定位服务以节省资源。

4.除了提供定位功能,CLLocationManager还可以调用startMonitoringForRegion:方法对指定区域进行监控。

 

 

iOS开发 -- 实现简单的定位功能

标签:

原文地址:http://www.cnblogs.com/ilyy/p/4883511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!