ทำตามคู่มือนี้เพื่อวางแผนเส้นทางภายในแอปไปยังปลายทางเดียวโดยใช้ Navigation SDK สำหรับ iOS
ภาพรวม
- ผสานรวม Navigation SDK เข้ากับแอปตามที่อธิบายไว้ใน ส่วนตั้งค่าโปรเจ็กต์
- กำหนดค่า
GMSMapView - แจ้งให้ผู้ใช้ยอมรับข้อกำหนดและเงื่อนไข รวมถึงให้สิทธิ์บริการตำแหน่งและการแจ้งเตือนเบื้องหลัง
- สร้างอาร์เรย์ที่มีปลายทางอย่างน้อย 1 รายการ
กำหนด
GMSNavigatorเพื่อควบคุมการนำทางแบบเลี้ยวต่อเลี้ยว- เพิ่มปลายทางโดยใช้
setDestinations. - ตั้งค่า
isGuidanceActiveเป็นtrueเพื่อเริ่มการนำทาง - ใช้
simulateLocationsAlongExistingRouteเพื่อจำลองความคืบหน้าของยานพาหนะตามเส้นทางสำหรับการทดสอบ การแก้ไขข้อบกพร่อง และการสาธิตแอป
- เพิ่มปลายทางโดยใช้
ดูโค้ด
แจ้งให้ผู้ใช้ให้สิทธิ์ที่จำเป็น
ก่อนใช้ Navigation SDK ผู้ใช้ต้องยอมรับข้อกำหนดและเงื่อนไข รวมถึงให้สิทธิ์ใช้บริการตำแหน่ง ซึ่งจำเป็นสำหรับการนำทาง หากแอปจะทำงานในเบื้องหลัง แอปจะต้องแจ้งให้ผู้ใช้ให้สิทธิ์การแจ้งเตือนคำแนะนำด้วย ส่วนนี้จะแสดงวิธีแสดงข้อความแจ้งขอสิทธิ์ที่จำเป็น
ให้สิทธิ์บริการตำแหน่ง
Navigation SDK ใช้บริการตำแหน่ง ซึ่งต้องมีการให้สิทธิ์จากผู้ใช้ หากต้องการเปิดใช้บริการตำแหน่งและแสดงกล่องโต้ตอบการให้สิทธิ์ ให้ทำตามขั้นตอนต่อไปนี้
เปิดใช้ความสามารถด้านตำแหน่งและเบื้องหลังใน Xcode โดยทำดังนี้
- เปิดเป้าหมายใน Xcode แล้วเลือกแท็บการลงชื่อและการทำงาน ดูรายละเอียดได้ในคู่มือของ Apple เกี่ยวกับการเพิ่มความสามารถลงในแอป
- เพิ่มความสามารถตำแหน่ง (ตลอดเวลา) และตำแหน่ง (ขณะใช้งาน) ในช่องข้อความของแต่ละความสามารถ ให้เพิ่มคำอธิบายสั้นๆ เกี่ยวกับเหตุผลที่แอปต้องใช้บริการตำแหน่ง (เช่น "แอปนี้ต้องได้รับอนุญาตให้ใช้บริการตำแหน่งสำหรับการนำทางแบบเลี้ยวต่อเลี้ยว")
- เพิ่มความสามารถโหมดเบื้องหลัง แล้วเลือกช่องทำเครื่องหมายการอัปเดตตำแหน่ง หากไม่มีความสามารถนี้ แอปจะหยุดทำงานเมื่อเริ่มการนำทาง ดูรายละเอียดได้ในคู่มือของ Apple เกี่ยวกับ การจัดการการอัปเดตตำแหน่งในเบื้องหลัง
หากต้องการแสดงกล่องโต้ตอบการให้สิทธิ์ ให้เรียกใช้
requestAlwaysAuthorization()เมธอดของอินสแตนซ์ตัวจัดการตำแหน่ง
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
ดูเอกสารฉบับเต็มของ Apple เกี่ยวกับการให้สิทธิ์บริการตำแหน่ง
ให้สิทธิ์การแจ้งเตือนสำหรับการนำทางเบื้องหลัง
Navigation SDK ต้องได้รับการให้สิทธิ์จากผู้ใช้ในการแสดงการแจ้งเตือนเมื่อแอปทำงานในเบื้องหลัง เพิ่มโค้ดต่อไปนี้เพื่อแจ้งให้ผู้ใช้ให้สิทธิ์แสดงการแจ้งเตือนเหล่านี้
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");
}
}];
ให้สิทธิ์เซ็นเซอร์ตรวจจับการเคลื่อนไหว
ในรุ่นหลักที่จะเปิดตัวในอนาคต Navigation SDK สำหรับ iOS จะรวมข้อมูลตำแหน่งหลักเข้ากับเซ็นเซอร์ตรวจจับการเคลื่อนไหวของอุปกรณ์ (CMAltimeter) เพื่อคำนวณความสูงของการกำหนดเส้นทาง เมื่อ SDK เข้าถึงมาตรวัดความสูง iOS จะใช้สตริงนี้โดยอัตโนมัติเพื่อแจ้งให้ผู้ใช้ให้สิทธิ์
การเพิ่มคีย์นี้ในตอนนี้จะไม่มีผลต่อลักษณะการทำงานปัจจุบัน แต่จะป้องกันไม่ให้เกิดข้อผิดพลาดในการเริ่มต้นเมื่อคุณอัปเกรด SDK ในภายหลัง
หากต้องการเตรียมพร้อมสำหรับการอัปเกรด SDK ในอนาคต ให้กำหนดค่าการให้สิทธิ์เซ็นเซอร์ตรวจจับการเคลื่อนไหวดังนี้
เปิดเป้าหมายใน Xcode แล้วไปที่แท็บข้อมูล หรือเปิดไฟล์
Info.plistเพิ่มคีย์ใหม่: ความเป็นส่วนตัว - คำอธิบายการใช้งานการเคลื่อนไหว (
NSMotionUsageDescription)เพิ่มคำอธิบายสั้นๆ สำหรับผู้ใช้ เช่น "แอปนี้ต้องได้รับอนุญาตให้เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหวเพื่อคำนวณความสูงและปรับปรุงความแม่นยำของการกำหนดเส้นทางบนแผนที่"
ยอมรับข้อกำหนดและเงื่อนไข
ใช้โค้ดต่อไปนี้เพื่อแสดงกล่องโต้ตอบข้อกำหนดและเงื่อนไข และเปิดใช้การนำทางเมื่อผู้ใช้ยอมรับข้อกำหนด โปรดทราบว่าตัวอย่างนี้มีโค้ดสำหรับบริการตำแหน่งและการแจ้งเตือนคำแนะนำ (ที่แสดงไว้ก่อนหน้านี้)
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.
}
}];
สร้างเส้นทางและเริ่มการนำทาง
หากต้องการวางแผนเส้นทาง ให้เรียกใช้เมธอด setDestinations ของ Navigator ด้วยอาร์เรย์ของ
ปลายทางอย่างน้อย
GMSNavigationWaypoint
1 รายการที่จะไป หากคำนวณเส้นทางได้สำเร็จ เส้นทางจะปรากฏบนแผนที่ หากต้องการเริ่มการนำทางตามเส้นทาง ให้ตั้งค่า isGuidanceActive เป็น true ในการเรียกกลับ
ตัวอย่างต่อไปนี้แสดงสิ่งต่อไปนี้
- การสร้างเส้นทางใหม่ที่มีปลายทาง 1 แห่ง
- การเริ่มการนำทาง
- การเปิดใช้การแจ้งเตือนการนำทางเบื้องหลัง
- การจำลองการเดินทางตามเส้นทาง (ไม่บังคับ)
- การตั้งค่าโหมดกล้องเป็น "ติดตาม" (ไม่บังคับ)
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;
}];
}
ดูข้อมูลเกี่ยวกับรหัสสถานที่ได้ที่รหัสสถานที่
สถานการณ์จำลองที่มีหลายจุดแวะพัก
คุณกำหนดค่าจุดแวะพักได้สูงสุด 25 จุด
เมธอด setDestinations ไม่รองรับการเดินทางที่มีหลายจุดแวะพัก ใช้
continueToNextDestinationWithCompletion()
เพื่อเลื่อนจุดแวะพักไปยังส่วนถัดไปของการเดินทาง
ตั้งโหมดการเดินทาง
โหมดการเดินทางจะกำหนดทั้งประเภทเส้นทางที่จะดึงข้อมูลและวิธีพิจารณาเส้นทางของผู้ใช้ คุณสามารถตั้งค่าโหมดการเดินทางได้ 4 โหมดสำหรับเส้นทาง ได้แก่ การขับรถ การปั่นจักรยาน การเดิน และการใช้บริการแท็กซี่ ในโหมดการขับรถและการใช้บริการแท็กซี่ เส้นทางของผู้ใช้จะอิงตามทิศทางการเดินทาง ส่วนในโหมดการปั่นจักรยานและการเดิน เส้นทางจะแสดงด้วยทิศทางที่อุปกรณ์หันไป (ไปทางด้านบนของอุปกรณ์ในโหมดแนวนอน)
ตั้งค่าพร็อพเพอร์ตี้
travelMode
ของมุมมองแผนที่ตามที่แสดงในตัวอย่างต่อไปนี้
Swift
self.mapView.travelMode = .cycling
Objective-C
_mapView.travelMode = GMSNavigationTravelModeCycling;
ตั้งค่าถนนที่จะหลีกเลี่ยง
ใช้พร็อพเพอร์ตี้ avoidsHighways และ avoidsTolls BOOL เพื่อหลีกเลี่ยงทางหลวง ถนนที่มีค่าผ่านทาง หรือทั้ง 2 อย่างตามเส้นทาง
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
ตั้งระดับเสียงของการนำทางด้วยเสียง
หากต้องการปรับระดับเสียงของการนำทางด้วยเสียง ให้ตั้งค่าพร็อพเพอร์ตี้ volumeLevel ใน Navigator เป็นต่ำ ปกติ หรือสูง Navigator จะใช้ระดับเสียงที่บันทึกไว้ล่าสุด หรือใช้ระดับเสียงปกติเป็นค่าเริ่มต้น
Swift
self.mapView.navigator?.volumeLevel = .low
Objective-C
_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;
เครื่องมือค้นหารหัสสถานที่
คุณสามารถใช้เครื่องมือค้นหารหัสสถานที่
เพื่อค้นหารหัสสถานที่ที่จะใช้สำหรับปลายทางของเส้นทาง เพิ่มปลายทางจาก
placeID ด้วย GMSNavigationWaypoint.
ข้อความลอย
คุณสามารถเพิ่มข้อความลอยได้ทุกที่ในแอป ตราบใดที่การระบุแหล่งที่มาของ Google ไม่ถูกบัง Navigation SDK ไม่รองรับการยึดข้อความกับพิกัดที่เฉพาะเจาะจง (ละติจูด ลองจิจูด) บนแผนที่ หรือกับป้ายกำกับ ดูข้อมูลเพิ่มเติมได้ที่ หน้าต่างข้อมูล