首先简历一个基本的项目:
注意xib和类之间对应就好。运行检测一下看看建立的项目是否出现错误。没有就好。其实没有xib还没有地图的时候可以不用。
记下来就是定位的确定。
1、引入定位的头文件,同时又遵循代理
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate>
2.创建定位管理对象和设置代理
@property (nonatomic,strong) CLLocationManager *locationManager;
_locationManager.delegate = self;
//这种方法判断服务器是否可用,已经过时了,现在都是用类的方法
if ([[[CLLocationManager alloc]init] locationServicesEnabled]) {
}
类方法:[CLLocationManager locationServicesEnabled]
3、开启定位服务
[self.locationManager startUpdatingLocation];//开启服务
4、代理方法监听位置的改变。
(过时的方法就不管了)新的方法:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
//这里更新了位置之后就会调用这个方法
}
运行查看结果:
原因:在ios8 之前可能可以,但是ios8以及之后就添加了用户更加高的安全性,然后就还需要用户验证,所以必须添加用户验证。
(表示总是活得用户验证权限)
if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
{
// [_locationManager requestAlwaysAuthorization];
注意xib和类之间对应就好。运行检测一下看看建立的项目是否出现错误。没有就好。其实没有xib还没有地图的时候可以不用。
记下来就是定位的确定。
1、引入定位的头文件,同时又遵循代理
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate>
2.创建定位管理对象和设置代理
@property (nonatomic,strong) CLLocationManager *locationManager;
_locationManager.delegate = self;
//这种方法判断服务器是否可用,已经过时了,现在都是用类的方法
if ([[[CLLocationManager alloc]init] locationServicesEnabled]) {
}
类方法:[CLLocationManager locationServicesEnabled]
3、开启定位服务
[self.locationManager startUpdatingLocation];//开启服务
4、代理方法监听位置的改变。
(过时的方法就不管了)新的方法:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
//这里更新了位置之后就会调用这个方法
}
运行查看结果:
没有答应相应的代理方法中的信息,我们在模拟器上(注意这里必须点击一下模拟器,就是模拟器的界面的意思),点击debug ——> location -——> custom location 将会显示相应的为模拟器设置位置的界面:
设置位置的界面:
设置经纬度(eg:23,116),然后确定,发现代理监听位置更新的方法没有调用。
原因:在ios8 之前可能可以,但是ios8以及之后就添加了用户更加高的安全性,然后就还需要用户验证,所以必须添加用户验证。
在info.plist 文件中添加左边的,类中要写右边的对应方法,两个选一个就好
NSLocationAlwaysUsageDescription //对应方法 requestAlwaysAuthorization(表示总是活得用户验证权限)
NSLocationWhenInUseUsageDescription //对应方法 requestWhenInUseAuthorization
在info.plist 文件中的显示:
if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
{
// [_locationManager requestAlwaysAuthorization];
[self.locationManager requestAlwaysAuthorization];
//写上面那个可能前面没有初始化,所以没有调用懒加载的方法,也就没有设置代理,所以代理方法没有调用。
//和info.plist 文件对应
}
界面显示提示(第一次),我们点击allow,之后如如果设置过位置,就不用设置,否则,需要舍hi位置如上一次。
结果:
如果发现还没有显示,则清除xocde的缓存和模拟器的缓存。
全部代码:
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate>
@property (nonatomic,strong) CLLocationManager *locationManager;
@end
@implementation ViewController
//懒加载
- (CLLocationManager*)locationManager
{
if (!_locationManager) {
_locationManager = [[CLLocationManager alloc]init];
_locationManager.delegate = self;
}
return _locationManager;
}
- (void)viewDidLoad {
[super viewDidLoad];
if ([CLLocationManager locationServicesEnabled]) {
if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
{
//和info.plist 文件对应
// [_locationManager requestAlwaysAuthorization];
[self.locationManager requestAlwaysAuthorization];
//写上面那个可能前面没有初始化,所以没有调用懒加载的方法,也就没有设置代理,所以代理方法没有调用。
}
[self.locationManager startUpdatingLocation];//开启服务
}
}
#pragma mark CLLocationManagerDelegate
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location = [locations lastObject];
NSLog(@" location is :%@ ",location.description);
NSLog(@"代理方法");
}
//定位失败
-(void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示"
message:@"到信息中提示"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles: nil];
[alert show];
NSLog(@"didFailWithError is : %@",error);
}
@end
@end
<p>一些区别:</p><p>可以通过配置NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription来告诉用户使用定位服务的目的,这个设置的信息是在用户第一次打开应用的app的时候,会弹出的信息显示
但是不同的是这个配置是必须的,如果不进行配置则默认情况下应用无法使用定位服务,打开应用不会给出打开定位服务的提示,也无法获取到位置信息,除非安装后自己设置此应用的定位服务。同时,在应用程序中需要根据配置对requestAlwaysAuthorization或requestWhenInUseAuthorization方法进行请求。</p><p>开发者可以在info.plist 文件中设置NSLocationUsageDescription 说明定位identifier目的
[Privacy -Location Usage Description] 这个在ios8可以不写
//这是用户的描述,在ios8之前写的。
</p><p>
</p>