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

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

概要

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

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

コードの確認

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

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

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 イベントを使用して、目的地に到着したことを検出します。continueToNextDestination() を呼び出してガイダンスを再開し、次の経由地に進むことができます。アプリは、continueToNextDestination() を呼び出したにガイダンスを再度有効にする必要があります。

アプリが continueToNextDestination を呼び出すと、ナビゲータは前のデスティネーションに関するデータを保持しなくなります。ルートの区間に関する情報を分析する場合は、continueToNextDestination() を呼び出す前にナビゲーターから取得する必要があります。

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

Swift

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

Objective-C

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

経路変更の更新情報を受け取る

ルートが変更されるたびに通知を受け取るには、navigatorDidChangeRoute イベントを処理するメソッドを作成します。新しいルートには、GMSNavigatorrouteLegs プロパティと 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); }

次の目的地の推定時間の最小変化を設定するには、GMSNavigatortimeUpdateThreshold プロパティを設定します。値は秒単位で指定します。このプロパティが設定されていない場合、サービスはデフォルト値の 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]); }

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

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

交通情報の受信

残りのルートの交通状況の継続的な更新を受け取るには、didUpdateDelayCategory イベントを処理するメソッドを作成します。delayCategoryToNextDestination の呼び出しは、0 ~ 3 の値を提供する GMSNavigationDelayCategory を返します。カテゴリの更新は、アプリユーザーの現在の位置情報に基づいて行われます。トラフィック データが利用できない場合、GMSNavigationDelayCategory は 0 を返します。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 - Light。

速度超過の更新情報を受け取る

ドライバーが制限速度を超えたときに更新を受け取るには、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); }

おすすめの照明モードを変更する

推定される照明の変化に関する更新情報を受け取るには、didChangeSuggestedLightingMode イベントを処理するメソッドを作成します。

Swift

// 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

// 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; }