http://blog.csdn.net/pinklpig/article/details/7191347
http://blog.csdn.net/pinklpig/article/details/7191199
升级xcode6以后打开以前xcode5工程,程序不能定位。工程升级到xcode6编译时需要iOS8 要自己写授权,不然没权限定位。
解决方法:
首先在 info.plist里加入对应的缺省字段 ,值设置为YES(前台定位写上边字段,前后台定位写下边字段)
NSLocationWhenInUseUsageDescription //允许在前台获取GPS的描述
NSLocationAlwaysUsageDescription //允许在前、后台获取GPS的描述
后方附图
先上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface
ViewController ()<CLLocationManagerDelegate>
@property
(
nonatomic
, strong) CLLocationManager *locationManager;
@end
@implementation
ViewController
// 1. 懒加载初始化:
- (CLLocationManager *)locationManager{
if
(!_locationManager){
self
.locationManager = [[CLLocationManager alloc] init];
self
.locationManager.delegate =
self
;
}
return
_locationManager;
}
- (
void
)viewDidLoad {
[
super
viewDidLoad];
// 2. 调用请求:
if
([[[UIDevice currentDevice] systemVersion] doubleValue] > 8.0)
{
//设置定位权限 仅ios8有意义
[
self
.locationManager requestWhenInUseAuthorization];
// 前台定位
// [locationManager requestAlwaysAuthorization];// 前后台同时定位
}
[
self
.locationManager startUpdatingLocation];
}
// 3.代理方法
- (
void
)locationManager:(CLLocationManager *)manager didUpdateLocations:(
NSArray
*)locations{
NSLog
(@
"%ld"
,locations.count);
}
@end
|
![](http://cdn.cocimg.com/bbs/attachment/Fid_21/21_317960_37970c464a795a9.png)
想得到定点的信息,主要使用两个类,CLLocationManager, CLLocationManagerdelegate协议,
m文件内容如下
1、先实例化一个CLLocationManager,同时设置委托及精确度等。
CCLocationManager *manager = [[CLLocationManager alloc] init];//初始化定位器
[manager setDelegate: self];//设置代理
[manager setDesiredAccuracy: kCLLocationAccuracyBest];//设置精确度
[manager startUpdatingLocation];//开启位置更新
2、接着实现CLLocationMangerDelegate协议的两个方法就可以了:
//定位时候调用
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation ;
//定位出错时被调
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;
对应的h文件要写上遵守CLLocationManagerDelegate如下
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@class CalibrationView, LevelView;
@interface LevelViewController : UIViewController <UIAccelerometerDelegate , CLLocationManagerDelegate> {
CLLocationManager *locationManager;
}
@property(nonatomic, retain) CLLocationManager *locationManager;
@end
-----------------------------------
h文件也可以换一种写法,不写CLLocationManagerDelegate,但要写上CLLocationManagerDelegate里的两个方法。
对应的m文件内容通上,一样正常运行。delegate可以换成这样写,感觉不这么神秘了吧。
@interface LevelViewController : UIViewController <UIAccelerometerDelegate > {
CLLocationManager *locationManager;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *) oldLocation ;
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *) error;
@end
Core Location主要应用了GPS, 蜂窝基站三角网以及Wi_Fi(WPS)三种技术。
- 使用GPS定位系统,可以精确地定位你当前所在的地理位置,但由于GPS接收机需要对准天空才能工作,因此在室内环境基本无用。
- 另一个找到自己所在位置的有效方法是使用手机基站,手机开机时,它会与周围的基站保持联系,如果你知道这些基站的身份,就可以使用各种数据库(包含基站的身份和它们的确切地理位置)计算出手机的物理位置。基站不需要卫星,和GPS不同,它对室内环境一样管用。但它没有GPS那样精确,它的精度取决于基站的密度,它在基站密集型区域的准确度最高。
- 第三种方法是依赖Wi-Fi,使用这种方法时,设备连接到Wi-Fi网络,通过检查服务提供商的数据确定位置,它既不依赖卫星,也不依赖基站,因此这个方法对于可以连接到Wi-Fi网络的区域有效,但它的精确度也是这三个方法中最差的。
altitude 表示位置的海拔高度,这个值是极不准确的。
horizontalAccuracy 表示水平准确度,这么理解,它是以coordinate为圆心的半径,返回的值越小,证明准确度越好,如果是负数,则表示core location定位失败。
verticalAccuracy表示垂直准确度,它的返回值与altitude相关,所以不准确。
Timestamp 返回的是定位时的时间,是NSDate类型。