一般说来LBS功能一般分为两块;一块是地理定位,就是获取当前精度、纬度和地理位置的功能,这一部分功能主要用到CoreLocation.Frameworks。一部分就是显示地图信息、丰富地图内容等,这一部分主要用到MapKit.Frameworks。以上这几个功能的测试最好都要在真机上进行。模拟器上定位一般会在Apple的加州总部。
首先介绍CoreLocation。先说主要功能吧。
第一个功能,也是最基本的功能是获取经度纬度。
折腾了一早上原来是赋值的姿势不对,挫败感真心强烈啊。
好了言归正传,在IOS上获取经度纬度相当简单。
 添加CoreLocation.Frameworks,并将其头文件放在需要引用的类的头文件中。创建一个CLLocationManager对象。为当前CLLocationManager对象设置代理。设置其他基本属性如下:
// 设置寻址经度
self.locManager.desiredAccuracy = kCLLocationAccuracyBest;
 
self.locManager.distanceFilter = 5.0;
然后调用 - (void)startUpdatingLocation;方法,开始更新当前坐标位置。
这样前期的准备工作就完成了。
然后就是要完成代理方法了。
如果只是要实现获取当前经纬度的功能,只要实现以下两个代理就好了。
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
    fromLocation:(CLLocation *)oldLocation;
 
- (void)locationManager:(CLLocationManager *)manager
    didFailWithError:(NSError *)error;
 
第二个代理是在寻址失败的时候调用的。筒子们在里面做相应的处理就好了。
我们主要说说第一个代理。第一个代理方法传递给我们三个参数,manager,newLocation和oldLocation。如果只是定位的话,只要关心newLocation这个就好了。
我们要的经度维度放在什么地方呢?
CLLocation有一个属性叫做@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;我们要的信息就存放在这里了。
typedef struct {
    CLLocationDegrees latitude;
    CLLocationDegrees longitude;
} CLLocationCoordinate2D;
CLLocationDegrees其实是double类型的,大家将其文字化即可。
 
注意:。第一次使用定位功能时使用startUpdatingLocation这个方法就好了。系统会自动弹出请用户授权使用的弹窗。在第二次使用时,判断用户是否打开定位功能使用+ (BOOL)locationServicesEnabled方法,以确定不会产生错误。在请求结束或者要进行第二次请求之前,请调用stopUpdatingLocation,以停止上一次请求。
以下附上实现代码:
// 初始化并开始更新
 
    self.locManager = [[CLLocationManager alloc] init];
    self.locManager.delegate = self;
    self.locManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locManager.distanceFilter = 5.0;
    [self.locManager startUpdatingLocation];
 
// 代理方法实现
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    DebugLog(@"%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    DebugLog(@"%@",error);
}
 
 
获取当前所在地的地理位置信息需要使用一个新的类,MKReverseGeocoder。这个类在MapKit.framework中。我们把框架加进来,并将头文件导入就可以用了。
敲了一会代码,结果发现这个类iOS5.0就不用了。真是的。为了照顾兼容性,我们先研究MKReverseGeocoder,等下再来研究这个新类,恩,名字叫做CLGeocoder,恩,没拼错。在CoreLocation里面。
 
MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:currentCoordinate2D];
      geocoder.delegate = self;
[geocoder start];
调用以上代码后呢,会自动调用反向地址编码的API。我们这边使用代理来接收。至于代理方法么,我们要实现两个。
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error{
}
第一个方法是获取反向编码的。第二个是当反向编码失败时,处理错误使用的。
我们主要讨论第一个方法。
placemark(MKPlacemark类的对象)其实是geocoder(MKReverseGeocoder类的对象)的一个属性。从geocoder里面取placemark这个和直接取placemark这个其实区别不大。而我们需要的信息主要就在这个里面了。
// 这个字典存放基础数据
@property (nonatomic, readonly) NSDictionary *addressDictionary;
让我们试试看,能从这个字典里面倒出来些什么东西。
以下是我用这个addressDictionary属性倒出来的字典。我们分析看看。
{
    City = "\U897f\U5b89\U5e02";// 城市名字
    Country = "\U4e2d\U56fd";// 国家名字
    CountryCode = CN;// 国家编码
    FormattedAddressLines =     (
        "\U4e2d\U56fd",
        "\U9655\U897f\U7701\U897f\U5b89\U5e02\U96c1\U5854\U533a",
        "\U9ad8\U65b0\U516d\U8def34\U53f7"
    ); // 这个应该是格式化后的地址了
    State = "\U9655\U897f\U7701"; // 省
    Street = "\U9ad8\U65b0\U516d\U8def 34\U53f7";// 街道完整名称
    SubLocality = "\U96c1\U5854\U533a";//区名
    SubThoroughfare = "34\U53f7";//具体地址
    Thoroughfare = "\U9ad8\U65b0\U516d\U8def";//街道名称
}
 
