iOS利用CoreLocation获取地理位置以及如何在模拟器进行调试
2014-06-12 09:47
696 查看
(推荐本人创建的一个iOS开源代码收集网站 Code4App)
LBS是移动应用的一个大热点。很多App都允许(或者说要求)获取用户的地理位置。这篇文章将简要谈谈如何利用CoreLocation来获取地理位置,并且会涉及到如何在iPhone的模拟器进行调试。
要利用CoreLocation,必须在frameworks里面加入“CoreLocation.framework”。在最新版本的Xcode(4.x)中加入新的framework步骤如下:
单击项目的target =>在出来的xcodeproj面板中点击“Link Binary With Libraries” =>点击“+”,然后选择需要的framework即可。
加入“CoreLocation.framework”之后,就可以在类中import <CoreLocation/CoreLocation.h>,这样就可以使用所有与CoreLocation相关的类了。
下面开始在项目里面实现获取当前地理位置:
第一步:
先在类中定义两个成员变量:
[plain] view
plaincopy
CLLocationManager *locationManager;
CLLocation *checkinLocation;
这两个变量,locationManaager用于获取位置,checkinLocation用于保存获取到的位置信息。
第二步:
在类中实现CLLocationManagerDelegate,并实现以下方法:
[plain] view
plaincopy
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
checkinLocation = newLocation;
//do something else
}
从代码可以看到,运行到这个方法的时候,locationManager已经得到了当前的位置,所以在这个方法中应该把获取到的当前位置保存到变量checkinLocation中。
第三步:
在第二步实现的方法其实是被CLLocationManager中的方法startUpdatingLocation调用的,也就是说,当程序运行 locationManager.startUpdatingLocation的时候,第二步实现的方法就会被调用。
假设点击按钮checkIn的时候,程序会获取当前位置,那么就需要在这个checkIn按钮对应的动作方法(假设是方法名就叫做checkIn)中调用locationManager.startUpdatingLocation。具体如下:
[plain] view
plaincopy
- (void) setupLocationManager {
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
if ([CLLocationManager locationServicesEnabled]) {
NSLog( @"Starting CLLocationManager" );
self.locationManager.delegate = self;
self.locationManager.distanceFilter = 200;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.locationManager startUpdatingLocation];
} else {
NSLog( @"Cannot Starting CLLocationManager" );
/*self.locationManager.delegate = self;
self.locationManager.distanceFilter = 200;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.locationManager startUpdatingLocation];*/
}
}
在上面的代码中,程序首先判断机器(iPhone/iPad)是不是开启了地理位置的服务(locationServicesEnabled)。如果开启了,那么就开始进行定位([self.locationManager startUpdatingLocation];)。在定位之前要设置一些有关位置的属性,比如distanceFilter,desiredAccuacy等等。至于这些属性有什么用,可以查看xcode的文档,这里就不在赘述。值得注意的是,一定要设置locationManager的delegate是类本身,这样startUpdatingLocation运行的时候才会调用第二步实现的方法。
如果机器没有开启地理位置的服务,那么就不需要做多余的动作。注意到上面代码中有一部分代码被注释掉了,这部分代码这是为了能够在模拟器中调试程序。
下面谈谈如何在模拟器中调试获取当前地理位置的程序。
如果程序在真机中调试,只要真机开启了定位功能(GPS或者无线定位),那么就可以调试成功的。但是如果在模拟器中调试,就要做点额外功夫。由于在模拟器中是无法开启地理位置的服务(locationServicesEnabled总是等于false),所以需要将当前位置(或者任意位置)hardcode进程序当中,以便调试。
将下面的代码添加进类中(实现了获取当前位置的代码所在的类文件),添加的位置在import代码段的后面:
[plain] view
plaincopy
@implementation CLLocationManager (TemporaryHack)
- (void)hackLocationFix
{
//CLLocation *location = [[CLLocation alloc] initWithLatitude:42 longitude:-50];
float latitude = 26.876812;
float longitude = 100.22569199999998; //这里可以是任意的经纬度值
CLLocation *location= [[[CLLocation alloc] initWithLatitude:latitude longitude:longitude] autorelease];
[[self delegate] locationManager:self didUpdateToLocation:location fromLocation:nil];
}
- (void)startUpdatingLocation
{
[self performSelector:@selector(hackLocationFix) withObject:nil afterDelay:0.1];
}
@end
添加完这段代码之后,同时将第三步实现的方法中被注释掉的代码恢复,也就是即使locationServicesEnabled等于false也调用startUpdatingLocation方法,这样程序就可以在模拟器中正常运行了。但是注意的是,这时候获取的当前位置就是是上面代码中你自己所设定的经纬度值。
整个过程都十分简单,因为大部分工作都被封装起来了。
获得当前位置之后,就可以在地图上显示,下篇文章将会谈谈如何用地图显示地理信息,包括自定义Annotation。
http://blog.csdn.net/whaomian/article/details/6807739
LBS是移动应用的一个大热点。很多App都允许(或者说要求)获取用户的地理位置。这篇文章将简要谈谈如何利用CoreLocation来获取地理位置,并且会涉及到如何在iPhone的模拟器进行调试。
要利用CoreLocation,必须在frameworks里面加入“CoreLocation.framework”。在最新版本的Xcode(4.x)中加入新的framework步骤如下:
单击项目的target =>在出来的xcodeproj面板中点击“Link Binary With Libraries” =>点击“+”,然后选择需要的framework即可。
加入“CoreLocation.framework”之后,就可以在类中import <CoreLocation/CoreLocation.h>,这样就可以使用所有与CoreLocation相关的类了。
下面开始在项目里面实现获取当前地理位置:
第一步:
先在类中定义两个成员变量:
[plain] view
plaincopy
CLLocationManager *locationManager;
CLLocation *checkinLocation;
这两个变量,locationManaager用于获取位置,checkinLocation用于保存获取到的位置信息。
第二步:
在类中实现CLLocationManagerDelegate,并实现以下方法:
[plain] view
plaincopy
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
checkinLocation = newLocation;
//do something else
}
从代码可以看到,运行到这个方法的时候,locationManager已经得到了当前的位置,所以在这个方法中应该把获取到的当前位置保存到变量checkinLocation中。
第三步:
在第二步实现的方法其实是被CLLocationManager中的方法startUpdatingLocation调用的,也就是说,当程序运行 locationManager.startUpdatingLocation的时候,第二步实现的方法就会被调用。
假设点击按钮checkIn的时候,程序会获取当前位置,那么就需要在这个checkIn按钮对应的动作方法(假设是方法名就叫做checkIn)中调用locationManager.startUpdatingLocation。具体如下:
[plain] view
plaincopy
- (void) setupLocationManager {
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
if ([CLLocationManager locationServicesEnabled]) {
NSLog( @"Starting CLLocationManager" );
self.locationManager.delegate = self;
self.locationManager.distanceFilter = 200;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.locationManager startUpdatingLocation];
} else {
NSLog( @"Cannot Starting CLLocationManager" );
/*self.locationManager.delegate = self;
self.locationManager.distanceFilter = 200;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.locationManager startUpdatingLocation];*/
}
}
在上面的代码中,程序首先判断机器(iPhone/iPad)是不是开启了地理位置的服务(locationServicesEnabled)。如果开启了,那么就开始进行定位([self.locationManager startUpdatingLocation];)。在定位之前要设置一些有关位置的属性,比如distanceFilter,desiredAccuacy等等。至于这些属性有什么用,可以查看xcode的文档,这里就不在赘述。值得注意的是,一定要设置locationManager的delegate是类本身,这样startUpdatingLocation运行的时候才会调用第二步实现的方法。
如果机器没有开启地理位置的服务,那么就不需要做多余的动作。注意到上面代码中有一部分代码被注释掉了,这部分代码这是为了能够在模拟器中调试程序。
下面谈谈如何在模拟器中调试获取当前地理位置的程序。
如果程序在真机中调试,只要真机开启了定位功能(GPS或者无线定位),那么就可以调试成功的。但是如果在模拟器中调试,就要做点额外功夫。由于在模拟器中是无法开启地理位置的服务(locationServicesEnabled总是等于false),所以需要将当前位置(或者任意位置)hardcode进程序当中,以便调试。
将下面的代码添加进类中(实现了获取当前位置的代码所在的类文件),添加的位置在import代码段的后面:
[plain] view
plaincopy
@implementation CLLocationManager (TemporaryHack)
- (void)hackLocationFix
{
//CLLocation *location = [[CLLocation alloc] initWithLatitude:42 longitude:-50];
float latitude = 26.876812;
float longitude = 100.22569199999998; //这里可以是任意的经纬度值
CLLocation *location= [[[CLLocation alloc] initWithLatitude:latitude longitude:longitude] autorelease];
[[self delegate] locationManager:self didUpdateToLocation:location fromLocation:nil];
}
- (void)startUpdatingLocation
{
[self performSelector:@selector(hackLocationFix) withObject:nil afterDelay:0.1];
}
@end
添加完这段代码之后,同时将第三步实现的方法中被注释掉的代码恢复,也就是即使locationServicesEnabled等于false也调用startUpdatingLocation方法,这样程序就可以在模拟器中正常运行了。但是注意的是,这时候获取的当前位置就是是上面代码中你自己所设定的经纬度值。
整个过程都十分简单,因为大部分工作都被封装起来了。
获得当前位置之后,就可以在地图上显示,下篇文章将会谈谈如何用地图显示地理信息,包括自定义Annotation。
http://blog.csdn.net/whaomian/article/details/6807739
相关文章推荐
- iOS利用CoreLocation获取地理位置以及如何在模拟器进行调试
- iOS利用CoreLocation获取地理位置以及如何在模拟器进行调试
- iOS利用CoreLocation获取地理位置以及如何在模拟器进行调试
- Core Location Manager Changes in iOS 8(iOS8获取不到地理位置)
- IOS模拟器能获取运营商信息,网络连接类型以及地理位置吗?
- IOS模拟器能获取运营商信息,网络连接类型以及地理位置吗?
- iOS CoreLocation框架第三章—— CLGeocoder(地理编码器)和CLPlacemark(获取位置信息)
- iOS学习——如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒
- ios 利用自带的CoreLocation.framework 实现获取手机当前处于的精度和纬度 并计算两点之间的间距(特别使用于团购,附近商户之类的项目)
- iOS中利用系统地图获取定位信息(经纬度/地理位置)
- 50天iOS挑战(Swift) - 第3天:简单利用CoreLocation获取当前地址
- Android 使用GPRS获取手机地理位置 以及 Location 获取为空的解决办法
- iOS获取当前设备的型号、分辨率、运营商以及地理位置
- iOS定位-利用CoreLocation.framework获取当前城市
- 使用Google Geocoding API来进行关键字搜索,获取相关的地理位置信息
- 如何利用 WinDbg 进行双机调试
- CoreLocation获取当前位置信息
- 如何设置android模拟器的地理位置
- 如何利用IE进行JavaScript脚本调试
- 如何解决iOS模拟器调试时不能出现iPad/iPhone Simulator