wift: // 当定位到位置后调用
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// 获取用户当前最新位置
let locationC = locations.last
// 判断水平数据是否有效
if locationC?.horizontalAccuracy < 0 { // 负数表示无效
return
}
// 计算行走方向(北偏东,东偏南,南偏西,西偏北)
let courseAry = ["北偏东", "东偏南", "南偏西", "西偏北"]
// 将当前航向值/90度会得到相应的值(0,1,2,3)
let i = Int((locationC?.course)! / 90)
// 取出对应航向
var courseStr = courseAry[i]
// 计算偏移角度
let angle = Int((locationC?.course)! % 90)
// 判断是否为正方向
// 对角度取余,为0就表示正
if Int(angle) == 0 {
// 截取字符串第一个字
courseStr = (courseStr as NSString).substringToIndex(1)
}
// 确定移动距离
let lastLoc = lastLocation ?? locationC
let distance = locationC?.distanceFromLocation(lastLoc!)
lastLocation = locationC
// 拼接字符串
print("向\(courseStr)方向走了\(distance!)米偏移角度\(angle)")
}
区域监听
- 区域监听就是根据需求指定一块区域,当用户持设备进入或离开指定区域,我们都可以监听到
- iOS8开始,想要做区域监听,必须请求位置授权(因为区域监听原理就是获取用户位置,然后判断位置是否在设定的区域内,涉及到用户隐私)
OC:
- (CLLocationManager *)manager
{
if (!_manager) {
_manager = [[CLLocationManager alloc] init];
_manager.delegate = self;
// 请求用户授权区域监听
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
[_manager requestAlwaysAuthorization];
}
}
return _manager;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 判断区域监听是否可用
if ([CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]) {
return;
}
// 创建一个区域
// 确定圆心
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(21.23, 123.345);
// 确定半径
CLLocationDistance distance = 1000.0;
// 因为监听区域有最大值,所以要判断下是否超过监听的最大值
if (distance > self.manager.maximumRegionMonitoringDistance) {
distance = self.manager.maximumRegionMonitoringDistance;
}
CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:distance identifier:@"123"];
// 开始监听区域
[self.manager startMonitoringForRegion:region];
}
// 进入区域时
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
NSLog(@"进入区域%@",region.identifier);
}
// 离开区域时
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
NSLog(@"离开区域%@",region.identifier);
}
// 但外界调用请求某个指定区域的状态时
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
if (state == CLRegionStateUnknown)
{
NSLog(@"未识别");
}
if (state == CLRegionStateInside) {
NSLog(@"在区域内");
}
if (state == CLRegionStateOutside) {
NSLog(@"在区域外");
}
}
swift:
lazy var locationMgr : CLLocationManager = {
let locationMgr = CLLocationManager()
locationMgr.delegate = self
// 记得设置相应的授权请求Key
// 当前版本是8.0及以上
if #available(iOS 8.0, *) {
// 请求前后台定位授权
locationMgr.requestAlwaysAuthorization()
}
return locationMgr
}()
override func viewDidLoad() {
super.viewDidLoad()
// 创建一个区域
// 确定圆心
let center = CLLocationCoordinate2DMake(21.23, 123.345)
// 确定半径
var distance : CLLocationDistance = 1000
// 因为监听区域有最大值,索引先判断是否超过了监听区域的最大值
if distance > locationMgr.maximumRegionMonitoringDistance {
distance = locationMgr.maximumRegionMonitoringDistance
}
let region = CLCircularRegion(center: center, radius: distance, identifier: "123")
// 判断取余监听是否可用
if C