web-dev-qa-db-fra.com

Google Maps iOS SDK, Obtenir la position actuelle de l'utilisateur

Pour mon application iOS (construction de iOS7), je dois afficher l'emplacement actuel de l'utilisateur lors du chargement de l'application. J'utilise Google Maps iOS SDK. Je suis ceci Google Map Mais je ne peux pas le comprendre. S'il vous plaît aider si vous passez par le chemin.

13
Sofeda

Il semble que Google Maps iOS SDK ne puisse pas accéder à la position du périphérique . Vous devez donc récupérer la position en utilisant CLLocationManagerde iOS.

Tout d’abord, ajoutez le CoreLocation.framework à votre projet:

  • Allez dans Project Navigator
  • Sélectionnez votre projet
  • Cliquez sur l'onglet Build Phases
  • Ajoutez le CoreLocation.framework dans le Link Binary with Libraries

Il vous suffit ensuite de suivre l'exemple de base de Documentation Apple .

  • Créez une CLLocationManager probablement dans votre 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];
    

Avec la CLLocationManagerDelegate chaque fois que la position est mise à jour, vous pouvez mettre à jour la position de l'utilisateur sur votre 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

Oublie ma réponse précédente. Cela fonctionne bien si vous utilisez le MapKit.framework natif.

En fait, GoogleMaps pour iOS fait tout le travail pour vous. Vous n'êtes pas obligé d'utiliser CoreLocation directement.

La seule chose à faire est d’ajouter yourMapView.myLocationEnabled = YES; et le framework fera tout. (Sauf centrer la carte sur votre position).

Ce que j’ai fait: j’ai simplement suivi les étapes de la documentation } _. Et j'ai une carte centrée sur Sydney, mais si je zoomais et me déplaçais chez moi (si vous utilisez un vrai appareil, sinon utilisez des outils de simulation pour vous centrer sur l'emplacement d'Apple), je pourrais voir le point bleu sur ma position.

Maintenant, si vous souhaitez mettre à jour la carte pour suivre votre position, vous pouvez copier l'exemple Google MyLocationViewController.m inclus dans le répertoire du cadre. Ils ajoutent simplement un observateur sur la propriété myLocation pour mettre à jour les propriétés de la caméra:

@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

Avec le document que je vous ai donné et les exemples inclus dans le cadre, vous devriez pouvoir faire ce que vous voulez.

40
Maxime Capelle

Xcode + Swift + Google Maps iOS

Recette pas à pas:

1.) Ajouter une chaîne de clé à Info.plist (ouverte en tant que code source):

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

2.) Ajoutez CLLocationManagerDelegate à votre classe de contrôleur de vue:

class MapViewController: UIViewController, CLLocationManagerDelegate {
   ...
}

3.) Ajoutez CLLocationManager dans votre classe:

var mLocationManager = CLLocationManager()
var mDidFindMyLocation = false

4.) Demander la permission et ajouter un observateur:

override func viewDidLoad() {
        super.viewDidLoad()          

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

5.) Attendez l'autorisation et activez l'emplacement dans Google Maps:

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

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

    }

6.) Ajouter observable pour le changement de lieu:

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!")

        }

    }

C'est tout!

3
lenooh

Sur n'importe quel appareil iOS, obtenez l'emplacement de l'utilisateur avec Core Location . Spécifiquement, vous voulez le CLLocation class (et CLLocationManager).

2
JeremyP

Est-ce que la méthode déléguée didTapMyLocationButton n'est pas la bonne?

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

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

Et vous pouvez localiser par 

(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

L'emplacement actuel n'apparaît pas sur le simulateur ... connectez un appareil réel et essayez-le J'ai passé 2 jours à courir dans le simulateur et je ne savais pas qu'il ne simulait pas d'emplacement.

0
Marwa Lamey