it-swarm.com.ru

Google Maps iOS SDK, Получение текущего местоположения пользователя

Для моего приложения iOS (встраиваемый в iOS7) мне нужно показать текущее местоположение пользователя при загрузке приложения. Я использую Google Maps iOS SDK. Я слежу за этим Карта Google Но я не могу понять это. Пожалуйста, помогите, если вы идете по пути.

13
Sofeda

Кажется, Google Maps iOS SDK не может получить доступ к позиции устройства . Таким образом, вы должны получить позицию с помощью CLLocationManagerof iOS.

Сначала добавьте CoreLocation.framework в ваш проект:

  • Войдите в Project Navigator
  • Выберите свой проект
  • Нажмите на вкладку Build Phases
  • Добавьте CoreLocation.framework в Link Binary with Libraries

Тогда все, что вам нужно сделать, это следовать базовому примеру документации Apple .

  • Создайте CLLocationManager, вероятно, в вашей ViewDidLoad:

    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];
    
    locationManager.delegate = self;
    //Configure Accuracy depending on your needs, default is kCLLocationAccuracyBest
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    
    // Set a movement threshold for new events.
    locationManager.distanceFilter = 500; // meters
    
    [locationManager startUpdatingLocation];
    

С CLLocationManagerDelegate каждый раз, когда позиция обновляется, вы можете обновить позицию пользователя в вашем Google Maps:

- (void)locationManager:(CLLocationManager *)manager
      didUpdateLocations:(NSArray *)locations {
    // If it's a relatively recent event, turn off updates to save power.
   CLLocation* location = [locations lastObject];
   NSDate* eventDate = location.timestamp;
   NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
   if (abs(howRecent) < 15.0) {
      // Update your marker on your map using location.coordinate.latitude
      //and location.coordinate.longitude); 
   }
}
9
Maxime Capelle

Забудь мой предыдущий ответ. Это хорошо работает, если вы используете нативный MapKit.framework.

На самом деле GoogleMaps для iOS сделает всю работу за вас. Вам не нужно использовать CoreLocation напрямую.

Единственное, что вам нужно сделать, это добавить yourMapView.myLocationEnabled = YES;, и фреймворк сделает все. (За исключением центра карты на вашей позиции).

Что я сделал: я просто выполнил шаги следующей документации . И я получил карту с центром в Сиднее, но если я уменьшил масштаб и переехал на свое место (если вы используете реальное устройство, в противном случае используйте инструменты симулятора, чтобы сосредоточиться на местоположении Apple), я мог видеть синюю точку на моей позиции.

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

@implementation MyLocationViewController {
  GMSMapView *mapView_;
  BOOL firstLocationUpdate_;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868
                                                          longitude:151.2086
                                                               zoom:12];

  mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  mapView_.settings.compassButton = YES;
  mapView_.settings.myLocationButton = YES;

  // Listen to the myLocation property of GMSMapView.
  [mapView_ addObserver:self
             forKeyPath:@"myLocation"
                options:NSKeyValueObservingOptionNew
                context:NULL];

  self.view = mapView_;

  // Ask for My Location data after the map has already been added to the UI.
  dispatch_async(dispatch_get_main_queue(), ^{
    mapView_.myLocationEnabled = YES;
  });
}

- (void)dealloc {
  [mapView_ removeObserver:self
                forKeyPath:@"myLocation"
                   context:NULL];
}

#pragma mark - KVO updates

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
  if (!firstLocationUpdate_) {
    // If the first location update has not yet been recieved, then jump to that
    // location.
    firstLocationUpdate_ = YES;
    CLLocation *location = [change objectForKey:NSKeyValueChangeNewKey];
    mapView_.camera = [GMSCameraPosition cameraWithTarget:location.coordinate
                                                     zoom:14];
  }
}

@end

С предоставленным вами документом и образцами, включенными в структуру, вы сможете делать то, что хотите.

40
Maxime Capelle

Xcode + Swift + Google Карты iOS

Пошаговый рецепт:

1.) Добавить строку ключа в Info.plist (открыть как исходный код):

<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs your location to function properly</string>

2.) Добавьте CLLocationManagerDelegate к вашему классу контроллера представления:

class MapViewController: UIViewController, CLLocationManagerDelegate {
   ...
}

3.) Добавьте CLLocationManager в свой класс:

var mLocationManager = CLLocationManager()
var mDidFindMyLocation = false

4.) Запросите разрешение и добавьте наблюдателя:

override func viewDidLoad() {
        super.viewDidLoad()          

        mLocationManager.delegate = self
        mLocationManager.requestWhenInUseAuthorization()
        yourMapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.new, context: nil)
        ...
}

5.) Дождитесь авторизации и включите местоположение в Google Maps:

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        if (status == CLAuthorizationStatus.authorizedWhenInUse) {
            yourMapView.isMyLocationEnabled = true
        }

    }

6.) Добавьте наблюдаемые для изменения местоположения:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        if (!mDidFindMyLocation) {

            let myLocation: CLLocation = change![NSKeyValueChangeKey.newKey] as! CLLocation

            // do whatever you want here with the location
            yourMapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 10.0)
            yourMapView.settings.myLocationButton = true

            mDidFindMyLocation = true

            print("found location!")

        }

    }

Это оно!

3
lenooh

На любом устройстве iOS получите местоположение пользователя с помощью Core Location . В частности, вам нужен класс CLLocation (и CLLocationManager).

2
JeremyP

Метод делегата didTapMyLocationButton не является способом?

https://developers.google.com/maps/documentation/ios/reference/protocol_g_m_s_map_view_delegate-p#ac0e0171b811e839d9021800ca9fd33f4

- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView {
    return YES;
}

И вы можете получить местоположение по 

(lldb) po mapView.myLocation
<+37.33243033,-122.03088128> +/- 386.93m (speed -1.00 mps / course -1.00) @ 5/19/14, 6:22:28 PM Moscow Standard Time
1
Dmitry Nelepov

Текущее местоположение не будет отображаться на симуляторе ... подключите реальное устройство и попробуйте Я провел 2 дня в симуляторе и не знаю, что он не симулирует местоположения

0
Marwa Lamey