在 CLLocationManager 上添加 block 以及一些新功能。
注意:从 1.3.0 版本开始支持 iOS 8。
CLLocationManager-block 通过 CocoaPods 提供,要安装它,只需将以下行添加到您的 Podfile 中
pod 'CLLocationManager-blocks'
此分类以两种方式提供位置更新。
通过 block 接收位置更新。
self.manager = [CLLocationManager updateManagerWithAccuracy:50.0 locationAge:15.0 authorizationDesciption:CLLocationUpdateAuthorizationDescriptionAlways];
[self.manager startUpdatingLocationWithUpdateBlock:^(CLLocationManager *manager, CLLocation *location, NSError *error, BOOL *stopUpdating) {
NSLog(@"Our new location: %@", location);
}];
注意:会自动通过调用此方法开始位置更新。无需调用 startUpdatingLocation。
使用此 block,您将获得位置更新而不使用代理方法。底层方法 locationManager:didUpdateLocations:
提供一个数组中的更新,但我们将它们拆分为单独的更新块。
如果更新失败,将提供一个错误,并将 location
设置为 nil
。如果成功,则 error
将为 nil
,位置将为 CLLocation 对象。
您可以将 stopUpdating
布尔值设置为 YES
以在任何成功或失败更新后停止位置更新。
*stopUpdating = YES;
还有一个类似的方法用于接收航向更新。
[self.manager startUpdatingHeadingWithUpdateBlock:^(CLLocationManager *manager, CLHeading *heading, NSError *error, BOOL *stopUpdating) {
NSLog(@"Our new heading: %@", heading);
*stopUpdating = YES;
}];
对于 iOS 8,需要将键 NSLocationAlwaysUsageDescription
设置在 info.plist 中。请确保您已将其添加。
除了块之外,还包括了两个新的过滤器。通常在监听位置更新时,您将接收包含不必要年龄或精度的位置更新。然后,人们需要编写代码来避免使用这些更新。得益于新的过滤器,我们只需指定年龄和/或精度即可获得可以工作的位置更新。
Core Location 中提供的标准 [CLLocationManager desiredAccuracy]
无法保证满足特定的精度要求。通过设置此参数,将排除所有精度高于指定值的更新。
[CLLocationManager desiredAccuracy]
设置为kCLLocationAccuracyBest
,并将您指定的以米为单位的updateAccuracyFilter
。updateAccuracyFilter
用于所有块。kCLUpdateAccuracyFilterNone
。此参数用于过滤掉比指定秒数更早的位置更新。CLLocationManager的位置更新可能会因不同原因提供旧的更新,这是获取最新更新的好方法。
kCLLocationAgeFilterNone
self.manager.updateAccuracyFilter = 50.0;
self.manager.updateLocationAgeFilter = 15.0;
//or
self.manager.updateAccuracyFilter = kCLUpdateAccuracyFilterNone;
self.manager.updateLocationAgeFilter = kCLLocationAgeFilterNone;
该类别包含CLLocationManagerDelegate方法的所有块实现。这些块可以与CLLocationManager一起使用,就像您通常使用代理一样。
注意:与startUpdatingLocationWithUpdateBlock:不同,您必须调用startUpdatingLocation来接收更新。
locationManager:didUpdateLocations
self.manager = [CLLocationManager updateManager];
[self.manager didUpdateLocationsWithBlock:^(CLLocationManager *manager, NSArray *locations) {
// Did update locations
}];
[self.manager startUpdatingLocation];
用于简化检查用户是否已授权位置更新的步骤的方法。
isLocationUpdatesAvailable
if ([CLLocationManager isLocationUpdatesAvailable]) {
// Location updates authorized
}
请参阅LICENSE文件
© 2013 Aksel Dybdal