สร้างคําแนะนําที่กําหนดเอง
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
หน้านี้ครอบคลุมขั้นตอนระดับสูงที่คุณทำตามเพื่อสร้างคำแนะนำที่ปรับแต่งแล้ว
ซึ่งเป็นส่วนหนึ่งของประสบการณ์การนำทางที่กำหนดเอง
กระบวนการนี้แตกต่างจากกระบวนการที่อธิบายไว้ในหัวข้อ
นำทาง
เส้นทางดังนี้
- คุณต้องสร้างเซสชันการนำทางแยกกันก่อน แล้วจึงรับอินสแตนซ์ของ Navigator
ผ่านเซสชันแทนที่จะเรียกตัวควบคุมมุมมอง
- คุณตั้งค่า Listener เหตุการณ์เพื่อตอบสนองและจัดการเหตุการณ์การนำทาง
- สร้างเซสชันการนำทางโดยใช้
GMSNavigationService.createNavigationSession
และเริ่มการนำทางด้วยการเรียกใช้ setDestination
เมื่อประสบการณ์การนำทางของ Google
เรียกใช้ Navigator ผ่านมุมมองแผนที่การนำทาง
GMSNavigationServices
จะควบคุมและรับสตรีมเหตุการณ์จากเซสชันการนำทางโดยอิสระจากอินสแตนซ์ UI ซึ่งหมายความว่าสามารถ
เรียกใช้โดยไม่มี UI หรือส่งต่อไปยังประสบการณ์ที่อิงตาม UI ใดก็ได้ ด้วยแนวทางนี้ เซสชันการนำทางจะทำงานต่อไปในแอปจนกว่าจะมีการนำข้อมูลอ้างอิงสุดท้ายออกจากเซสชัน
- สร้างผู้ให้บริการตำแหน่งที่สแนปกับถนน ใช้ผู้ให้บริการตำแหน่งหาก
ต้องการให้แอปมีการตรวจสอบตำแหน่งอย่างต่อเนื่อง เช่น เมื่อ
แสดงมุมมองการนำทางที่มีจุดสีน้ำเงินตามเส้นทาง
- ตั้งค่าเครื่องรับฟังเพื่อรับคำแนะนำแบบเลี้ยวต่อเลี้ยวโดยละเอียดโดยใช้โปรโตคอล
GMSNavigatorListener
จากนั้นแปลงข้อมูลดังกล่าวเป็น
สิ่งที่จำเป็นสำหรับประสบการณ์การนำทางที่กำหนดเอง เช่น
- ใช้ช่องข้อความเท่านั้นสำหรับการแคสต์หน้าจอแบบง่ายๆ ของเส้นทาง
- ออกแบบและป้อนข้อมูลในช่องสำหรับ UI ของคุณเอง
- ตั้งค่าเครื่องจำลองการนำทาง ซึ่งจำเป็นต่อการพัฒนาและ
การทดสอบ
สร้างเซสชันการนำทางอิสระ
ข้อมูลโค้ดต่อไปนี้จากการสาธิตแสดงการนำทางที่สร้างขึ้นโดยอิสระจากตัวควบคุมมุมมอง จากนั้นโค้ดจะเพิ่มแผนที่ภาพรวม
ที่กำหนดค่าให้แสดงตำแหน่งปัจจุบันที่สแนปกับถนน
// Create the navigation session.
_navigationSession = [GMSNavigationServices createNavigationSession];
GMSRoadSnappedLocationProvider *roadSnappedLocationProvider =
_navigationSession.roadSnappedLocationProvider;
[roadSnappedLocationProvider startUpdatingLocation];
GMSNavigator *navigator = _navigationSession.navigator;
[navigator addListener:self];
navigator.voiceGuidance = GMSNavigationVoiceGuidanceSilent;
navigator.sendsBackgroundNotifications = NO;
_navigationSession.started = YES;
[navigator setDestinations:@[ destination ]
callback:^(GMSRouteStatus routeStatus) {
// …handle changes in route status.
}];
// Add an overview map.
_mapView = [[GMSMapView alloc] initWithFrame:CGRectZero];
[self.mainStackView addArrangedSubview:_mapView];
[self.mainStackView setNeedsLayout];
_mapView.settings.compassButton = YES;
_mapView.delegate = self;
_mapView.myLocationEnabled = YES;
_mapView.roadSnappedMyLocationSource = roadSnappedLocationProvider;
การส่งต่อการนำทางจากประสบการณ์การใช้งานที่กำหนดเองไปยังประสบการณ์การใช้งาน Google
ข้อมูลโค้ดนี้แสดงให้เห็นว่าแอปของคุณอนุญาตให้ผู้ใช้เข้าสู่
ประสบการณ์การนำทางของ Google จากประสบการณ์การนำทางที่กำหนดเองได้อย่างไร โค้ด
ข้อมูลโค้ดนี้ยังแสดงวิธีที่แอปของคุณทำการเปลี่ยนผ่านนี้ขณะแชร์แผนที่
`UIButton *button = [UIButton buttonWithType:UIButtonTypePlain`];
[`button addTarget:self action:@selector(didTapEnterGoogleNavigationButton:)
forControlState:[_directionsButton addTarget:self`];
`…`
[`_mapView enableNavigationWithSession:_navigationSession`];
เนื้อหาของหน้าเว็บนี้ได้รับอนุญาตภายใต้ใบอนุญาตที่ต้องระบุที่มาของครีเอทีฟคอมมอนส์ 4.0 และตัวอย่างโค้ดได้รับอนุญาตภายใต้ใบอนุญาต Apache 2.0 เว้นแต่จะระบุไว้เป็นอย่างอื่น โปรดดูรายละเอียดที่นโยบายเว็บไซต์ Google Developers Java เป็นเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-09-04 UTC
[null,null,["อัปเดตล่าสุด 2025-09-04 UTC"],[[["\u003cp\u003eCreate custom turn-by-turn navigation experiences on iOS by establishing an independent navigation session using \u003ccode\u003eGMSNavigationServices\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eImplement the \u003ccode\u003eGMSNavigatorListener\u003c/code\u003e protocol to receive and utilize detailed guidance information for your custom UI elements.\u003c/p\u003e\n"],["\u003cp\u003eUtilize a road-snapped location provider for continuous location updates and accurate positioning on the route.\u003c/p\u003e\n"],["\u003cp\u003eSet up a navigation simulator for development and testing purposes to ensure the functionality of your custom navigation experience.\u003c/p\u003e\n"],["\u003cp\u003eTransition seamlessly from a custom navigation experience to the full Google Maps navigation experience, optionally sharing the existing map instance.\u003c/p\u003e\n"]]],["The core process involves creating a navigation session independently using `GMSNavigationService.createNavigationSession`, distinct from route navigation. A road-snapped location provider is established for continuous monitoring. Implement `GMSNavigatorListener` to set up turn-by-turn guidance, translating the information into your app's custom navigation UI. Set up a navigation simulator for testing. The navigation session persists until the last reference is removed. A custom experience can also be transition to the default google navigation experience.\n"],null,["# Create customized guidance\n\nThis page covers the high-level steps you follow to create customized guidance\nas part of a [custom navigation\nexperience](/maps/documentation/navigation/ios-sdk/intro-custom-nav). \n**This process differs from the process described in\n[Navigate a\nroute](/maps/documentation/navigation/ios-sdk/route) as follows:**\n\n- You first establish a navigation session independently and obtain a navigator instance through the session rather than by calling the view controller.\n- You set up an event listener to respond to and manage navigation events.\n\n1. **Create a navigation session** using [`GMSNavigationService.createNavigationSession`](/maps/documentation/navigation/ios-sdk/reference/objc/Classes/GMSNavigationServices#+createnavigationsession) and begin navigation with a `setDestination` call. Where the Google navigation experience invokes the navigator through the navigation map view, the `GMSNavigationServices` controls and receives a stream of events from a navigation session *independently* from a UI instance. This means it can either run without a UI, or get passed to *any* UI-based experience. With this approach, the navigation session continues to run in your app until the last reference is removed from it.\n2. **Establish a road-snapped location provider**. Use the location provider if you want your app to have continuous location monitoring, such as when displaying a navigation view with a blue dot along the route.\n3. **Set up a listener for detailed turn-by-turn guidance** by implementing the `GMSNavigatorListener` protocol. Then, transform that information into whatever is needed for your custom navigation experience. For example:\n 1. Implement text-only fields for simple screen casting of directions.\n 2. Design and populate fields for your own UI.\n4. **Set up a navigation simulator**. This is necessary for development and testing.\n\nCreate an independent navigation session\n----------------------------------------\n\nThe following code snippet from the demo shows navigation established\nindependently from the view controller. The code then adds an overview map\nconfigured to show the current road-snapped location. \n\n // Create the navigation session.\n\n _navigationSession = [GMSNavigationServices createNavigationSession];\n GMSRoadSnappedLocationProvider *roadSnappedLocationProvider =\n _navigationSession.roadSnappedLocationProvider;\n [roadSnappedLocationProvider startUpdatingLocation];\n GMSNavigator *navigator = _navigationSession.navigator;\n [navigator addListener:self];\n navigator.voiceGuidance = GMSNavigationVoiceGuidanceSilent;\n navigator.sendsBackgroundNotifications = NO;\n _navigationSession.started = YES;\n [navigator setDestinations:@[ destination ]\n callback:^(GMSRouteStatus routeStatus) {\n // ...handle changes in route status.\n }];\n\n // Add an overview map.\n _mapView = [[GMSMapView alloc] initWithFrame:CGRectZero];\n [self.mainStackView addArrangedSubview:_mapView];\n [self.mainStackView setNeedsLayout];\n _mapView.settings.compassButton = YES;\n _mapView.delegate = self;\n _mapView.myLocationEnabled = YES;\n _mapView.roadSnappedMyLocationSource = roadSnappedLocationProvider;\n\nPassing navigation from a custom experience to the Google experience\n--------------------------------------------------------------------\n\nThis code snippet illustrates how your app can allow the user to enter the\nGoogle navigation experience from a custom navigation experience. This code\nsnippet also shows how your app makes this transition while sharing the map. \n\n `UIButton *button = [UIButton buttonWithType:UIButtonTypePlain`];\n\n [`button addTarget:self action:@selector(didTapEnterGoogleNavigationButton:)\n forControlState:[_directionsButton addTarget:self`];\n\n `...`\n\n [`_mapView enableNavigationWithSession:_navigationSession`];"]]