iPhone的配置框架限制?

时间:2009-09-04 02:06:04

标签: iphone core-location

家伙,

我正在开发一个应用程序,其中我需要多次向用户询问其位置的功能,当用户允许一次使用他的位置时会发生什么,当他导航到另一个部分时,它不会要求他获取他的位置,它是从已经缓存的位置获取它。

是否有可能多次要求用户批准他的位置?

任何帮助表示感谢。

干杯, 阿米特

2 个答案:

答案 0 :(得分:5)

您无需多次获得许可。

要开始获取更新,请致电:

[locationManager startUpdatingLocation]; 

在调用[locationManager stopUpdatingLocation]之前,您将获得连续的位置更新。

因此,您需要实现委托方法来说明获得新位置时会发生什么。这种委托方法可以做一些简单的事情,比如将位置保存到类变量中供以后使用。

您需要实现的委托功能是:

- (void)locationManager:(CLLocationManager *)manager 
  didUpdateToLocation:(CLLocation *)newLocation
  fromLocation:(CLLocation *)oldLocation {}

我应该在这里提醒你。持续运行GPS是电池密集型的(如果您要尽可能快地请求非常准确的读数,您将在大约2.5小时内终止设备)。所以,你应该做的是在用户打开应用程序时获得修复,然后调用stopUpdatingLocation。

然后,在您的应用程序中,有一个“找到我”按钮,它将打开LocationManager,获得修复,然后再次关闭LocationManager。您可能希望继续轮询某个位置,直到获得良好的位置。水平准确度

我建议你实现一个NSObject子类,它实现了LocationManagerDelegate协议。然后,该对象将在多个视图控制器之间共享。这是一个中央gpsController的简单实现。

所以,这将是gpsController.h:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@interface gpsController : NSObject <CLLocationManagerDelegate> {
  CLLocationManager *locationManager;
  CLLocation *lastReading;
}


- (id)init;

@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain) CLLocation *lastReading;

@end

然后以下是gpsController.m:

#import "gpsController.h"

@implementation gpsController

@synthesize locationManager, lastReading;

- (id)init {

  if(self = [super init]) {

    [[self locationManager] startUpdatingLocation]; 

    self.lastReading = nil;

  }

  return self;

}


- (CLLocationManager *)locationManager {

  if (locationManager) return locationManager;

  locationManager = [[CLLocationManager alloc] init];
  locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
  locationManager.delegate = self;

  return locationManager;   

}


- (void)locationManager:(CLLocationManager *)manager 
  didUpdateToLocation:(CLLocation *)newLocation
  fromLocation:(CLLocation *)oldLocation {

  self.lastReading = newLocation;

}

答案 1 :(得分:0)

根据iPhone编程:Big Nerd Ranch指南,CLLocationManagers首先返回缓存的,最后找到的设备位置。如果didUpdateToLocation时间戳超过3分钟,它们的示例代码将脱离locationManager:didUpdateToLocation:fromLocation,假设它来自缓存。这似乎是有效更新之间的相当长的时间,但也许只有做一些测试才会知道。 也许您可以在消息之间保留时间戳,以查看您是否仍在从缓存中提供位置数据,或者为每次调用locationManager增加一个计数器:didUpdateToLocation:fromLocation并且只使用奇数编号的调用或其他一些增量...