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.
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 CLLocationManager
de iOS
.
Tout d’abord, ajoutez le CoreLocation.framework
à votre projet:
Project Navigator
Build Phases
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);
}
}
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.
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!
Sur n'importe quel appareil iOS, obtenez l'emplacement de l'utilisateur avec Core Location . Spécifiquement, vous voulez le CLLocation class (et CLLocationManager).
Est-ce que la méthode déléguée didTapMyLocationButton n'est pas la bonne?
- (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
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.