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

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

7 ответов


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

во-первых, добавьте CoreLocation.framework проект :

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

тогда все, что вам нужно сделать, это следовать основной exemple 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); 
   }
}

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

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

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

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

теперь, если вы хотите обновить карту, чтобы следовать вашей позиции, вы можете скопировать пример Google MyLocationViewController.m это включено в каталог framework. Они просто добавляют наблюдателя на 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

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


Xcode 8.1, Swift 3, Google Maps iOS 2.1

шаг за шагом рецепт:

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

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

2.) Add CLLocationManagerDelegate для вашего класса контроллера вида:

class MapViewController: UIViewController, CLLocationManagerDelegate {
   ...
}

3.) Add CLLocationManager в свой класс:

var locationManager = CLLocationManager()
var didFindMyLocation = false

4.) Спросите разрешения:

override func viewDidLoad() {
        super.viewDidLoad()          

        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        ...
}

5.) Дождитесь авторизации и включите location:

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 !didFindMyLocation {

            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

            didFindMyLocation = true

            print("found location!")

        }

    }

вот именно!


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


является ли метод делегата 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

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


есть много способов... Я использовал этот метод и он работает во всех случаях. Google дает вам все с ответом в формате json и его на вас, как вы имеете дело с этими данными.

некоторые шаги для загрузки карты google в вашем проекте.

  1. найдите ключ api по этой ссылке https://developers.google.com/places/ios-api/ войдите в свою учетную запись google, добавьте проект и создайте ключ ios. тогда используйте это в своем проект

  2. включить все api, необходимые для Google map

a-GoogleMaps sdk для ios б-расчет по API направлении c - "" javasripts api д - комплектовщик API-интерфейс e-places api для ios F матрица расстояний api

в методе appdelegate...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [GMSServices provideAPIKey:@"xxxxxxxx4rilCeZeUhPORXWNJVpUoxxxxxxxx"];

    return YES;
}
  1. добавить все необходимые библиотеки и фреймворки в вашем проекте если Google map не работает, это означает, что вы должны добавить необходимую структуру все лучшая игра с Google map