注意:上面的这个字典是可以直接转化为联系人的字典的,通过这个ABCreateStringWithAddressDictionary属性。
 
以下是placemark的其他属性。大家可以随意取用。
// address dictionary properties
@property (nonatomic, readonly) NSString *name; // eg. Apple Inc.
@property (nonatomic, readonly) NSString *thoroughfare; // street address, eg. 1 Infinite Loop
@property (nonatomic, readonly) NSString *subThoroughfare; // eg. 1
@property (nonatomic, readonly) NSString *locality; // city, eg. Cupertino
@property (nonatomic, readonly) NSString *subLocality; // neighborhood, common name, eg. Mission District
@property (nonatomic, readonly) NSString *administrativeArea; // state, eg. CA
@property (nonatomic, readonly) NSString *subAdministrativeArea; // county, eg. Santa Clara
@property (nonatomic, readonly) NSString *postalCode; // zip code, eg. 95014
@property (nonatomic, readonly) NSString *ISOcountryCode; // eg. US
@property (nonatomic, readonly) NSString *country; // eg. United States
@property (nonatomic, readonly) NSString *inlandWater; // eg. Lake Tahoe
@property (nonatomic, readonly) NSString *ocean; // eg. Pacific Ocean
@property (nonatomic, readonly) NSArray *areasOfInterest; // eg. Golden Gate Park
 
注意:我在使用的过程中发现,如果网络假死,则有可能较长时间无法获得逆向的结果。这一点可能需要大家注意。
 
IOS5下不推荐使用我上面讲的一大堆。我们需要用这个CLGeocoder类。
使用方法也很简单。参照如下步骤:
首先创建一个CLGeocoder对象,然后调用他的- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;方法。按照需要的参数类型传参。有的筒子会问这个CLGeocodeCompletionHandler东西怎么写?这个其实是IOS4之后就被官方大力推荐使用的BLOCK,不会用的同学快去看文档吧。
CLGeocodeCompletionHandler的定义就是这样的。typedef void(^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error); 我们只要写好一个block对象传进去就好了。
 
以下是使用CLGeocoder的参考代码。不用代理了是不是很开心呢?
    CLGeocoder* geocoder = [[CLGeocoder alloc] init];
   
    [geocoder reverseGeocodeLocation:newLocation completionHandler:
     ^(NSArray* placemarks, NSError* error){
         NSLog(@"%@",placemarks);
     }];
表示定位部分的内容就介绍到这里,至于什么正向编码,什么前面提到的速率,距离之类的,大家参看文档就好了。勤看文档的筒子才是好筒子嘛。、
 
 
iOS开发中,若想获得当前位置,只需以下几步:
    首先,将CoreLocation framework导入到工程当中并且引用
 
[plain] view plaincopy
#import   
 
   然后,声明实现代理方法,
 
[plain] view plaincopy
@interface LocationManager : NSObject e>   
    然后,开始更新位置信息: 
 
[plain] view plaincopy
locationManager = [[CLLocationManager alloc] init];  
locationManager.delegate = self;   
locationManager.desiredAccuracy = kCLLocationAccuracyBest;   
locationManager.distanceFilter = kCLDistanceFilterNone;   
[locationManager startUpdatingLocation];    
    locationManager需要定义为私有或者属性变量。每次位置更新后,将调用CLLocationManagerDelegate的- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation方法,方法中的newLocation即是当前位置。
    获得位置后,如果想获得当前位置的地理信息,需要用到CLGeocoder(MKReverseGeocoder已经过时)。
 
