web-dev-qa-db-ja.com

Google Maps iOS SDK、ユーザーの現在位置の取得

iOSアプリの場合(iOS7)、アプリの読み込み時にユーザーの現在地を表示する必要があります。Google Maps iOS SDK。私はこれをフォローしています Google Map しかし、私は理解できません。あなたがパスを通過する場合助けてください。

13
Sofeda

そうみたいです Google Maps iOS SDKデバイスの位置にアクセスできません。したがって、CLLocationManagerof iOSを使用して位置を取得する必要があります。

まず、CoreLocation.frameworkプロジェクトへ:

  • Project Navigator
  • プロジェクトを選択してください
  • タブをクリックしますBuild Phases
  • CoreLocation.framework の中に Link Binary with Libraries

あとは、 Appleドキュメント の基本的な例に従うだけです。

  • おそらくCLLocationManagerViewDidLoadを作成します。

    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を使用するとうまく機能します。

実際、iOS向けGoogleMapsがすべての作業を行います。 CoreLocationを直接使用する必要はありません。

あなたがしなければならない唯一のことは、yourMapView.myLocationEnabled = YES;を追加することであり、フレームワークはすべてを行います。 (マップの中心をあなたの位置を除く)。

私がやったこと:私は単に次の手順に従いました documentation 。そして、シドニーを中心とした地図を取得しましたが、ズームアウトして自分の場所に移動した場合(実際のデバイスを使用する場合は、シミュレータツールを使用して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 Maps iOS

段階的なレシピ:

1.)キー文字列をInfo.plistに追加します(ソースコードとして開きます):

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

2.)CLLocationManagerDelegateをView Controllerクラスに追加します。

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マップで位置情報を有効にします。

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

現在の場所がシミュレータに表示されない...実際のデバイスを接続して試してみる

0
Marwa Lamey