ios8.0下CLLocationManager定位服务需要授权了

http://blog.csdn.net/pinklpig/article/details/7191347

http://blog.csdn.net/pinklpig/article/details/7191199

这是因为xcode升级造成的定位权限设置问题。
升级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



     
图片:图.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类型。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值