[plain] view plaincopy
CLGeocoder *geocoder = [[CLGeocoder alloc] init];  
[geocoder reverseGeocodeLocation: newLocation completionHandler:^(NSArray *array, NSError *error) {  
      if (array.count > 0) {  
          CLPlacemark *placemark = [array objectAtIndex:0];  
         NSString *country = placemark.ISOcountryCode;  
          NSString *city = placemark.locality;  
      }  
}];  
    placemark包含了newLocation的地理信息。

iOS 获取当前经纬度的更多相关文章

  1. iOS获取设备唯一标识的8种方法

    8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...

  2. iOS 获取文件的目录路径的几种方法 [转]

    iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. d ...

  3. iOS获取设备型号、装置类型等信息

    iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...

  4. Swift3.0 iOS获取当前时间 - 年月日时分秒星期

    Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...

  5. IOS 获取最新设备型号方法

    1.IOS 获取最新设备型号方法列表最新对照表:http://theiphonewiki.com/wiki/Models方法: #import "sys/utsname.h” struct ...

  6. ios 获取通讯录的所有信息

    iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...

  7. iOS获取汉字的拼音

    在iOS开发中经常涉及到汉字的排序,最常见的就是需要根据首字母的字符顺序排列,比如常见的通讯录等.总结出来,大致可以分为两种方法,其中参考文献[1]中提供的方法十分复杂,利用查表的方法是先,并且代码量 ...

  8. IOS获取物理尺寸中7Plus中获取的是7的物理尺寸

    IOS获取物理尺寸中7Plus中获取的是7的物理尺寸: 在开发调试过程中我的7Plus手机获取[uiscreen mainscreen].bounds为750  .1334. 解决方案:在手机中的显示 ...

  9. iOS: 获取文件路径

    iOS: 获取文件路径   // 例如 - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectories ...

随机推荐

  1. MySQL 主主同步

    双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换到 ...

  2. Linux再谈互斥锁与条件变量

    原文地址:http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait总和一个互斥锁结合使用.在调用pthread_ ...

  3. HDU 3874 Necklace 树状数组

    题意:求区间内不同的数的和 离线处理,按查询右端点从小到大排序,从左往右扫一遍. 记录每个数出现的上一个位置,如果该数之前没有出现过,就加上,否则就在上一个位置减去. #include <cst ...

  4. 用Linkedhashmap的LRU特性及SoftReference软引用构建二级缓存

    LRU: least recently used(近期最少使用算法).LinkedHashMap构造函数可以指定其迭代顺序:LinkedHashMap(int initialCapacity, flo ...

  5. Android记事本07

    昨天: activity横竖屏切换的生命周期 今天: Anr异常的原因和解决方案 遇到的问题: 无.

  6. SheetJS & Error: Sheet names cannot exceed 31 chars

    SheetJS Error: Sheet names cannot exceed 31 chars title + version https://github.com/SheetJS/js-xlsx ...

  7. 内存检测工具valgrind

    valgrind --tool=memcheck --leak-check=full --error-limit=no  --trace-children=yes  ./server valgrind ...

  8. 滚动数组要来回赋初值呀。。orzzzzzzzzzzzzzzzzzzzzzzzzzz

    2个小时的人参orzzzzzzzzzzzzzzz ……~(-o ̄▽ ̄)-o ...……o-(_△_o-) ~...……~(-o ̄▽ ̄)-o ...……o-(_△_o-) ~... ……~(-o ̄▽ ̄) ...

  9. msvs命令行编译lua5.3.4

    msvs命令行编译lua5.3.4 vslua.bat @echo off md bin md lib md include cd src cl /c /nologo /W3 /O2 /Ob1 /Oi ...

  10. Unity Shader-GodRay,体积光(BillBoard,Volume Shadow,Raidal Blur,Ray-Marching)

    好久没有更新博客了,经历了不少事情,好在最近回归了一点正轨,决定继续Unity Shader的学习之路.作为回归的第一篇,来玩一个比较酷炫的效果(当然废话也比较多),一般称之为GodRay(圣光),也 ...