Hãy sử 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 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 tuyến đường mà chỉ đề cập đến việc phản hồi các sự kiện dọc theo tuyến đường.
Tổng quan
SDK Điều hướng cho iOS cung cấp cho bạn trình nghe
liên quan đến 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 bộ điều khiển chế độ xem 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 sau: GMSRoadSnappedLocationProviderListener và GMSNavigatorListener.
Danh sách này cho thấy các phương thức trình nghe có sẵn cho sự kiện điều hướng:
GMSNavigatorListener.didArriveAtWaypoint, được kích hoạt khi đến một đích đến.GMSNavigatorListener.navigatorDidChangeRoute, được kích hoạt khi tuyến đường thay đổi.GMSNavigatorListener.didUpdateRemainingTime, được gọi nhiều lần khi thời gian đến điểm đến tiếp theo thay đổi, trong khi hướng dẫn đang hoạt động.GMSNavigatorListener.didUpdateRemainingDistance, được gọi nhiều lần khi khoảng cách đến điểm đến tiếp theo thay đổi, trong khi hướng dẫn đang hoạt động.GMSNavigatorListener.didUpdateDelayCategory, được gọi khi danh mục độ trễ đến điểm đến tiếp theo thay đổi, trong khi hướng dẫn đang hoạt động.GMSNavigatorListener.didChangeSuggestedLightingMode, được kích hoạt khi điều kiện ánh sáng ước tính được cập nhật. Ví dụ: khi màn đêm buông xuống tại vị trí hiện tại của người dùng, ánh sáng sẽ thay đổi.GMSNavigatorListener.didUpdateSpeedingPercentage, được kích hoạt khi tài xế vượt quá giới hạn tốc độ.GMSRoadSnappedLocationProviderListener.didUpdateLocation, được gọi nhiều lần khi vị trí của người dùng thay đổi.
Xem mã
Khai báo việc 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 chế độ xem 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 dừng thông báo cập nhật vị trí
Bạn cần có thông báo cập nhật vị trí để cho thấy 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ạ độ vĩ độ hiện tại được điều chỉnh theo đường. |
| coordinate.longitude | Toạ độ kinh độ hiện tại được điều chỉnh theo đườ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. |
| timestamp | Ngày/giờ của chỉ số hiện tại. |
Để nhận thông báo cập nhật vị trí liên tục, hãy gọi mapView.roadSnappedLocationProvider.startUpdatingLocation và sử dụng GMSRoadSnappedLocationProviderListener để xử lý sự kiện didUpdateLocation.
Ví dụ sau đây cho thấy cách gọi startUpdatingLocation:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
Objective-C
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
Mã sau đây 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ế độ 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 nơi
Ứng dụng của bạn sử dụng sự kiện didArriveAtWaypoint để phát hiện thời điểm đã đến đích. 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 continueToNextDestinationWithCompletion(), 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 continueToNextDestinationWithCompletion().
Sau khi ứng dụng gọi continueToNextDestinationWithCompletion, trình điều hướng sẽ 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 của tuyế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 continueToNextDestinationWithCompletion().
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?.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;
}
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 mới bằng cách sử dụng các thuộc tính routeLegs và currentRouteLeg 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 điểm đến
Để nhận thông tin cập nhật liên tục về thời gian đến đích, 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 đến đ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 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 đ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) đến đ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 mức 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 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 truy cập 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. Nội dung cập nhật cho 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, hàm 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ễ | Mô tả |
|---|---|
| GMSNavigationDelayCategoryNoData | 0 – Không có, 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 tài xế 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);
}
Đang thay đổi chế độ ánh sáng được đề xuất
GMSNavigator tính toán chế độ sáng được đề xuất dựa trên thời gian trong ngày và vị trí của thiết bị, đồng thời gọi phương thức trình nghe didChangeSuggestedLightingMode chỉ khi chế độ được đề xuất thay đổi (chẳng hạn như lúc bình minh hoặc hoàng hôn). Để đảm bảo bản đồ bắt đầu bằng chế độ sáng thích hợp khi người dùng khởi chạy ứng dụng, hãy đặt mapView.lightingMode thành suggestedLightingMode của trình điều hướng trong quá trình khởi chạy và triển khai didChangeSuggestedLightingMode để xử lý các thay đổi tiếp theo.
Ví dụ sau đây cho thấy cách đặt chế độ sáng ban đầu và theo dõi các thay đổi về chế độ sáng được đề xuất:
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;
}
Để biết thêm thông tin về cách định cấu hình chế độ chiếu sáng tự động và thủ công, hãy xem phần Định cấu hình chế độ bình thường và chế độ ánh sáng yếu.