使用MKMapKit显示用户位置(目标C)

时间:2018-05-02 17:17:49

标签: ios objective-c location mapkit

我目前正在学习使用适用于iOS的MKMapKit框架,但是无法找到任何好的教程,因为大多数教程都是使用Swift(一种我还没有学过的语言),或者只是太老而无法相关。所以我想知道你们是否能够回答一些关于显示用户位置和权限的具体问题。

我的代码目前是裸机,我有一个初始化的MKMapView,它运行得很好:

@interface ViewController () <MKMapViewDelegate>

...

mapView.frame                               = CGRectMake(0, 0, windowSize.width, windowSize.height);
mapView.delegate                            = self;
mapView.showsUserLocation                   = YES;
[self.view addSubview:mapView];

放大地图上特定位置的方法:

- (void)setLocation:(CLLocationCoordinate2D)location {
    float perimeter                             = 250.0f;
    [mapView setRegion:MKCoordinateRegionMakeWithDistance(location, perimeter, perimeter) animated:YES];
}

这显示了我从Google地图获得坐标的预定位置。这一切都很好,但现在我想在我的应用程序中添加一个按钮,以找到用户的当前位置并放大它。但这是我迷路的地方。我找不到任何能够明白地向我解释如何用Obj C实现这一目标的好教程。有些人谈到CLCoreLocation及其代理,有人说它只适用于MKMapKit,但到目前为止没有任何工作。

此外,我无法要求获得使用手机GPS的许可。我已将以下行添加到info.plist文件中:

Privacy - Location When In Use Usage Description

我还添加了一个字符串作为其值,但似乎无法触发弹出窗口以允许我访问GPS。在一次尝试中,窗口出现了一秒钟,但随后立即消失。所以,我也不知所措。

基本上这就是我想要实现的目标:

  1. 在应用程序首次启动时或用户点击当前位置按钮时请求允许使用GPS(如果他或她错误地拒绝了许可)。
  2. 如果有权限,应用程序应默认放大用户的位置,或者,如果未授予权限,则放大到预定位置(此最后一部分现在实际可用)。
  3. 应用程序不应该跟随用户的移动,而是保持静止,允许用户自由平移和缩放。但是,如果用户点击&#34;当前位置&#34;按钮,它应该像启动时一样放大他或她的位置。
  4. 任何人都可以帮助我解决这个问题,也许可以写一些关于为什么事情会这样做的内容?目前没有关于Objective C的教程,所以我认为这对其他人也很有帮助。

    一些额外的信息:我使用Xcode 9.3并以编程方式执行所有操作(我不使用界面构建器)。

    非常感谢!

1 个答案:

答案 0 :(得分:2)

1。请求位置更新

要请求位置更新,您需要一个CLLocationManager。您需要将接收器类设置为CLLocationManagerDelegate。

U+0020

您的接收器类需要实现

    //Create location manager
    locationManager = [[CLLocationManager alloc] init];
    //Subscribe to location updates
    [locationManager setDelegate:self];
    //Request always authorization
    [locationManager requestAlwaysAuthorization];
    //Start location updates
    [locationManager startUpdatingLocation];
    //Start heading updates
    [locationManager startUpdatingHeading];
    //Receive all updates
    locationManager.distanceFilter = kCLDistanceFilterNone;
    //Get best possible accuracy
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

该类的方法。您可以在此处查看您的应用是否已获得许可。如果状态== - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status ,则用户拒绝了您的请求。如果状态== kCLAuthorizationStatusDeniedkCLAuthorizationStatusAuthorizedAlways,您可以检索用户的位置。然后,您只需从位置管理器中检索位置即可。

kCLAuthorizationStatusAuthorizedWhenInUse

如果用户拒绝您的位置访问请求,则无法再从应用内部询问。但是,您可以要求他们更改设置并使用locationManager.location 来将其发送到您应用的隐私设置。

openURL:

2。移至用户位置

将地图移动到用户位置非常简单。它可以用一行代码完成。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

3

这已经是MapKit的默认行为。