ナビゲーション イベントをリッスンする

このガイドでは、ユーザーがルートに沿って移動する際に変化するさまざまなイベントをリッスンして応答できるようにアプリを有効にする方法について説明します。このガイドでは、ルートの定義については説明しません。ルートに沿ったイベントへの応答のみを説明します。

概要

Navigation SDK for iOS には、ユーザーの位置情報、ルート沿いの状況、重要な時間と距離のデータに関連付けられたリスナーが用意されています。地図のビュー コントローラで、アプリはこれらのリスナーのプロトコル(GMSRoadSnappedLocationProviderListener と GMSNavigatorListener)を採用する必要があります。

次のリストは、ナビゲーション イベントで使用できるリスナー メソッドを示しています。

コードの確認

必要なプロトコルへの準拠を宣言する

ナビゲーション メソッドを実装する前に、ビュー コントローラで次のプロトコルを導入する必要があります。

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

Objective-C

@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end

ナビゲーション プロトコルを導入したら、リスナーをビュー コントローラに設定します。たとえば、次のコードを viewDidLoad() メソッドに追加できます。

Swift

mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];

位置情報の更新の受信または停止

地図上にユーザーの進行状況を表示するには、位置情報の更新が必要です。

location インスタンスは、以下のプロパティを公開します。

Location プロパティ 説明
標高 現在の高度。
coordinate.latitude 現在の道路にスナップされた緯度座標。
coordinate.longitude 現在の道路にスナップされた経度座標。
コース 現在の方向(度単位)。
速度 現在の速度。
timestamp 現在の測定値の日時。

位置情報の更新を継続的に受信するには、mapView.roadSnappedLocationProvider.startUpdatingLocation を呼び出し、GMSRoadSnappedLocationProviderListener を使用して didUpdateLocation イベントを処理します。

次の例では、startUpdatingLocation を呼び出しています。

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

次のコードは、didUpdateLocation イベントを処理する GMSRoadSnappedLocationProviderListener を作成します。

Swift

func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider,
                      didUpdate location: CLLocation) {
  print("Location: \(location.description)")
}

Objective-C

- (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
       didUpdateLocation:(CLLocation *)location {
  NSLog(@"Location: %@", location.description);
}

アプリがバックグラウンドで動作しているときに位置情報の更新を受信するには、allowsBackgroundLocationUpdates を true に設定します。

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

到着イベントの検出

アプリは didArriveAtWaypoint イベントを使用して、目的地に到着したことを検出します。continueToNextDestinationWithCompletion() を呼び出してガイダンスを再度有効にすると、ガイダンスを再開して次のウェイポイントに進むことができます。アプリは、continueToNextDestinationWithCompletion() を呼び出した後に、案内を再度有効にする必要があります。

アプリが continueToNextDestinationWithCompletion を呼び出すと、ナビゲーターには以前の目的地に関するデータがなくなります。ルート区間に関する情報を分析する場合は、continueToNextDestinationWithCompletion() を呼び出す前にナビゲーターからこの情報を取得する必要があります。

次のコード例は、didArriveAtWaypoint イベントを処理するメソッドを示しています。

Swift

func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) {
  print("You have arrived at: \(waypoint.title)")
  mapView.navigator?.continueToNextDestinationWithCompletion { _, _ in }
  mapView.navigator?.isGuidanceActive = true
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
  NSLog(@"You have arrived at: %@", waypoint.title);
  [_mapView.navigator continueToNextDestinationWithCompletion:^(GMSNavigationWaypoint *waypoint,
                                                                GMSRouteStatus status){
  }];
  _mapView.navigator.guidanceActive = YES;
}

ルート変更の更新情報を受信する

ルートが変更されるたびに通知を受け取るには、navigatorDidChangeRoute イベントを処理するメソッドを作成します。新しいルートには、GMSNavigator の routeLegs プロパティと currentRouteLeg プロパティを使用してアクセスできます。

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
  print("The route has changed.")
}

Objective-C

- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
  NSLog(@"The route has changed.");
}

目的地までの所要時間の更新情報を受信

