一.iOS自带的定位
iOS通过自带的CoreLocation 框架可以获取用户的当前位置,城市,经纬度等信息。
1.导入CoreLocation框架
#import
2.注意,在iOS8以后,需要请求用户同意APP定位,需在info.plist文件中添加字段:
NSLocationWhenInUseUsageDescription 允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription 允许永远可获取GPS的描述
3.创建CLLocationManager地Manager
@interface KLLocationManager()
{ @property (nonatomic ,strong) CLLocationManager *locationManager;
}
```
_locationManager= [[CLLocationManageralloc]init];
_locationManager.delegate=self;
_locationManager.pausesLocationUpdatesAutomatically=NO;
_locationManager.desiredAccuracy=kCLLocationAccuracyBest;
```
4.在创建完成后开始执行定位操作
```
if([[UIDevicecurrentDevice].systemVersionfloatValue] >8)
{
/**请求用户权限:分为:只在前台开启定位/在后台也可定位,*/
/**只在前台开启定位*/
//[self.locationManager requestWhenInUseAuthorization];
/**后台也可以定位*/
[self.locationManagerrequestAlwaysAuthorization];
}
if([[UIDevicecurrentDevice].systemVersionfloatValue] >9)
{
/** iOS9新特性:将允许出现这种场景:同一app中多个location manager:一些只能在前台定位,另一些可在后台定位(并可随时禁止其后台定位)。*/
[self.locationManagersetAllowsBackgroundLocationUpdates:YES];
}
[self.locationManagerstartUpdatingLocation];
```
5.实现CllocationDelegate代理方法,获取当前位置信息
```
- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray *)locations {
/// 此为定位成功的回调方法
}
```
6.iOS后台定位的问题。
添加了NSLocationAlwaysUsageDescription 允许永远可获取GPS的描述字段,开启backgroudMode,调用允许后台定位的方法之后,在App UIApplicationStateInactive 状态下能持续定位,已做测试,测试时间1个小时
二、CLLocationManager对ibeacon的检测。
检测你的ibeacon设备,由于在本项目中,一个ibeacon设备作为长连接设备,另一个作为报警设备,所以在此,我们对两个ibeacon设备进行检测
1.使用的框架和LocationManager使用的是一样的,创建过程,添加字段等发发同上。
2.在创建完成,设置代理后,创建两个CLBeaconRegion设备,让manager对两个设备进行检测。
```
CLBeaconRegion *linkRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"12345679-8012-3456-7980-123456798011"] identifier:@"KLLinkDevice"];
CLBeaconRegion *alarmRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"cd62f6f9-fc11-4a7e-a9f3-bb50a32d0000"] identifier:@"KLAlarmDevice"];
linkRegion.notifyOnExit=YES;
linkRegion.notifyOnEntry=YES;
linkRegion.notifyEntryStateOnDisplay=YES;
alarmRegion.notifyOnExit=YES;
alarmRegion.notifyOnEntry=YES;
alarmRegion.notifyEntryStateOnDisplay=YES;
[self.locationManagerstartMonitoringForRegion:linkRegion];
[self.locationManagerstartMonitoringForRegion:alarmRegion];
```
注意:linkRegion.notifyOnExit=YES;
linkRegion.notifyOnEntry=YES;
linkRegion.notifyEntryStateOnDisplay=YES; 如果不设置这几个参数的话,将不会进入检测beacon进入和退出的方法。
3.实现检测回调
- (void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion*)region {
}
- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion*)region {
}
- (void)locationManager:(CLLocationManager*)manager
didDetermineState:(CLRegionState)state forRegion:(CLRegion*)region {
}
在开启后台模式之后,不管app出于运行、后台、还是挂起状态都会唤醒app执行该回调,你有10秒钟的唤醒时间用于处理数据(本地,或者请求服务器)
检测ibeacon的进入比较及时,当关闭ibeacon时,检测会有10-50秒的延时。