在模拟器上获取用户MapKit的_correct_坐标

时间:2011-12-01 23:03:39

标签: iphone ios xcode mapkit

情况如下,我在MacOS 10.7上运行xCode 4.1,启动iPhone模拟器并使用MapKit尝试获取 REAL 用户的坐标...默认用户的位置在美国库比蒂诺。为了得到这一点,我使用了:

self.mapView.userLocation.location.coordinate

......但这让我到了地图的中心(在非洲)......

问题#1:为什么???为什么用户的引脚设置为Cupertino但其坐标为(lat:0,lon:0)在非洲?

......然后......

我已将我的控制器设置为CCLocationManagerDelegate和MKMapViewdelegate,并将控制器初始化为CCLocationManagerDelegate事件的委托...但这些委托方法都没有被调用...

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

问题#2:为什么委托方法甚至不会被触发一次?

我的控制器:

//@interface MapController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate> 

//@property (nonatomic, retain) MapModel *mapModel;
//@property (nonatomic, retain) IBOutlet MKMapView *mapView;

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

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{ ... }

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{ ... }

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.mapModel = [[[MapModel alloc] init:self] autorelease];

    [self.mapView setShowsUserLocation:YES];
    [self.mapView setZoomEnabled:YES];
    [self.mapView setScrollEnabled:YES];
    [self.mapView setMapType:MKMapTypeStandard];

    CLLocationCoordinate2D x = 
        self.mapView.userLocation.location.coordinate; // (0,0) why???

    //[self.mapView setRegion:xx animated:YES];
    //[self.mapView regionThatFits:self.mapModel.region];
    [[self.mapView userLocation] setCoordinate:[x coordinate]];
}

...

模特:

   //@property (nonatomic, copy) NSString *user;
   //@property (nonatomic, copy) NSString *caption;
   //@property (nonatomic, copy) NSString *description;
   //@property (nonatomic, assign) MKCoordinateRegion region;
   //@property (nonatomic, retain) CLLocationManager *manager;

    - (id)init :(id)delegate
    {
        self.manager = [[[CLLocationManager alloc] init] autorelease];

        self.manager.delegate = delegate;
        self.manager.distanceFilter = kCLDistanceFilterNone;
        self.manager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
        [self.manager startUpdatingLocation];

        MKCoordinateRegion region = {{0, 0}, {0.2, 0.2}};

        self.region = region;

        return self;
    }

谢谢,艺术

2 个答案:

答案 0 :(得分:2)

模拟器中的默认位置是Cupertino。在最新的Xcode(4.2,我相信)中,您可以从预先填充的位置菜单中设置模拟器的位置(您可以通过在项目中包含GPX文件来添加自己的位置)。

如果你在设备上运行并启用APP的位置服务,你应该使用你的代码获得一个有效的位置。

答案 1 :(得分:0)

让我澄清一下我的问题...... 据我所知,userLocation似乎在模拟器上似乎是零......好吧......但第二个问题是为什么没有调用CLLocationManagerDelegate方法“didUpdateToLocation”? 我看到了这个教程,即使在模拟器上也应该调用它... 那我做错了什么? http://www.youtube.com/watch?v=qNMNRAbIDoU&feature=related 同时我在日志中得到这样的错误 - “服务器不接受客户注册68” 这可能是没有调用位置委托的原因吗?

更新:

我在xCode 4.3上尝试了这个,它仍然不起作用...... 首先调用userLocation,它在第二个返回(0,0) - (-180,-180)

然后我切换到IOS 5 SDK,现在Map完全没有加载错误 - __GEORegisterNetworkDefaults_block_invoke_0: Could not connect to geod on com.apple.geod.defaults

更新:

卸载所有xCode版本然后安装稳定的4.2版本确实有帮助...... 已解决!!!