zoukankan      html  css  js  c++  java
  • 获取用户详细的位置信息

    这里是用iOS自带框架CoreLocation来实现定位功能的


    使用方法:

    1.首先,我们需要在工程中导入CoreLocation系统框架。然后在我们的控制器中引入头文件。

    #import <CoreLocation/CoreLocation.h>

    2.然后,声明一个CLLocationManager对象作为成员变量,用于定位获取经纬度坐标,并遵守协议CLLocationManager的协议。

    @interface TYViewController () <CLLocationManagerDelegate> {
        CLLocationManager *_locationManager;
    }

    3.实现其中的代理方法。

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
      //将经度显示到label上
      self.longitude.text = [NSString stringWithFormat:@"%lf", newLocation.coordinate.longitude];
      //将纬度现实到label上
      self.latitude.text = [NSString stringWithFormat:@"%lf", newLocation.coordinate.latitude];
      // 获取当前所在的城市名
      CLGeocoder *geocoder = [[CLGeocoder alloc] init];
      //根据经纬度反向地理编译出地址信息
      [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error){
         if (array.count > 0){
           CLPlacemark *placemark = [array objectAtIndex:0];
           //将获得的所有信息显示到label上
           self.location.text = placemark.name;
           //获取城市
           NSString *city = placemark.locality;
           if (!city) {
             //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
             city = placemark.administrativeArea;
           }
           NSLog(@"city = %@", city);
           _cityLable.text = city;
           [_cityButton setTitle:city forState:UIControlStateNormal];
         }
         else if (error == nil && [array count] == 0)
         {
           NSLog(@"No results were returned.");
         }
         else if (error != nil)
         {
           NSLog(@"An error occurred = %@", error);
         }
       }];
      //系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新
      [manager stopUpdatingLocation];
    }

    4. 最后在viewDidLoad中初始化定位管理器。

    - (void)viewDidLoad
    {
      [super viewDidLoad];
      [self initializeLocationService];
      // Do any additional setup after loading the view.
    }
    - (void)initializeLocationService {
      // 初始化定位管理器
      _locationManager = [[CLLocationManager alloc] init];
      // 设置代理
      _locationManager.delegate = self;
      // 设置定位精确度到米
      _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
      // 设置过滤器为无
      _locationManager.distanceFilter = kCLDistanceFilterNone;
      // 开始定位
      [_locationManager startUpdatingLocation];
    }

    接下来编译并运行程序,手动在iOS模拟器上配置定位坐标,即可打印出该经纬度坐标对应的城市名(真机可直接打印出当前城市名)。

    CLPlacemark类中封装了很多的地理信息属性,包括完整的地址(大到国家,小到街道)和地理名称等等,可以酌情使用。

    PS:如果定位出的街道信息为英文,那请先处理本地化,同时模拟器调整语言为中文。

     

    需要注意的是在iOS8 及以上系统上需要配置plist参数和使用权限:

    1. 工程的plist文件里面添加两个字段:NSLocationAlwaysUsageDescription,NSLocationWhenInUseUsageDescription,type类型均为string,值可以根据你的需要填写(也可以不填),填写的内容会展示在APP提示用户是否允许定位的alert内容里面,具体效果可以自行测试,这里就不额外截图。

    2. 调用定位方法之前需要额外调用一个函数,即设置定位权限问题,直接在上面iOS7初始化定位服务的方法里面修改即可

    // 取得定位权限,有两个方法,取决于你的定位使用情况
    // 一个是requestAlwaysAuthorization(一直开启定位功能),一个是requestWhenInUseAuthorization(只有当用户使用时才开启定位功能)
    具体如下:
     

    具体如下:

    - (void)initializeLocationService {
    // 初始化定位管理器
    _locationManager = [[CLLocationManager alloc] init];
    // 设置代理
    _locationManager.delegate = self;
    // 设置定位精确度到米
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    // 设置过滤器为无
    _locationManager.distanceFilter = kCLDistanceFilterNone;
    // 开始定位
    // 取得定位权限,有两个方法,取决于你的定位使用情况
    // 一个是requestAlwaysAuthorization,一个是requestWhenInUseAuthorization
    [_locationManager requestAlwaysAuthorization];//这句话ios8以上版本使用。
    [_locationManager startUpdatingLocation];
    }
     

    参考资料

  • 相关阅读:
    php configure help
    ubuntu下编译安装PHP
    【转】Ubuntu编译安装mysql源码
    Java 处理异常 9 个最佳实践,你知道几个?
    HashMap工作原理
    LinkedList
    SpringMVC常用注解@Controller,@Service,@repository,@Component
    HTML5 APP应用实现图片上传及拍照上传功能
    bootstrap-datepicker 与bootstrapValidator同时使用时,选择日期后,无法正常触发校验
    js
  • 原文地址:https://www.cnblogs.com/gaoxiaoniu/p/5630385.html
Copyright © 2011-2022 走看看