إنشاء إرشادات مخصّصة
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تتضمّن هذه الصفحة الخطوات العامة التي تتّبعها لإنشاء إرشادات مخصّصة كجزء من تجربة تنقّل مخصّصة.
تختلف هذه العملية عن العملية الموضّحة في مقالة
التنقّل في
طريق على النحو التالي:
- عليك أولاً إنشاء جلسة تنقّل بشكل مستقل والحصول على مثيل لبرنامج التنقّل من خلال الجلسة بدلاً من استدعاء وحدة التحكّم في العرض.
- يمكنك إعداد أداة معالجة الأحداث للردّ على أحداث التنقّل وإدارتها.
- إنشاء جلسة تنقّل باستخدام
GMSNavigationService.createNavigationSession
وبدء التنقّل من خلال طلب setDestination
عندما تستدعي تجربة التنقّل من Google أداة التنقّل من خلال عرض خريطة التنقّل، تتحكّم GMSNavigationServices
في مجموعة من الأحداث وتتلقّاها من جلسة تنقّل بشكل مستقل عن مثيل واجهة المستخدم. وهذا يعني أنّه يمكن تشغيلها بدون واجهة مستخدم أو يمكن تمريرها إلى أي تجربة مستندة إلى واجهة المستخدم. باستخدام هذا الأسلوب، يستمر تشغيل جلسة التنقّل في تطبيقك إلى أن تتم إزالة آخر مرجع منها.
- إنشاء موفّر بيانات الموقع الجغرافي الذي يتم ضبطه على الطرق استخدِم موفّر الموقع الجغرافي إذا كنت تريد أن يتيح تطبيقك مراقبة الموقع الجغرافي بشكل مستمر، مثلاً عند عرض طريقة عرض للتنقّل مع نقطة زرقاء على طول المسار.
- إعداد أداة معالجة للحصول على إرشادات مفصّلة خطوة بخطوة من خلال تنفيذ بروتوكول
GMSNavigatorListener
بعد ذلك، حوِّل هذه المعلومات إلى أي شيء تحتاجه لتجربة التنقّل المخصّصة. على سبيل المثال:
- استخدِم حقولاً نصية فقط لتسهيل عرض الاتجاهات على الشاشة.
- صمِّم الحقول واملأها لواجهة المستخدِم الخاصة بك.
- إعداد محاكي للتنقّل هذا الإجراء ضروري لأغراض التطوير والاختبار.
إنشاء جلسة تنقّل مستقلة
يوضّح مقتطف الرمز التالي من العرض التوضيحي عملية التنقّل التي تم إنشاؤها بشكل مستقل عن وحدة التحكّم في العرض. يضيف الرمز بعد ذلك خريطة إجمالية تم ضبطها لعرض الموقع الجغرافي الحالي الذي تم ربطه بالطريق.
// 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`];
إنّ محتوى هذه الصفحة مرخّص بموجب ترخيص Creative Commons Attribution 4.0 ما لم يُنصّ على خلاف ذلك، ونماذج الرموز مرخّصة بموجب ترخيص Apache 2.0. للاطّلاع على التفاصيل، يُرجى مراجعة سياسات موقع Google Developers. إنّ Java هي علامة تجارية مسجَّلة لشركة Oracle و/أو شركائها التابعين.
تاريخ التعديل الأخير: 2025-09-04 (حسب التوقيت العالمي المتفَّق عليه)
[null,null,["تاريخ التعديل الأخير: 2025-09-04 (حسب التوقيت العالمي المتفَّق عليه)"],[[["\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`];"]]