از این راهنما استفاده کنید تا برنامهتان بتواند به انواع رویدادهایی که با پیمایش کاربر در مسیر تغییر میکنند گوش دهد و پاسخ دهد. این راهنما تعریف مسیر را پوشش نمیدهد، فقط به رویدادهای موجود در مسیر پاسخ میدهد.
نمای کلی
کیت توسعه نرمافزار ناوبری برای iOS شنوندگانی را دراختیارتان قرار میدهد که با مکان کاربر و شرایط مسیر و دادههای مهم زمان و مسافت مرتبط هستند. در کنترلکننده نمای نقشه، برنامه شما
باید پروتکلهای این شنوندگان را اتخاذ کند:
GMSRoadSnappedLocationProviderListener
و
GMSNavigatorListener.
این فهرست روشهای شنونده دردسترس برای رویدادهای پیمایش را نشان میدهد:
GMSNavigatorListener.didArriveAtWaypoint، وقتی به مقصد میرسید فعال میشود.GMSNavigatorListener.navigatorDidChangeRoute، وقتی مسیر تغییر میکند راهاندازی میشود.GMSNavigatorListener.didUpdateRemainingTime، بهطور مکرر با تغییر زمان رسیدن به مقصد بعدی، درحالیکه راهنمایی فعال است، فراخوانی میشود.GMSNavigatorListener.didUpdateRemainingDistance، بهطور مکرر با تغییر فاصله تا مقصد بعدی، درحالیکه راهنمایی فعال است، فراخوانی میشود.GMSNavigatorListener.didUpdateDelayCategory، وقتی دسته تأخیر به مقصد بعدی تغییر میکند، درحالیکه راهنمایی فعال است، فراخوانی میشود.GMSNavigatorListener.didChangeSuggestedLightingMode، وقتی شرایط نوری تخمینی بهروز میشود، راهاندازی میشود. برای مثال وقتی شب در مکان فعلی کاربر فرا میرسد، نورپردازی تغییر میکند.GMSNavigatorListener.didUpdateSpeedingPercentage، وقتی راننده از سرعت مجاز فراتر میرود، فعال میشود.GMSRoadSnappedLocationProviderListener.didUpdateLocation، با تغییر مکان کاربر، بهطور مکرر فراخوانی میشود.
دیدن کد
اعلام انطباق با پروتکلهای الزامی
قبلاز پیادهسازی روشهای پیمایش، کنترلکننده نما باید پروتکلهای زیر را اتخاذ کند:
Swift
class ViewController:
UIViewController,
GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener
{
}
آبجکتیو-سی
@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end
پساز اتخاذ پروتکلهای ناوبری، شنوندگان را روی کنترلکننده نما تنظیم کنید. برای مثال، میتوانید کد زیر را به روش viewDidLoad() اضافه کنید.
Swift
mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)
آبجکتیو-سی
[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];
دریافت یا توقف بهروزرسانیهای مکان
بهروزرسانیهای مکان برای نشان دادن پیشرفت کاربر روی نقشه لازم است.
نمونه location ویژگیهای زیر را نشان میدهد:
| خصوصیت مکان | شرح |
|---|---|
| ارتفاع | ارتفاع کنونی. |
| coordinate.latitude | مختصات عرض جغرافیایی کنونی منطبق با جاده. |
| coordinate.longitude | مختصات طول جغرافیایی کنونی منطبقشده با جاده. |
| دوره آموزشی | جهت فعلی به درجه. |
| سرعت | سرعت کنونی. |
| مُهر زمان | تاریخ/زمان خواندن فعلی. |
برای دریافت بهروزرسانیهای مداوم مکان،
mapView.roadSnappedLocationProvider.startUpdatingLocation را فراخوانی کنید و از
GMSRoadSnappedLocationProviderListener برای مدیریت رویداد
didUpdateLocation استفاده کنید.
مثال زیر فراخوانی startUpdatingLocation را نشان میدهد:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
آبجکتیو-سی
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
کد زیر یک GMSRoadSnappedLocationProviderListener ایجاد میکند که
رویداد didUpdateLocation را مدیریت میکند.
Swift
func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider,
didUpdate location: CLLocation) {
print("Location: \(location.description)")
}
آبجکتیو-سی
- (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
didUpdateLocation:(CLLocation *)location {
NSLog(@"Location: %@", location.description);
}
برای دریافت بهروزرسانیهای مکان وقتی برنامه در پسزمینه است،
allowsBackgroundLocationUpdates را روی true تنظیم کنید:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
آبجکتیو-سی
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
درحال شناسایی رویدادهای ورود
برنامه شما از رویداد didArriveAtWaypoint برای تشخیص رسیدن به مقصد استفاده میکند. میتوانید با فراخوانی continueToNextDestinationWithCompletion() و سپس فعال کردن مجدد راهنمایی، راهنمایی را ازسر بگیرید و به نقطهمسیر بعدی بروید. برنامه شما باید راهنمایی را پساز فراخوانی
continueToNextDestinationWithCompletion() دوباره فعال کند.
پساز اینکه برنامه continueToNextDestinationWithCompletion را فراخوانی کرد، ناوبر دیگر دادهای درباره مقصد قبلی ندارد. اگر میخواهید اطلاعات مربوط به یک بخش مسیر را تجزیهوتحلیل کنید، باید این اطلاعات را قبلاز فراخوانی continueToNextDestinationWithCompletion() از ناوبر بازیابی کنید.
نمونه کد زیر روشی را برای مدیریت رویداد didArriveAtWaypoint
نشان میدهد:
Swift
func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) {
print("You have arrived at: \(waypoint.title)")
mapView.navigator?.continueToNextDestinationWithCompletion { _, _ in }
mapView.navigator?.isGuidanceActive = true
}
آبجکتیو-سی
- (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;
}
دریافت بهروزرسانیهای تغییر مسیر
برای دریافت اعلان هرگاه مسیر تغییر کرد، روشی برای مدیریت رویداد navigatorDidChangeRoute ایجاد کنید. بااستفاده از ویژگیهای routeLegs و currentRouteLeg مربوط به GMSNavigator میتوانید به مسیر جدید دسترسی پیدا کنید.
Swift
func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
print("The route has changed.")
}
آبجکتیو-سی
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
NSLog(@"The route has changed.");
}
دریافت بهروزرسانیهای زمان رسیدن به مقصد
برای دریافت بهروزرسانیهای مداوم زمان رسیدن به مقصد، روشی برای مدیریت رویداد
didUpdateRemainingTime ایجاد کنید. پارامتر time زمان تخمینی را برحسب ثانیه تا رسیدن به مقصد بعدی ارائه میدهد.
Swift
func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time: TimeInterval) {
print("Time to next destination: \(time)")
}
آبجکتیو-سی
- (void)navigator:(GMSNavigator *)navigator didUpdateRemainingTime:(NSTimeInterval)time {
NSLog(@"Time to next destination: %f", time);
}
برای تنظیم حداقل تغییر در زمان تخمینی تا مقصد بعدی،
ویژگی timeUpdateThreshold را روی GMSNavigator تنظیم کنید. مقدار به ثانیه مشخص شده است. اگر این ویژگی تنظیم نشده باشد، سرویسها از مقدار پیشفرض یک ثانیه استفاده میکنند.
Swift
navigator?.timeUpdateThreshold = 10
آبجکتیو-سی
navigator.timeUpdateThreshold = 10;
دریافت بهروزرسانیهای فاصله تا مقصد
برای دریافت بهروزرسانیهای مداوم فاصله تا مقصد، روشی برای مدیریت
رویداد didUpdateRemainingDistance ایجاد کنید. پارامتر distance فاصله تخمینی تا مقصد بعدی را به متر ارائه میدهد.
Swift
func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distance: CLLocationDistance)
{
let miles = distance * 0.00062137
print("Distance to next destination: \(miles) miles.")
}
آبجکتیو-سی
- (void)navigator:(GMSNavigator *)navigator
didUpdateRemainingDistance:(CLLocationDistance)distance {
double miles = distance * 0.00062137;
NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);
}
برای تنظیم حداقل تغییر در فاصله تخمینی تا مقصد بعدی، ویژگی
distanceUpdateThreshold را روی GMSNavigator تنظیم کنید (مقدار به متر
مشخص میشود). اگر این ویژگی تنظیم نشده باشد، سرویسها از مقدار پیشفرض یک متر استفاده میکنند.
Swift
navigator?.distanceUpdateThreshold = 100
آبجکتیو-سی
navigator.distanceUpdateThreshold = 100;
دریافت بهروزرسانیهای ترافیک
برای دریافت بهروزرسانیهای مداوم جریان ترافیک برای باقی مسیر،
روشی برای مدیریت رویداد didUpdateDelayCategory ایجاد کنید. فراخوانی
delayCategoryToNextDestination، GMSNavigationDelayCategory را برمیگرداند که
مقداری از ۰ تا ۳ ارائه میدهد. بهروزرسانیهای دسته براساس موقعیت فعلی کاربر برنامه است. اگر دادههای ترافیک دردسترس نباشد،
GMSNavigationDelayCategory مقدار ۰ را برمیگرداند. اعداد ۱ تا ۳ نشاندهنده افزایش
جریان از سبک به سنگین است.
Swift
func navigator(_ navigator: GMSNavigator,
didUpdate delayCategory: GMSNavigationDelayCategory)
{
print("Traffic flow to next destination: \(delayCategory)")
}
آبجکتیو-سی
- (void)navigator:(GMSNavigator *)navigator
didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
NSLog(@"Traffic flow to next destination: %ld", (long)delayCategory);
}
خصوصیت GMSNavigationDelayCategory سطوح تأخیر زیر را نشان میدهد:
| دسته تأخیر | شرح |
|---|---|
| GMSNavigationDelayCategoryNoData | 0 - غیرقابل دسترس، بدون داده برای ترافیک یا : |
| مسیر. | |
| GMSNavigationDelayCategoryHeavy | ۱ - سنگین. |
| GMSNavigationDelayCategoryMedium | ۲ - متوسط. |
| GMSNavigationDelayCategoryLight | ۳ - سبک. |
دریافت بهروزرسانیهای سرعت غیرمجاز
برای دریافت بهروزرسانیها وقتی راننده از حد مجاز سرعت فراتر میرود، روشی برای مدیریت رویداد didUpdateSpeedingPercentage ایجاد کنید.
Swift
// Listener to handle speeding events.
func navigator(_ navigator: GMSNavigator,
didUpdateSpeedingPercentage percentageAboveLimit: CGFloat)
{
print("Speed is \(percentageAboveLimit) above the limit.")
}
آبجکتیو-سی
// Listener to handle speeding events.
- (void)navigator:(GMSNavigator *)navigator
didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit);
}
درحال تغییر حالت نورپردازی پیشنهادی
GMSNavigator
حالت نورپردازی پیشنهادی را براساس زمان روز و مکان دستگاه محاسبه میکند و متد شنونده
didChangeSuggestedLightingMode
را فقط زمانی فراخوانی میکند که حالت پیشنهادی تغییر کند (مثلاً هنگام طلوع یا غروب آفتاب). برای اطمینان از اینکه نقشه با حالت روشنایی مناسب هنگام راهاندازی برنامه توسط کاربر شروع میشود،
mapView.lightingMode
را به
suggestedLightingMode
ناوبر درطول مقداردهی اولیه تنظیم کنید و
didChangeSuggestedLightingMode
را برای مدیریت تغییرات بعدی پیادهسازی کنید.
مثال زیر نحوه تنظیم حالت نورپردازی اولیه و گوش دادن به تغییرات پیشنهادی حالت نورپردازی را نشان میدهد:
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
}
آبجکتیو-سی
// 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;
}
برای اطلاعات بیشتر درباره پیکربندی حالت نورپردازی خودکار و دستی، به پیکربندی حالتهای عادی و کمنور مراجعه کنید.