現在地ボタンを有効にする

[現在地を有効にする] ボタンの画像。

地図ビューの右下に [現在地] ボタンが表示されます。ユーザーがボタンをタップすると、地図がユーザーの現在地にパンします。

使ってみる

サンプルコードを試す前に、開発環境を構成する必要があります。 詳しくは、Maps SDK for iOS のコードサンプルをご覧ください。

コードを表示する

Swift

import GoogleMaps
import UIKit

class MyLocationViewController: UIViewController {

  private let cameraLatitude: CLLocationDegrees = -33.868

  private let cameraLongitude: CLLocationDegrees = 151.2086

  private let cameraZoom: Float = 12

  lazy var mapView: GMSMapView = {
    let camera = GMSCameraPosition(
      latitude: cameraLatitude, longitude: cameraLongitude, zoom: cameraZoom)
    return GMSMapView(frame: .zero, camera: camera)
  }()

  var observation: NSKeyValueObservation?
  var location: CLLocation? {
    didSet {
      guard oldValue == nil, let firstLocation = location else { return }
      mapView.camera = GMSCameraPosition(target: firstLocation.coordinate, zoom: 14)
    }
  }

  override func viewDidLoad() {
    super.viewDidLoad()

    mapView.delegate = self
    mapView.settings.compassButton = true
    mapView.settings.myLocationButton = true
    mapView.isMyLocationEnabled = true
    view = mapView

    // Listen to the myLocation property of GMSMapView.
    observation = mapView.observe(\.myLocation, options: [.new]) {
      [weak self] mapView, _ in
      self?.location = mapView.myLocation
    }
  }

  deinit {
    observation?.invalidate()
  }
}

extension MyLocationViewController: GMSMapViewDelegate {
  func mapView(_ mapView: GMSMapView, didTapMyLocation location: CLLocationCoordinate2D) {
    let alert = UIAlertController(
      title: "Location Tapped",
      message: "Current location: <\(location.latitude), \(location.longitude)>",
      preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default))
    present(alert, animated: true)
  }
}
      

Objective-C

#import "GoogleMapsDemos/Samples/MyLocationViewController.h"

#import <GoogleMaps/GoogleMaps.h>

@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.delegate = self;
  _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.
  GMSMapView *mapView = _mapView;
  dispatch_async(dispatch_get_main_queue(), ^{
    mapView.myLocationEnabled = YES;
  });
}

- (void)mapView:(GMSMapView *)mapView didTapMyLocation:(CLLocationCoordinate2D)location {
  NSString *message = [NSString stringWithFormat:@"My Location Dot Tapped at: [lat: %f, lng: %f]",
                                                 location.latitude, location.longitude];
  UIAlertController *alertController =
      [UIAlertController alertControllerWithTitle:@"Location Tapped"
                                          message:message
                                   preferredStyle:UIAlertControllerStyleAlert];
  UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK"
                                                     style:UIAlertActionStyleDefault
                                                   handler:^(UIAlertAction *action){
                                                   }];
  [alertController addAction:okAction];
  [self presentViewController:alertController animated:YES completion:nil];
}

- (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 received, then jump to that location.
    _firstLocationUpdate = YES;
    CLLocation *location = [change objectForKey:NSKeyValueChangeNewKey];
    _mapView.camera = [GMSCameraPosition cameraWithTarget:location.coordinate zoom:14];
  }
}

@end
      

完全なサンプルアプリをローカルで実行する

Maps SDK for iOS のサンプルアプリは、GitHub からダウンロード アーカイブとして入手できます。以下の手順に沿って、Maps SDK for iOS のサンプルアプリをインストールして試します。

  1. git clone https://github.com/googlemaps-samples/maps-sdk-for-ios-samples.git を実行して、サンプル リポジトリのクローンをローカル ディレクトリに作成します。
  2. ターミナル ウィンドウを開き、サンプルファイルのクローンを作成したディレクトリに移動して、GoogleMaps ディレクトリにドリルダウンします。

    Swift

    cd maps-sdk-for-ios-samples-main/GoogleMaps-Swift
    pod install
    open GoogleMapsSwiftDemos.xcworkspace

    Objective-C

    cd maps-sdk-for-ios-samples-main/GoogleMaps
    pod install
    open GoogleMapsDemos.xcworkspace
  3. Xcode でコンパイル ボタンを押して、現在のスキームでアプリをビルドします。ビルドでエラーが発生し、Swift の場合は SDKConstants.swift ファイル、Objective-C の場合は SDKDemoAPIKey.h ファイルに API キーを入力するよう求められます。
  4. API キーをまだお持ちでない場合は、手順に沿って Google Cloud コンソールでプロジェクトを設定し、API キーを取得します。Cloud コンソールで鍵を構成するときに、サンプルアプリのバンドル ID に鍵を制限して、アプリのみが鍵を使用できるようにします。SDK サンプルアプリのデフォルトのバンドル ID は com.example.GoogleMapsDemos です。
  5. Swift の場合は SDKConstants.swift ファイルを、Objective-C の場合は SDKDemoAPIKey.h ファイルを編集し、apiKey 定数または kAPIKey 定数の定義に API キーを貼り付けます。次に例を示します。

    Swift

    static let apiKey = "YOUR_API_KEY"

    Objective-C

    static NSString *const kAPIKey = @"YOUR_API_KEY";
  6. SDKConstants.swift ファイル(Swift)または SDKDemoAPIKey.h ファイル(Objective-C)で、次の行を削除します。これは、ユーザー定義の問題の登録に使用される行です。

    Swift

    #error (Register for API Key and insert here. Then delete this line.)

    Objective-C

    #error Register for API Key and insert here.
  7. プロジェクトをビルドして実行します。iOS シミュレータ ウィンドウが表示され、Maps SDK のデモのリストが表示されます。
  8. 表示されたオプションのいずれかを選択して、Maps SDK for iOS の機能を試します。
  9. GoogleMapsDemos に現在地へのアクセスを許可するよう求められたら、[許可] を選択します。