测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可 | MIT |
发布最后发布 | 2017年3月 |
由Vermilllion,kalamaznik,mitusha维护。
调度器提供对 iOS 设备位置/后台位置/跟踪等易于使用的访问权限。它封装了 CoreLocation,并提供了一个方便的、高度定制的接口。调度器的跟踪当前用户位置的类、直接和反向地理编码、跟踪进出区域、记录用户路线和速度。
要运行示例项目,请克隆仓库,并首先从 Example 目录运行 pod install
。
由于 iOS 8,您需要定义一个在位置授权请求时将呈现给用户的消息。您应该在您应用程序的 *-Info.plist 文件中定义此消息。根据您请求的位置更新模式添加以下至少一个键:
NSLocationWhenInUseUsageDescription 或 NSLocationAlwaysUsageDescription
确保您已将此键添加到正确的 .plist 文件中(常见错误是将它添加到 test-Info.plist 中),并将适当的消息文本作为值添加。
要开始跟踪位置,请使用默认初始化程序初始化 AGLocationDispatcher 或 AGRouteDispatcher 以进行标准设置
(默认更新间隔 - 1 分钟,水平精度 - 100 米)
您还可以使用以下初始化程序自定义服务:
initWithUpdatingInterval: 和DesiredAccuracy
这是一个简单的应用程序,它显示当前设备位置(并使用这些数据进行一些操作)在后台应用程序状态中。该应用程序识别位置,并在位置发生显著变化时(约 1000 英尺)或当应用程序处理来自 iOS 的获取操作时(10-15 分钟间隔)显示此信息。在后台模式下,应用程序可以在时间限制内识别位置(以及将位置发送到服务器或保存到 coredata)。我们的 AGBackgroundLocationDispatcher 类通过一个简单的 API 集成位置方法。(见 AppDelegate.m)。
附加信息:1 重大位置 2 背景获取
展示我们提出的简单封装方法,用于多提供者地理编码服务。应用程序可以显示地理编码(地址到位置)和反向地理编码(位置到地址),并可以从我们的列表中选择提供者(Yandex、Google、Apple)。
此演示应用程序显示用户进入/退出选定区域时(直径为100米)。用户可以通过拖动绿色圆形选择区域,启动跟踪此区域(底部开始按钮),在地图上跟踪您的位置,并在进入或退出区域时接收通知。只需停止跟踪当前区域并选择另一个区域即可。玩得开心!P.S.如要模拟位置跟踪:在Xcode底部栏中轻触“模拟位置”图标,并在开始应用程序或转到方案>编辑方案时选择“New York City Marathon”,然后在默认位置列表中选择“New York City Marathon”。
此演示应用程序可以跟踪您的当前位置,记录您的路线,显示您的当前平均速度和距离。您还可以保存您的路线并在以后查看它们。除此之外,您可以选择3种位置标记样式之一。只需轻触“开始录制”按钮然后继续。您将看到当前路线以绿色线条绘制。按下“停止并保存”,然后通过轻触“保存的路线”按钮转到保存的路线屏幕。在这里,您可以查看最后保存的路线。您可以通过在底部轻触“保存的路线”按钮来选择任何路线。玩得开心!
P.S.如要模拟位置跟踪:在Xcode底部栏中轻触“模拟位置”图标,并在开始应用程序或转到方案>编辑方案时选择“New York City Marathon”,然后在默认位置列表中选择“New York City Marathon”。
示例
AGRouteDispatcher *routeDisptcher = [AGRouteDispatcher initWithUpdatingInterval:kDefaultLocationTimeIntervalUpdateOneMinute andDesiredAccuracy:kAGHorizontalAccuracyThresholdBlock]
在viewcontroller的模块中,您可以使用此方法与块一起使用
- (void)startUpdatingLocationWithBlock: errorBlock:
- (void)startUpdatingLocationAndSpeedWithBlock: errorBlock:
- (void)requestUserLocationWhenInUseWithBlock:
- (void)requestUserLocationAlwaysWithBlock:
- (void)currentLocationWithBlock: errorBlock:
初始化和获取
+ (BOOL)locationServicesEnabled;
+ (BOOL)significantLocationChangeMonitoringAvailable;
- (instancetype)init;
- (instancetype)initWithUpdatingInterval:(NSTimeInterval)interval andDesiredAccuracy:(CLLocationAccuracy)horizontalAccuracy;
- (CLLocationManager *)locationManager;
- (CLLocationAccuracy)horizontalAccuracyThreshold;
AGLocationDispatcher允许根据应用程序信息property list配置和locationUpdateBackgroundMode设置(默认为AGLocationBackgroundModeSignificantLocationChanges模式)多种后台位置方法。当应用程序挂起或终止时,您需要使用特殊后台位置封装器:AGBackgroundLocationDispatcher(请参阅示例AppDelegate方法)。
后台位置模式
无后台位置模式:当应用程序进入后台时,位置更新将停止。在应用程序再次成为活动状态后,位置更新将再次激活。将locationUpdateBackgroundMode属性(AGLocationDispatcher对象)设置为AGLocationBackgroundModeForegroundOnly状态;
始终激活:需要UIBackgroundModes "location"键,应用程序永远不会挂起,位置精度和电池率将是最大值,无需额外代码。将locationUpdateBackgroundMode属性(AGLocationDispatcher对象)设置为除AGLocationBackgroundModeForegroundOnly以外的任何状态;
显著位置模式:当应用程序被终止/挂起时工作,提供GPS级精度(超过500米的位置变化)和非常低能耗的位置更新。需要UIBackgroundModes "location"键和实现特殊处理程序(基于AGBackgroundLocationDispatcher封装器)的应用程序代理代码(请参阅示例appDelegate方法didFinishLaunchingWithOptions)。将locationUpdateBackgroundMode属性(AGLocationDispatcher对象)设置为AGLocationBackgroundModeSignificantLocationChanges状态;
基于检索的位置模式:当应用程序挂起时工作,提供正常精度和非常适中的能耗位置更新,但在设备解锁/激活时激活。需要UIBackgroundModes "fetch"键和实现特殊处理程序(基于AGBackgroundLocationDispatcher封装器)的应用程序代理代码(请参阅示例appDelegate方法performFetchWithCompletionHandler)。将locationUpdateBackgroundMode属性(AGLocationDispatcher对象)设置为AGLocationBackgroundModeFetch状态;
AGBackgroundLocationDispatcher 代码在应用不活跃时运行,默认的 apps 对象和 UI 都将不存在。AGBackgroundLocationDispatcher 代码必须本地存储位置(在文件、coredata 等),将其发送到服务器或创建UILocalNotification(以在正常模式下启动应用)。AGBackgroundLocationDispatcher 代码将在活跃运行后的 10 秒到 30 秒内被系统终止。
AGBackgroundLocationDispatcher 包装器为您的后台代码和回调块提供 init 方法,您需要在位置任务完成时调用该块。
AGBackgroundLocationDispatcher 代码示例
[[AGBackgroundLocationDispatcher alloc] initWithASynchronousLocationUpdateBlock:^(AGLocation *newLocation, LDSignificationLocationASynchronousEndUpdateBlock updateCompletionBlock) {
NSString *string = [NSString stringWithFormat:@"example.com?location=%@", [newLocation description] ];
NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest: request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
updateCompletionBlock(); //data send successfully
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
updateCompletionBlock(); //data dont send
}];
[operation start];
}];
使用 AGGeoDispatcher 类进行直接和反向地理编码。
只需初始化 AGGeoDispatcher 类
AGGeoDispatcher *geoDispatcher = [[AGGeoDispatcher alloc] init]
实现以下方法
- (void)requestGeocodeForLocation: success: andFail:
- (void)requestLocationForAddress: success: andFail:
要选择地理编码提供商(Apple、Google、Yandex),使用以下方法
- (void)setGeocoderProvider:
AGRouteDispatcher 类提供 save/load AGRoute 数据到本地存储的方法
- (AGRoute *)loadRouteWithName:
- (void)saveRoute: name:
- (void)deleteDocWithName:
AGRegionDispatcher 类用于监控进入/退出某些区域。使用以下块方法进行监控
- (void)addCoordinateForMonitoring: updateBlock: failBlock:
- (void)addCoordinateForMonitoring: withRadius: desiredAccuracy: updateBlock: failBlock:
- (void)addRegionForMonitoring: desiredAccuracy: updateBlock: failBlock:
- (void)stopMonitoringForRegion:
- (void)stopMonitoringAllRegions
Agilie [email protected]
AGLocationDispatcher 可在 MIT 许可证下使用。有关更多信息,请参阅 LICENSE 文件。