目的地までの所要時間の更新を継続的に受信するには、didUpdateRemainingTime イベントを処理するメソッドを作成します。time パラメータは、次の目的地に到着するまでの推定時間を秒単位で提供します。

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time: TimeInterval) {
  print("Time to next destination: \(time)")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator didUpdateRemainingTime:(NSTimeInterval)time {
  NSLog(@"Time to next destination: %f", time);
}

次の目的地までの推定時間の最小変化を設定するには、GMSNavigator の timeUpdateThreshold プロパティを設定します。値は秒単位で指定します。このプロパティが設定されていない場合、サービスはデフォルト値の 1 秒を使用します。

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

目的地までの距離の更新情報を受信する

目的地までの距離の更新を継続的に受信するには、didUpdateRemainingDistance イベントを処理するメソッドを作成します。distance パラメータは、次の目的地までの推定距離(メートル単位)を示します。

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distance: CLLocationDistance)
{
  let miles = distance * 0.00062137
  print("Distance to next destination: \(miles) miles.")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator
    didUpdateRemainingDistance:(CLLocationDistance)distance {
  double miles = distance * 0.00062137;
  NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);
}

次の目的地までの推定距離の最小変化を設定するには、GMSNavigator の distanceUpdateThreshold プロパティを設定します(値はメートル単位で指定します)。このプロパティが設定されていない場合、サービスはデフォルト値の 1 メートルを使用します。

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

交通情報の更新

残りのルートの交通状況の更新を継続的に受信するには、didUpdateDelayCategory イベントを処理するメソッドを作成します。delayCategoryToNextDestination を呼び出すと、0 ~ 3 の値を返す GMSNavigationDelayCategory が返されます。カテゴリの更新は、アプリユーザーの現在の位置に基づいています。トラフィック データが利用できない場合、GMSNavigationDelayCategory は 0 を返します。1 ~ 3 の数字は、経血量が少ない(1)から多い(3)ことを示します。

Swift

func navigator(_ navigator: GMSNavigator,
               didUpdate delayCategory: GMSNavigationDelayCategory)
{
  print("Traffic flow to next destination: \(delayCategory)")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator
    didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
  NSLog(@"Traffic flow to next destination: %ld", (long)delayCategory);
}

GMSNavigationDelayCategory プロパティは、次の遅延レベルを公開します。

遅延カテゴリ 説明
GMSNavigationDelayCategoryNoData 0 - 利用不可、トラフィックまたは
ルート。
GMSNavigationDelayCategoryHeavy 1 - 強い。
GMSNavigationDelayCategoryMedium 2 - 中。
GMSNavigationDelayCategoryLight 3 - 軽度。

速度超過に関する最新情報を受信しています

ドライバーが制限速度を超えたときに最新情報を受け取るには、didUpdateSpeedingPercentage イベントを処理するメソッドを作成します。

Swift

// Listener to handle speeding events.
func navigator(_ navigator: GMSNavigator,
               didUpdateSpeedingPercentage percentageAboveLimit: CGFloat)
{
  print("Speed is \(percentageAboveLimit) above the limit.")
}

Objective-C

// Listener to handle speeding events.
- (void)navigator:(GMSNavigator *)navigator
    didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
  NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit);
}

推奨される照明モードの変更

GMSNavigator は、時刻とデバイスの位置情報に基づいて推奨されるライトモードを計算し、推奨されるモードが変更された場合(日の出や日の入りなど)にのみ didChangeSuggestedLightingMode リスナー メソッドを呼び出します。ユーザーがアプリを起動したときに、地図が適切なライトモードで開始されるようにするには、初期化中にナビゲーターの suggestedLightingMode に mapView.lightingMode を設定し、didChangeSuggestedLightingMode を実装して、その後の変更を処理します。

次の例は、初期ライトモードを設定し、推奨されるライトモードの変更をリッスンする方法を示しています。

Swift

// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal

// Define a listener for suggested changes to lighting mode.
func navigator(_ navigator: GMSNavigator,
               didChangeSuggestedLightingMode lightingMode: GMSNavigationLightingMode)
{
  print("Suggested lighting mode has changed: \(String(describing: lightingMode))")

  // Make the suggested change.
  mapView.lightingMode = lightingMode
}

Objective-C

// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;

// Define a listener for suggested changes to lighting mode.
- (void)navigator:(GMSNavigator *)navigator
    didChangeSuggestedLightingMode:(GMSNavigationLightingMode)lightingMode {
  NSLog(@"Suggested lighting mode has changed: %ld", (long)lightingMode);

  // Make the suggested change.
  _mapView.lightingMode = lightingMode;
}

自動および手動のライトモード構成の詳細については、通常モードと低照度モードを構成するをご覧ください。