Hãy làm theo hướng dẫn này để vẽ một tuyến đường trong ứng dụng của bạn đến một điểm đến, bằng cách sử dụng SDK Điều hướng cho iOS.
Tổng quan
- Tích hợp SDK Điều hướng vào ứng dụng của bạn, như mô tả trong phần Thiết lập dự án.
- Định cấu hình
GMSMapView. - Nhắc người dùng chấp nhận các điều khoản và điều kiện, đồng thời cho phép dịch vụ vị trí và thông báo trong nền.
- Tạo một mảng chứa một hoặc nhiều đích đến.
Xác định
GMSNavigatorđể kiểm soát đường đi từng chặng.- Thêm đích đến bằng
setDestinations. - Đặt
isGuidanceActivethànhtrueđể bắt đầu đi theo chỉ dẫn. - Sử dụng
simulateLocationsAlongExistingRouteđể mô phỏng tiến trình của xe dọc theo tuyến đường, nhằm mục đích kiểm thử, gỡ lỗi và minh hoạ ứng dụng của bạn.
- Thêm đích đến bằng
Xem mã
Nhắc người dùng cấp các quyền cần thiết
Trước khi sử dụng SDK Điều hướng, người dùng phải đồng ý với các điều khoản và điều kiện, đồng thời cho phép sử dụng dịch vụ vị trí (bắt buộc để điều hướng). Nếu ứng dụng của bạn chạy ở chế độ nền, thì ứng dụng đó cũng phải nhắc người dùng cho phép thông báo cảnh báo hướng dẫn. Phần này cho biết cách hiển thị lời nhắc uỷ quyền bắt buộc.
Cho phép dịch vụ vị trí
SDK Điều hướng sử dụng dịch vụ vị trí, nên cần có sự cho phép của người dùng. Để bật dịch vụ vị trí và hiển thị hộp thoại uỷ quyền, hãy làm theo các bước sau:
Bật các chức năng vị trí và nền trong Xcode:
- Mở mục tiêu trong Xcode rồi chọn thẻ Signing & Capabilities (Ký và các chức năng). Để biết thông tin chi tiết, hãy xem hướng dẫn của Apple về cách thêm tính năng vào ứng dụng.
- Thêm các chức năng Vị trí (Luôn luôn) và Vị trí (Khi đang sử dụng). Trong trường văn bản cho mỗi mục, hãy thêm nội dung giải thích ngắn gọn về lý do ứng dụng của bạn yêu cầu dịch vụ vị trí (ví dụ: "Ứng dụng này cần có quyền sử dụng dịch vụ vị trí để chỉ đường từng chặng").
- Thêm chức năng Background Modes (Chế độ nền), sau đó chọn hộp đánh dấu Location updates (Thông tin cập nhật về vị trí). Nếu không có chức năng này, ứng dụng sẽ gặp sự cố khi bắt đầu điều hướng. Để biết thông tin chi tiết, hãy xem hướng dẫn của Apple về cách xử lý thông báo cập nhật vị trí ở chế độ nền.
Để hiển thị hộp thoại uỷ quyền, hãy gọi phương thức
requestAlwaysAuthorization()của thực thể trình quản lý vị trí.
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
Xem toàn bộ tài liệu của Apple về việc uỷ quyền cho dịch vụ vị trí.
Cho phép thông báo cảnh báo cho tính năng hướng dẫn trong nền
SDK Điều hướng cần có sự cho phép của người dùng để cung cấp thông báo cảnh báo khi ứng dụng đang chạy ở chế độ nền. Thêm mã sau đây để nhắc người dùng cấp quyền hiển thị các thông báo này:
Swift
UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
granted, error in
// Handle denied authorization to display notifications.
if !granted || error != nil {
print("User rejected request to display notifications.")
}
}
Objective-C
// Request authorization for alert notifications.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options
completionHandler:
^(
BOOL granted,
NSError *_Nullable error) {
if (!error && granted) {
NSLog(@"iOS Notification Permission: newly Granted");
} else {
NSLog(@"iOS Notification Permission: Failed or Denied");
}
}];
Cho phép sử dụng cảm biến chuyển động
Trong một bản phát hành chính trong tương lai, SDK Điều hướng cho iOS sẽ kết hợp dữ liệu vị trí cốt lõi với
cảm biến chuyển động của thiết bị (CMAltimeter) để tính toán độ cao của tuyến đường. Khi SDK truy cập vào cao độ kế, iOS sẽ tự động sử dụng chuỗi này để nhắc người dùng cấp quyền.
Việc thêm khoá này hiện không ảnh hưởng đến hành vi hiện tại nhưng sẽ ngăn chặn sự cố khởi chạy khi bạn nâng cấp SDK sau này.
Để chuẩn bị cho các bản nâng cấp SDK trong tương lai, hãy định cấu hình quyền cho cảm biến chuyển động như sau:
Mở mục tiêu trong Xcode rồi chuyển đến thẻ Info (Thông tin) hoặc mở tệp
Info.plist.Thêm một khoá mới: Privacy – Motion Usage Description (Quyền riêng tư – Nội dung mô tả về việc sử dụng chuyển động) (
NSMotionUsageDescription).Thêm nội dung giải thích ngắn gọn cho người dùng. Ví dụ: "Ứng dụng này cần có quyền truy cập vào cảm biến chuyển động để tính toán độ cao và cải thiện độ chính xác của tuyến đường trên bản đồ".
Chấp nhận các điều khoản và điều kiện
Sử dụng mã sau để hiển thị hộp thoại điều khoản và điều kiện, đồng thời bật tính năng chỉ đường khi người dùng chấp nhận các điều khoản. Xin lưu ý rằng ví dụ này bao gồm mã cho dịch vụ vị trí và thông báo cảnh báo hướng dẫn (đã trình bày trước đó).
Swift
let termsAndConditionsOptions = GMSNavigationTermsAndConditionsOptions(companyName: "Ride Sharing Co.")
GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
with: termsAndConditionsOptions) { termsAccepted in
if termsAccepted {
// Enable navigation if the user accepts the terms.
self.mapView.isNavigationEnabled = true
self.mapView.settings.compassButton = true
// Request authorization to use location services.
self.locationManager.requestAlwaysAuthorization()
// Request authorization for alert notifications which deliver guidance instructions
// in the background.
UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
granted, error in
// Handle rejection of notification authorization.
if !granted || error != nil {
print("Authorization to deliver notifications was rejected.")
}
}
} else {
// Handle rejection of terms and conditions.
}
}
Objective-C
GMSNavigationTermsAndConditionsOptions *termsAndConditionsOptions = [[GMSNavigationTermsAndConditionsOptions alloc] initWithCompanyName:@"Ride Sharing Co."];
[GMSNavigationServices
showTermsAndConditionsDialogIfNeededWithOptions:termsAndConditionsOptions
callback:^(BOOL termsAccepted) {
if (termsAccepted) {
// Enable navigation if the user accepts the terms.
_mapView.navigationEnabled = YES;
_mapView.settings.compassButton = YES;
// Request authorization to use the current device location.
[_locationManager requestAlwaysAuthorization];
// Request authorization for alert notifications which deliver guidance instructions
// in the background.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options
completionHandler:
^(
BOOL granted,
NSError *_Nullable error) {
if (!error && granted) {
NSLog(@"iOS Notification Permission: newly Granted");
} else {
NSLog(@"iOS Notification Permission: Failed or Denied");
}
}];
} else {
// Handle rejection of the terms and conditions.
}
}];
Tạo tuyến đường và bắt đầu hướng dẫn
Để vẽ tuyến đường, hãy gọi phương thức setDestinations của trình điều hướng bằng một mảng gồm một hoặc nhiều điểm đến GMSNavigationWaypoint cần ghé thăm. Nếu tuyến đường được tính toán thành công, tuyến đường đó sẽ xuất hiện trên bản đồ. Để bắt đầu hướng dẫn dọc theo tuyến đường, hãy đặt isGuidanceActive thành true trong lệnh gọi lại.
Ví dụ sau đây cho thấy:
- Tạo tuyến đường mới có một điểm đến.
- Bắt đầu hướng dẫn.
- Bật thông báo hướng dẫn trong nền.
- Mô phỏng hành trình dọc theo tuyến đường (không bắt buộc).
- Đặt chế độ camera thành "theo dõi" (không bắt buộc).
Swift
func startNav() {
var destinations = [GMSNavigationWaypoint]()
destinations.append(GMSNavigationWaypoint.init(placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
title: "PCC Natural Market")!)
mapView.navigator?.setDestinations(destinations) { routeStatus in
self.mapView.navigator?.isGuidanceActive = true
self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
self.mapView.cameraMode = .following
}
}
Objective-C
- (void)startNav {
NSArray<GMSNavigationWaypoint *> *destinations =
@[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
title:@"PCC Natural Market"]];
[_mapView.navigator setDestinations:destinations
callback:^(GMSRouteStatus routeStatus){
[_mapView.locationSimulator simulateLocationsAlongExistingRoute];
_mapView.navigator.guidanceActive = YES;
_mapView.cameraMode = GMSNavigationCameraModeFollowing;
}];
}
Để tìm hiểu về Mã địa điểm, hãy tham khảo bài viết Mã địa điểm.
Trường hợp có nhiều điểm dừng
Bạn có thể thiết lập tối đa 25 điểm tham chiếu.
Phương thức setDestinations không hỗ trợ hành trình có nhiều điểm dừng. Sử dụng continueToNextDestinationWithCompletion() để chuyển điểm tham chiếu sang chặng tiếp theo của hành trình.
Đặt chế độ di chuyển
Phương thức di chuyển xác định cả loại tuyến đường cần tìm nạp và cách xác định lộ trình của người dùng. Bạn có thể đặt một trong bốn phương thức di chuyển cho một tuyến đường: lái xe, đạp xe, đi bộ và đi taxi. Ở chế độ lái xe và đi taxi, hướng đi của người dùng dựa trên hướng di chuyển; ở chế độ đi xe đạp và đi bộ, hướng đi được thể hiện bằng hướng mà thiết bị đang hướng tới (về phía trên cùng của thiết bị ở chế độ ngang).
Đặt thuộc tính travelMode của chế độ xem bản đồ, như trong ví dụ sau:
Swift
self.mapView.travelMode = .cycling
Objective-C
_mapView.travelMode = GMSNavigationTravelModeCycling;
Đặt đường cần tránh
Sử dụng các thuộc tính avoidsHighways và avoidsTolls BOOL để tránh đường cao tốc, đường có thu phí hoặc cả hai dọc theo một tuyến đường.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
Đặt âm lượng cho hướng dẫn bằng âm thanh
Để điều chỉnh âm lượng hướng dẫn bằng giọng nói, hãy đặt thuộc tính volumeLevel trên trình điều hướng thành thấp, bình thường hoặc cao. Trình điều hướng sử dụng mức âm lượng được duy trì gần đây nhất hoặc mặc định là bình thường.
Swift
self.mapView.navigator?.volumeLevel = .low
Objective-C
_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;
Công cụ tìm mã địa điểm
Bạn có thể sử dụng Trình tìm mã địa điểm để tìm mã địa điểm dùng cho các điểm đến trên tuyến đường. Thêm đích đến từ một
placeID bằng GMSNavigationWaypoint.
Văn bản nổi
Bạn có thể thêm văn bản nổi ở bất cứ đâu trong ứng dụng, miễn là không che mất thông tin ghi nhận tác giả của Google. Navigation SDK không hỗ trợ việc neo văn bản vào toạ độ cụ thể (vĩ độ, kinh độ) trên bản đồ hoặc vào nhãn. Để biết thêm thông tin, hãy xem phần Cửa sổ thông tin.