在 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的位置更新可能会因不同原因提供旧的更新,这是获取最新更新的好方法。
kCLLocationAgeFilterNoneself.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