Nghe sự kiện điều hướng

Hãy dùng hướng dẫn này để cho phép ứng dụng của bạn nghe và phản hồi nhiều sự kiện sự thay đổi đó khi người dùng di chuyển dọc theo một tuyến đường. Hướng dẫn này không bao gồm xác định một tuyến đường, chỉ phản hồi các sự kiện dọc theo một tuyến đường.

Tổng quan

SDK điều hướng dành cho iOS cung cấp cho bạn trình nghe được liên kết với vị trí của người dùng và các điều kiện dọc theo tuyến đường và dữ liệu quan trọng về thời gian và khoảng cách. Trên trình điều khiển chế độ xem của bản đồ, ứng dụng của bạn cần phải áp dụng giao thức cho những trình nghe này: GMSRoadSnappedLocationProviderListenerGMSNavigatorListener.

Danh sách này cho biết các phương thức trình nghe có sẵn cho sự kiện điều hướng:

Xem mã

Khai báo tuân thủ các giao thức bắt buộc

Trước khi triển khai các phương thức điều hướng, trình điều khiển chế độ xem phải áp dụng giao thức:

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

Sau khi áp dụng giao thức điều hướng, đặt trình nghe thành chế độ xem thiết bị điều khiển. Ví dụ: bạn có thể thêm mã sau vào viewDidLoad() .

Swift

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

Objective-C

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

Nhận hoặc dừng thông báo cập nhật vị trí

Bạn cần cập nhật vị trí để hiển thị tiến trình của người dùng trên bản đồ.

Thực thể location hiển thị các thuộc tính sau:

Thuộc tính vị trí Mô tả
độ cao Cao độ hiện tại.
coordinate.latitude Toạ độ theo vĩ độ hiện tại của đường.
coordinate.longitude Toạ độ theo kinh độ hiện tại trên đường đã xác định.
khoá học Góc phương vị hiện tại tính bằng độ.
tốc độ Tốc độ hiện tại.
dấu thời gian Ngày/giờ của lần đọc hiện tại.

Để liên tục nhận thông tin cập nhật vị trí, hãy gọi mapView.roadSnappedLocationProvider.startUpdatingLocation và sử dụng GMSRoadSnappedLocationProviderListener để xử lý didUpdateLocation sự kiện.

Ví dụ sau đây cho thấy cách gọi startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

Đoạn mã sau đây sẽ tạo một GMSRoadSnappedLocationProviderListener xử lý sự kiện didUpdateLocation.

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

Để nhận thông báo cập nhật vị trí khi ứng dụng chạy trong nền, hãy đặt allowsBackgroundLocationUpdates thành true:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Phát hiện sự kiện đến

Ứng dụng của bạn dùng sự kiện didArriveAtWaypoint để phát hiện thời điểm một đích đến có . Bạn có thể tiếp tục hướng dẫn và chuyển đến điểm tham chiếu tiếp theo bằng cách gọi continueToNextDestination(), sau đó bật lại hướng dẫn. Ứng dụng của bạn phải bật lại hướng dẫn sau khi gọi continueToNextDestination().

Sau khi ứng dụng gọi continueToNextDestination, trình điều hướng không còn dữ liệu về đích đến trước đó. Nếu muốn phân tích thông tin về một chặng đi, bạn phải truy xuất chặng này từ trình điều hướng trước khi gọi continueToNextDestination().

Ví dụ về mã sau đây cho thấy một phương thức để xử lý didArriveAtWaypoint sự kiện:

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

Đang nhận thông tin cập nhật về việc thay đổi tuyến đường

Để nhận thông báo mỗi khi tuyến đường thay đổi, hãy tạo một phương thức để xử lý sự kiện navigatorDidChangeRoute. Bạn có thể truy cập tuyến đường mới bằng cách bằng cách sử dụng thuộc tính routeLegscurrentRouteLeg của GMSNavigator.

Swift

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

Objective-C

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

Nhận thông tin cập nhật về thời gian tới điểm đến

Để nhận được thông tin cập nhật liên tục về điểm đến, hãy tạo một phương thức để xử lý Sự kiện didUpdateRemainingTime. Tham số time cung cấp giá trị ước tính tính bằng giây cho đến khi đạt được điểm đến tiếp theo.

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

Để đặt thay đổi tối thiểu về thời gian dự kiến cho điểm đến tiếp theo, hãy đặt giá trị Tài sản timeUpdateThreshold trên GMSNavigator. Giá trị được chỉ định trong giây. Nếu bạn không đặt thuộc tính này, các dịch vụ sẽ sử dụng giá trị mặc định là 1 giây.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Đang nhận thông tin cập nhật về khoảng cách tới điểm đến

Để nhận thông tin cập nhật về quãng đường liên tục đến điểm đến, hãy tạo một phương thức để xử lý sự kiện didUpdateRemainingDistance. Tham số distance cung cấp khoảng cách ước tính (tính bằng mét) tới điểm đến tiếp theo.

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]); }

Để đặt thay đổi tối thiểu về khoảng cách ước tính đến điểm đến tiếp theo, hãy đặt Thuộc tính distanceUpdateThreshold trên GMSNavigator (giá trị được chỉ định trong mét). Nếu bạn không đặt thuộc tính này, các dịch vụ sẽ sử dụng giá trị mặc định là 1 định mức.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Đang nhận thông tin cập nhật về lưu lượng truy cập

Để nhận được thông tin cập nhật liên tục về luồng giao thông cho tuyến đường còn lại, tạo một phương thức để xử lý sự kiện didUpdateDelayCategory. Cuộc gọi đến delayCategoryToNextDestination trả về GMSNavigationDelayCategory cung cấp giá trị từ 0 đến 3. Nội dung cập nhật cho danh mục dựa trên dữ liệu hiện tại vị trí của người dùng ứng dụng. Nếu không có dữ liệu lưu lượng truy cập, GMSNavigationDelayCategory trả về 0. Các con số, từ 1 đến 3, cho biết mức tăng chuyển từ nhẹ đến to.

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

Thuộc tính GMSNavigationDelayCategory đưa ra các mức độ trễ sau đây:

Danh mục độ trễ Mô tả
GMSNavigationDelayCategoryNoData 0 – Không có sẵn, không có dữ liệu về lưu lượng truy cập hoặc :
tuyến đường đó.
GMSNavigationDelayCategoryHeavy 1 – Nhiều.
GMSNavigationDelayCategoryMedium 2 – Trung bình.
GMSNavigationDelayCategoryLight 3 – Ít.

Đang nhận bản cập nhật tốc độ

Để nhận thông tin cập nhật khi người lái xe vượt quá giới hạn tốc độ, hãy tạo một phương thức để xử lý sự kiện 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); }

Thay đổi chế độ ánh sáng đề xuất

Để nhận thông tin cập nhật về những thay đổi ước tính về ánh sáng, hãy tạo một phương thức để xử lý sự kiện 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; }