Показать местоположение пользователя с помощью MKMapKit (Цель C) - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я учусь использовать инфраструктуру MKMapKit для iOS, но не могу найти хороших учебных пособий, поскольку большинство из них написаны на 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. Приложение не должно следовать за движением пользователя, но должно оставаться на месте, позволяя пользователю свободно перемещаться и масштабировать. Однако, если пользователь нажимает кнопку «Текущее местоположение», он должен увеличить свое местоположение, как при запуске.

Может ли кто-нибудь помочь мне с этим и, возможно, написать несколько строк о том, почему все так работает? Для Objective C не существует текущих руководств, так что я думаю, что это может быть полезно и для других.

Несколько дополнительных сведений: я использую Xcode 9.3 и делаю все программно (я не использую конструктор интерфейсов).

Спасибо большое!

1 Ответ

0 голосов
/ 02 мая 2018

1. Запрос обновлений местоположения

Чтобы запросить обновления местоположения, вам нужен CLLocationManager. Вам необходимо настроить класс получателя как CLLocationManagerDelegate.

    //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 

метод в этом классе. Здесь вы можете проверить, было ли ваше приложение получено разрешение. Если статус == kCLAuthorizationStatusDenied, пользователь отклонил ваш запрос. Если статус == kCLAuthorizationStatusAuthorizedAlways или kCLAuthorizationStatusAuthorizedWhenInUse, вы можете получить местоположение пользователя. Затем вы можете просто получить местоположение от менеджера местоположения.

locationManager.location

Если пользователь отклонит ваш запрос на доступ к местоположению, вы не сможете запросить его снова из приложения. Однако вы можете попросить их изменить настройку и использовать звонок openURL:, чтобы отправить их в настройки конфиденциальности вашего приложения.

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

2. Переезд в местоположение пользователя

Переместить карту в местоположение пользователя очень просто. Это можно сделать одной строкой кода.

[map setCenterCoordinate:map.userLocation.coordinate animated:YES];

3.

Это уже стандартное поведение MapKit.

...