Core Location支持两种方式去获取方位相关的信息:
-
heading
:有磁力计的设备可以获得设备的指向. -
course
:有GPS硬件的设备可以获取设备的移动的航向.
heading
和course
信息是不一样的.设备的heading
反映了真实的地理方向或磁力方向.设备的course
则反映了行进的方向,并不和设备的方向相关.比如说:设备的行进方向是南向北的,但设备的头是指向东方.
加入方向相关的事件
在info.plist
里加入UIRequiredDeviceCapabilities
相关的键:
- magnetometer:磁力计,获取
heading
信息 - gps:获取
course
信息.
重要:如果没有上面的设置也能正常获取相关信息,就不要设置
获取Heading
相关的事件
- 创建
CLLocationManager
对象. - 通过调用
headingAvailable
类方法来检查heading
事件是否有效. - 赋值给location manager的
delegate
. - 如果你要真实的北方,开始定位服务.
- 调用
startUpdatingHeading
方法,开始heading
事件的递送.
- (void)startHeadingEvents {
if (!self.locManager) {
CLLocationManager* theManager = [[[CLLocationManager alloc] init] autorelease];
// Retain the object in a property.
self.locManager = theManager;
locManager.delegate = self;
}
// Start location services to get the true heading.
locManager.distanceFilter = 1000;
locManager.desiredAccuracy = kCLLocationAccuracyKilometer;
[locManager startUpdatingLocation];
// Start heading updates.
if ([CLLocationManager headingAvailable]) {
locManager.headingFilter = 5;
[locManager startUpdatingHeading];
}
}
你赋值给delegate
的对象,一定要遵循CLLocationManagerDelegate
协议.当一个新的heading
事件到达时,location manager会调用locationManager:didUpdateHeading:
方法去递送这个事件给app.一旦接收到一个新的事件,检查headingAccuracy
属性去确保你接收的数据是有效的.如果你要用的是真实的heading
,在使用它之前,同样要检查它是否包含有效的值.
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
if (newHeading.headingAccuracy < 0)
return;
// Use the true heading if it is valid.
CLLocationDirection theHeading = ((newHeading.trueHeading > 0) ?
newHeading.trueHeading : newHeading.magneticHeading);
self.currentHeading = theHeading;
[self updateHeadingDisplays];
}
当用户在移动时攻取course
信息
在获取当前用户定位时,就可以获取course
和速度.