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

Hãy sử dụng hướng dẫn này để cho phép ứng dụng của bạn lắng nghe và phản hồi nhiều sự kiện 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 đề cập đến việc xác định một tuyến đường, mà chỉ đề cập đến việc phản hồi các sự kiện dọc theo một tuyến đường.

Tổng quan

Navigation SDK cho iOS cung cấp cho bạn các 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, cũng như dữ liệu quan trọng về thời gian và khoảng cách. Trên trình điều khiển khung hiển thị của bản đồ, ứng dụng của bạn cần áp dụng các 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 sự 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, bộ điều khiển khung hiển thị phải áp dụng các giao thức:

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

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

Swift

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

Objective-C

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

Nhận hoặc ngừng nhận thông tin cập nhật về vị trí

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

Đối tượng 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 gắn vào đường.
coordinate.longitude Toạ độ kinh độ hiện tại được gắn vào đường.
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 chỉ số hiện tại.

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

Ví dụ sau đây minh hoạ cách gọi startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

Đoạn mã sau đây tạo ra 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 ở chế độ 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 sử dụng sự kiện didArriveAtWaypoint để phát hiện thời điểm đạt đến một đích đến. Bạn có thể tiếp tục chỉ dẫn và chuyển sang điểm tham chiếu tiếp theo bằng cách gọi continueToNextDestination(), sau đó bật lại chỉ dẫn. Ứng dụng của bạn phải bật lại chỉ dẫn sau khi gọi continueToNextDestination().

Sau khi ứng dụng gọi continueToNextDestination, trình điều hướng sẽ không còn dữ liệu về đích đến trước đó nữa. Nếu muốn phân tích thông tin về một đoạn đường, bạn phải truy xuất thông tin 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ý sự kiện 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; }

Nhận thông tin cập nhật về 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 vào tuyến đường mới bằng cách sử dụng các 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 đến đích

Để nhận thông tin cập nhật liên tục về thời gian đến đích đến, hãy tạo một phương thức để xử lý sự kiện didUpdateRemainingTime. Tham số time cung cấp thời gian ước tính (tính bằng giây) cho đến khi đạt được đích đế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 mức thay đổi tối thiểu về thời gian ước tính đến điểm đến tiếp theo, hãy đặt thuộc tính timeUpdateThreshold trên GMSNavigator. Giá trị được chỉ định bằng 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à một giây.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

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

Để nhận thông tin cập nhật liên tục về khoảng cách đến đích đế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) đến đích đế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 mức thay đổi tối thiểu về khoảng cách ước tính đến đích đến tiếp theo, hãy đặt thuộc tính distanceUpdateThreshold trên GMSNavigator (giá trị được chỉ định bằng 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 mét.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Nhận thông tin cập nhật về tình hình giao thông

Để nhận thông tin cập nhật liên tục về lưu lượng giao thông cho tuyến đường còn lại, hãy tạo một phương thức để xử lý sự kiện didUpdateDelayCategory. Lệnh gọi đến delayCategoryToNextDestination sẽ trả về GMSNavigationDelayCategory cung cấp giá trị từ 0 đến 3. Thông tin cập nhật về danh mục dựa trên vị trí hiện tại 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 sẽ trả về 0. Các số từ 1 đến 3 cho biết lượng kinh nguyệt tăng dần từ ít đến nhiều.

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 cho thấy các mức độ trễ sau:

Danh mục trì hoãn 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 – Nặng.
GMSNavigationDelayCategoryMedium 2 – Trung bình.
GMSNavigationDelayCategoryLight 3 – Nhẹ.

Nhận thông tin cập nhật về tốc độ

Để nhận thông tin cập nhật khi một 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ế độ chiếu sáng được đề xuất

Để nhận thông tin cập nhật về các 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; }