במדריך הזה נסביר איך להתוות מסלול באפליקציה ליעד יחיד באמצעות Navigation SDK ל-iOS.
סקירה כללית
- משלבים את Navigation SDK באפליקציה, כמו שמתואר בקטע הגדרת הפרויקט.
- מגדירים
GMSMapView. - מבקשים מהמשתמש לאשר את התנאים וההגבלות, ולאשר את שירותי המיקום וההתראות ברקע.
- יוצרים מערך שמכיל יעד אחד או יותר.
מגדירים
GMSNavigatorכדי לשלוט בניווט מפורט.- מוסיפים יעדים באמצעות
setDestinations. - מגדירים את
isGuidanceActiveל-trueכדי להתחיל בניווט. - אפשר להשתמש ב-
simulateLocationsAlongExistingRouteכדי לדמות את התקדמות הרכב לאורך המסלול, לצורך בדיקה, ניפוי באגים והדגמה של האפליקציה.
- מוסיפים יעדים באמצעות
הצגת הקוד
הצגת בקשה למשתמש לאישור ההרשאות הנדרשות
לפני שמשתמשים ב-Navigation SDK, המשתמשים צריכים להסכים לתנאים ולהגבלות ולאשר את השימוש בשירותי המיקום, שנדרשים לניווט. אם האפליקציה תפעל ברקע, היא גם צריכה לבקש מהמשתמשים לאשר קבלת התראות על הנחיות. בקטע הזה מוסבר איך להציג את הנחיות ההרשאה הנדרשות.
אישור שירותי המיקום
ערכת Navigation SDK משתמשת בשירותי מיקום, ולכן נדרשת הרשאת משתמש. כדי להפעיל את שירותי המיקום ולהציג את תיבת הדו-שיח של ההרשאה, פועלים לפי השלבים הבאים:
מפעילים את היכולות של המיקום והרקע ב-Xcode:
- פותחים את יעד ההפצה ב-Xcode ובוחרים בכרטיסייה Signing & Capabilities (חתימה ויכולות). פרטים נוספים מופיעים במדריך של Apple בנושא הוספת יכולות לאפליקציה.
- מוסיפים את היכולות מיקום (תמיד) ומיקום (בזמן השימוש). בתיבת הטקסט של כל אחת מההצהרות, מוסיפים הסבר קצר למה האפליקציה דורשת שירותי מיקום (לדוגמה: "האפליקציה הזו צריכה הרשאה להשתמש בשירותי מיקום כדי לספק ניווט מפורט").
- מוסיפים את היכולת Background Modes (מצבי רקע) ומסמנים את התיבה Location updates (עדכוני מיקום). בלי היכולת הזו, האפליקציה קורסת כשמתחילים בניווט. פרטים נוספים זמינים במדריך של אפל בנושא טיפול בעדכוני מיקום ברקע.
כדי להציג את תיבת הדו-שיח של ההרשאה, צריך להפעיל את method
requestAlwaysAuthorization()של מופע מנהל המיקום.
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
לעיון במאמרי העזרה המלאים של אפל בנושא הרשאה לשירותי מיקום
אישור לקבלת התראות על הנחיות ברקע
כדי ש-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");
}
}];
אישור השימוש בחיישני תנועה
בגרסה ראשית עתידית, ערכת ה-SDK של Navigation ל-iOS משלבת נתוני מיקום מרכזיים עם חיישני תנועה במכשיר (CMAltimeter) כדי לחשב את הגובה של המסלול. כשה-SDK ניגש למד הגובה, מערכת iOS משתמשת אוטומטית במחרוזת הזו כדי לבקש מהמשתמש הרשאה.
הוספת המפתח הזה עכשיו לא משפיעה על ההתנהגות הנוכחית, אבל היא מונעת קריסות של אתחול כשמשדרגים את ה-SDK בהמשך.
כדי להתכונן לשדרוגים עתידיים של ה-SDK, צריך להגדיר את ההרשאות של חיישן התנועה באופן הבא:
פותחים את יעד ההפצה ב-Xcode ועוברים לכרטיסייה Info, או פותחים את הקובץ
Info.plist.מוסיפים מפתח חדש: Privacy - Motion Usage Description (פרטיות – תיאור השימוש בתנועה) (
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. אם המסלול מחושב בהצלחה, הוא מופיע במפה. כדי להתחיל בהנחיות לאורך המסלול, מגדירים את isGuidanceActive ל-true בקריאה החוזרת.
בדוגמה הבאה אפשר לראות:
- יצירת מסלול חדש עם יעד אחד.
- התחלת ההדרכה.
- הפעלת התראות על הנחיות ברקע.
- סימולציה של נסיעה לאורך המסלול (אופציונלי).
- הגדרת מצב המצלמה ל'מעקב' (אופציונלי).
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() כדי להעביר את נקודת הציון לקטע הבא של המסלול.
הגדרת מצב נסיעה
אמצעי התחבורה מגדיר גם את סוג המסלול שצריך לאחזר וגם איך לקבוע את הכיוון של המשתמש. אפשר להגדיר אחד מארבעה מצבי נסיעה למסלול: נהיגה, רכיבה על אופניים, הליכה ומונית. במצב נהיגה ובמצב נסיעה במונית, המסלול של המשתמש מבוסס על כיוון הנסיעה. במצב רכיבה על אופניים ובמצב הליכה, המסלול מיוצג על ידי הכיוון שאליו המכשיר פונה (למעלה במכשיר במצב של פריסה לרוחב).
מגדירים את המאפיין travelMode של תצוגת המפה, כמו בדוגמה הבאה:
Swift
self.mapView.travelMode = .cycling
Objective-C
_mapView.travelMode = GMSNavigationTravelModeCycling;
הגדרת כבישים שמהם רוצים להימנע
כדי להימנע מכבישים מהירים, מכבישי אגרה או משניהם לאורך מסלול, משתמשים במאפיינים avoidsHighways ו-avoidsTolls BOOL.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
הגדרת עוצמת הקול של ההנחיות הקוליות
כדי לשנות את עוצמת הקול של ההנחיות הקוליות, מגדירים את המאפיין volumeLevel של רכיב הניווט לערך low, normal או high. בסרגל הניווט נעשה שימוש בעוצמת הקול האחרונה שנשמרה, או שמוגדרת כברירת מחדל עוצמת קול רגילה.
Swift
self.mapView.navigator?.volumeLevel = .low
Objective-C
_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;
כלי למציאת מזהי מקומות
אתם יכולים להשתמש בכלי לחיפוש מזהה מקום כדי למצוא מזהי מקום לשימוש כיעדים במסלולים. הוספת יעד מ-placeID באמצעות GMSNavigationWaypoint.
טקסט צף
אתם יכולים להוסיף טקסט צף בכל מקום באפליקציה, כל עוד הקרדיט של Google לא מוסתר. Navigation SDK לא תומך בהצמדת הטקסט לקואורדינטות ספציפיות (קו רוחב, קו אורך) במפה או לתווית. מידע נוסף זמין במאמר בנושא חלונות מידע.