תחילת העבודה עם Driver SDK ל-iOS

תוכלו להשתמש ב-Driver SDK כדי לשפר את הניווט והמעקב בקשה להתקדמות בנסיעה והזמנה. Driver SDK מספק את פרטי הרכב עדכונים לגבי המיקום והמשימה ב-Fleet Engine לגבי נסיעות ומשלוחים על פי דרישה.

ה-SDK של Drive שומר על המודעות של שירותי Fleet Engine ושירותים בהתאמה אישית המיקום והמצב של הרכב. לדוגמה, הרכב יכול להיות ONLINE או OFFLINE, ומיקום הרכב משתנה במהלך הנסיעה.

דרישות מערכת מינימליות

  • במכשיר הנייד צריכה לפעול מערכת iOS בגרסה 14 ואילך.
  • Xcode גרסה 15 ואילך.
  • דרישות מוקדמות

    המדריך הזה מניח שבאפליקציה שלכם כבר מוטמעת הניווט SDK ושה-Fleet מנוע הקצה העורפי מוגדר וזמין. אבל הקוד לדוגמה מספק דוגמה של איך להגדיר את Navigation SDK.

    יש להפעיל גם את ה-SDK של מפות ל-iOS בפרויקט ב-Google Cloud ולקבל ממשק API מקש.

    הגדרות אישיות של פרויקט

    מנהל חבילות SWIFT

    ניתן להתקין את ה-SDK של מנהל ההתקן דרך SWIFT Package Manager. כדי להוסיף את ה-SDK, צריך לוודא שיש לך הוסרו כל יחסי התלות הקיימים של Driver SDK.

    כדי להוסיף את ה-SDK לפרויקט חדש או קיים:

    1. פותחים את ה-Xcode project או workspace, ועוברים אל File > (קובץ >) הוספת יחסי תלות של חבילה.
    2. מזינים את כתובת ה-URL https://github.com/googlemaps/ios-driver-sdk ומקישים על Enter. כדי למשוך את החבילה, וללחוץ על "הוספת חבילה".
    3. כדי להתקין version ספציפי, צריך להגדיר את השדה כלל תלות לאחד אפשרויות שמבוססות על גרסאות. בפרויקטים חדשים, מומלץ לציין את הגרסה האחרונה באמצעות "גרסה מדויקת" כאפשרות. בסיום, לוחצים על 'הוספת חבילה'.
    4. בחלון Choose Package Products, מוודאים שהתוסף GoogleRidesharingDriver יתווסף אל היעד שהגדרת ל-main. בסיום, לוחצים על 'הוספת חבילה'.
    5. כדי לבדוק את ההתקנה, צריך לעבור לחלונית General של היעד. ב-Frameworks, ספריות ותוכן מוטמע אתם אמורים לראות את החבילות המותקנות. אפשר גם לראות את העמודה 'יחסי תלות של חבילה' הקטע של Project Navigator כדי לאמת את החבילה והגרסה שלה.

    כדי לעדכן את package בפרויקט קיים:

    1. אם אתה משדרג מגרסה קודמת מ-9.0.0, עליך להסיר את יחסי התלות האלה: GoogleMapsBase, GoogleMapsCore, GoogleMapsM4B אחרי השדרוג. אל תסירו את התלות של GoogleMaps מידע נוסף זמין במאמר נתוני גרסה 9.0.0.

      בהגדרות האישיות של פרויקט Xcode, מחפשים את Frameworks, ספריות, ותוכן מוטמע. משתמשים בסימן המינוס(-) כדי להסיר את המסגרת הבאה:

      • GoogleMapsBase (רק לשדרוגים מגרסאות מוקדמות יותר מ-9.0.0)
      • GoogleMapsCore (רק לשדרוגים מגרסאות מוקדמות יותר מ-9.0.0)
      • GoogleMapsM4B (רק לשדרוגים מגרסאות מוקדמות יותר מ-9.0.0)
    2. מ-Xcode, עוברים אל 'File >' חבילות > יש לעדכן לגרסאות האחרונות של החבילה".
    3. כדי לאמת את ההתקנה, עוברים לקטע Package Dependencies של Project Navigator כדי לאמת את החבילה והגרסה שלה.

    כדי להסיר יחסי תלות קיימים של Driver SDK שנוספו באמצעות CocoaPods, יש לבצע את השלבים הבאים:

    1. סוגרים את סביבת העבודה של Xcode. פותחים את הטרמינל ומריצים את הפקודה הבאה:
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. מסירים את Podfile, Podfile.resolved ואת Xcode workspace אם אתם לא משתמשים בהם לאף מטרה אחרת מלבד CocoaPods.

    כדי להסיר את Driver SDK הקיים שהותקן ידנית, בצעו את השלבים הבאים:

    1. בהגדרות האישיות של פרויקט Xcode, מחפשים את Frameworks, ספריות ותוכן מוטמע. משתמשים בסמל המינוס(-) כדי להסיר את המסגרת הבאה:

      • GoogleRidesharingDriver.xcframework
    2. מהספרייה ברמה העליונה של פרויקט Xcode, מסירים את חבילה של GoogleRidesharingDriver.

    CocoaPods

    כדי להגדיר את Driver SDK באמצעות CocoaPods, צריך את הפריטים הבאים:

    • הכלי CocoaPods: כדי להתקין את הכלי הזה, פותחים את Terminal ומפעילים את הפקודה הבאה.
       sudo gem install cocoapods
    
    1. ליצור Podfile ל-Driver SDK ולהשתמש בו כדי להתקין את ה-API. יחסי התלות שלו: יוצרים קובץ בשם Podfile בספריית הפרויקט. הקובץ הזה מגדיר את יחסי התלות של הפרויקט. יש לערוך את ה-Podfile ולהוסיף אותו של יחסי התלות שלכם. לפניכם דוגמה שכוללת את יחסי התלות:

      source "https://github.com/CocoaPods/Specs.git"
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GoogleRidesharingDriver'
      end
      

      כאן יש דוגמה שכוללת את רצפי האלפא והבטא של ה-SDK של מנהל ההתקן כיחסי תלות:

      source "https://cpdc-eap.googlesource.com/ridesharing-driver-sdk.git"
      source "https://github.com/CocoaPods/Specs.git"
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GoogleRidesharingDriver'
      end
      
    2. שומרים את ה-Podfile. פותחים טרמינל ועוברים לספרייה שמכילה את הפקודה Podfile:

      cd <path-to-project>
      
    3. מריצים את פקודת ההתקנה של pod. הפעולה הזו תתקין את ממשקי ה-API שצוינו Podfile, יחד עם כל יחסי התלות שיש להם.

      pod install
      
    4. סוגרים את Xcode ואז פותחים (לחיצה כפולה) את קובץ .xcworkspace של הפרויקט כדי להפעיל Xcode. מהשלב הזה ואילך צריך להשתמש כדי לפתוח את הפרויקט, לוחצים על קובץ .xcworkspace

    קראו את המאמר תחילת העבודה של CocoaPods מדריך פרטים.

    התקנה ידנית

    XCFramework היא חבילה בינארית שבה משתמשים כדי להתקין את SDK של מנהל התקן. ניתן להשתמש בחבילה הזו בכמה פלטפורמות שונות, כולל מכונות שמשתמשות ב-Apple silicon. במדריך הזה נסביר להוסיף באופן ידני את ה-XCFramework שמכיל את ה-SDK של Drive לפרויקט והגדרת ה-build ב-Xcode.

    מורידים את הקובץ הבינארי ומשאבים של ה-SDK:

    1. מחלצים את הקבצים כדי לגשת ל-XCFramework ולמשאבים.

    2. אפשר להתחיל ב-Xcode ולפתוח פרויקט קיים, או ליצור פרויקט חדש פרויקט. אם זו הפעם הראשונה שאתם משתמשים ב-iOS, יוצרים פרויקט חדש ובוחרים ב-iOS תבנית לאפליקציה.

    3. יוצרים קבוצת Frameworks בקבוצת הפרויקט אם היא לא קיימת כבר.

    4. כדי להתקין את Driver SDK, גוררים את הסמל קובץ אחד (GoogleRidesharingDriver.xcframework) בפרויקט בקטע Frameworks, ספריות ותוכן מוטמע. כשמופיעה בקשה, בוחרים באפשרות מעתיקים פריטים לפי הצורך.

    5. גוררים את GoogleRidesharingDriver.bundle שהורדתם לרמה העליונה של פרויקט ה-Xcode שלכם. כשמופיעה בקשה, בוחרים באפשרות Copy items if needed.

    6. בוחרים את הפרויקט מ-Project Navigator ואז בוחרים היעד של האפליקציה.

    7. פותחים את הכרטיסייה 'שלבי build', ובקטע Link Binary (קישור בינארי עם ספריות) מוסיפים את של הספריות והמסגרות הבאות, אם הן עדיין לא קיימות:

      • Accelerate.framework
      • AudioToolbox.framework
      • AVFoundation.framework
      • CoreData.framework
      • CoreGraphics.framework
      • CoreLocation.framework
      • CoreTelephony.framework
      • CoreText.framework
      • GLKit.framework
      • ImageIO.framework
      • libc++.tbd
      • libxml2.tbd
      • libz.tbd
      • LocalAuthentication.framework
      • OpenGLES.framework
      • QuartzCore.framework
      • SystemConfiguration.framework
      • UIKit.framework
      • WebKit.framework
    8. בוחרים בפרויקט שלכם (ולא ביעד ספציפי) ופותחים את Build בכרטיסייה 'הגדרות'. בקטע סימוני מקשר אחרים, מוסיפים -ObjC בשביל גם לניפוי באגים וגם להשקה. אם ההגדרות האלה לא מוצגות, שנו את בסרגל 'הגדרות Build', מבסיסי להכול.

    בדיקת קובץ מניפסט הפרטיות של Apple

    Apple דורשת פרטים לגבי הפרטיות של אפליקציות ב-App Store. עדכונים ומידע נוסף זמינים בדף פרטי הפרטיות של Apple App Store.

    קובץ מניפסט הפרטיות של Apple כלול בחבילת המשאבים של ה-SDK. כדי לוודא שקובץ מניפסט הפרטיות נכלל וכדי לבדוק את התוכן שלו, יש ליצור ארכיון של האפליקציה ולהפיק דוח פרטיות מהארכיון.

    הטמעת הרשאה ואימות

    כשאפליקציית Drive יוצרת ושולחת עדכונים לקצה העורפי של Fleet Engine, הבקשות חייבות לכלול אסימוני גישה תקפים. כדי לאשר ולאמת את הבקשות האלה, Driver SDK קורא לאובייקט תואם לפרוטוקול GMTDAuthorization. האובייקט אחראי מספקים את אסימון הגישה הנדרש.

    כמפתחי האפליקציה, אתם בוחרים איך האסימונים נוצרים. ההטמעה שלך צריכה להיות יכולת לבצע את הפעולות הבאות:

    • מאחזרים אסימון גישה משרת HTTPS, כנראה בפורמט JSON.
    • ניתוח האסימון ושמירה שלו במטמון.
    • צריך לרענן את האסימון כשהתוקף שלו יפוג.

    לפרטים על האסימונים שנדרשים על ידי שרת Fleet Engine אפשר לעיין במאמר יצירת אסימון רשת מבוסס JSON (JWT) עבור .

    מזהה הספק זהה למזהה הפרויקט ב-Google Cloud. ראו Fleet Engine מדריך למתחילים מדריך אפשר לקבל מידע נוסף.

    הדוגמה הבאה מממשת ספק של אסימון גישה:

    Swift

    import GoogleRidesharingDriver
    
    private let providerURL = "INSERT_YOUR_TOKEN_PROVIDER_URL"
    
    class SampleAccessTokenProvider: NSObject, GMTDAuthorization {
      private struct AuthToken {
        // The cached vehicle token.
        let token: String
        // Keep track of when the token expires for caching.
        let expiration: TimeInterval
        // Keep track of the vehicle ID the cached token is for.
        let vehicleID: String
      }
    
      enum AccessTokenError: Error {
        case missingAuthorizationContext
        case missingData
      }
    
      private var authToken: AuthToken?
    
      func fetchToken(
        with authorizationContext: GMTDAuthorizationContext?,
        completion: @escaping GMTDAuthTokenFetchCompletionHandler
      ) {
        // Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
        guard let authorizationContext = authorizationContext else {
          completion(nil, AccessTokenError.missingAuthorizationContext)
          return
        }
        let vehicleID = authorizationContext.vehicleID
    
        // If appropriate, use the cached token.
        if let authToken = authToken,
          authToken.expiration > Date.now.timeIntervalSince1970 && authToken.vehicleID == vehicleID
        {
          completion(authToken.token, nil)
          return
        }
    
        // Otherwise, try to fetch a new token from your server.
        let request = URLRequest(url: URL(string: providerURL))
        let task = URLSession.shared.dataTask(with: request) { [weak self] data, _, error in
          guard let strongSelf = self else { return }
          guard error == nil else {
            completion(nil, error)
            return
          }
    
          // Replace the following key values with the appropriate keys based on your
          // server's expected response.
          let vehicleTokenKey = "VEHICLE_TOKEN_KEY"
          let tokenExpirationKey = "TOKEN_EXPIRATION"
          guard let data = data,
            let fetchData = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
            let token = fetchData[vehicleTokenKey] as? String,
            let expiration = fetchData[tokenExpirationKey] as? Double
          else {
            completion(nil, AccessTokenError.missingData)
            return
          }
    
          strongSelf.authToken = AuthToken(
            token: token, expiration: expiration, vehicleID: vehicleID)
          completion(token, nil)
        }
        task.resume()
      }
    }
    

    Objective-C

    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    // SampleAccessTokenProvider.h
    @interface SampleAccessTokenProvider : NSObject<GMTDAuthorization>
    @end
    
    static NSString *const PROVIDER_URL = @"INSERT_YOUR_TOKEN_PROVIDER_URL";
    
    // SampleAccessTokenProvider.m
    @implementation SampleAccessTokenProvider{
      // The cached vehicle token.
      NSString *_cachedVehicleToken;
      // Keep track of the vehicle ID the cached token is for.
      NSString *_lastKnownVehicleID;
      // Keep track of when tokens expire for caching.
      NSTimeInterval _tokenExpiration;
    }
    
    -   (void)fetchTokenWithContext:(nullable GMTDAuthorizationContext *)authorizationContext
                       completion:(nonnull GMTDAuthTokenFetchCompletionHandler)completion {
      // Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
      NSString *vehicleID = authorizationContext.vehicleID;
      if (!vehicleID) {
        NSAssert(NO, @"Vehicle ID is missing from authorizationContext.");
        return;
      }
    
      // Clear cached vehicle token if vehicle ID has changed.
      if (![_lastKnownVehicleID isEqual:vehicleID]) {
        _tokenExpiration = 0.0;
        _cachedVehicleToken = nil;
      }
      _lastKnownVehicleID = vehicleID;
    
      // Clear cached vehicletoken if it has expired.
      if ([[NSDate date] timeIntervalSince1970] > _tokenExpiration) {
        _cachedVehicleToken = nil;
      }
    
      // If appropriate, use the cached token.
      if (_cachedVehicleToken) {
        completion(_cachedVehicleToken, nil);
        return;
      }
      // Otherwise, try to fetch a new token from your server.
      NSURL *requestURL = [NSURL URLWithString:PROVIDER_URL];
      NSMutableURLRequest *request =
          [[NSMutableURLRequest alloc] initWithURL:requestURL];
      request.HTTPMethod = @"GET";
      // Replace the following key values with the appropriate keys based on your
      // server's expected response.
      NSString *vehicleTokenKey = @"VEHICLE_TOKEN_KEY";
      NSString *tokenExpirationKey = @"TOKEN_EXPIRATION";
      __weak typeof(self) weakSelf = self;
      void (^handler)(NSData *_Nullable data, NSURLResponse *_Nullable response,
                      NSError *_Nullable error) =
          ^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
            typeof(self) strongSelf = weakSelf;
            if (error) {
              completion(nil, error);
              return;
            }
    
            NSError *JSONError;
            NSMutableDictionary *JSONResponse =
                [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONError];
    
            if (JSONError) {
              completion(nil, JSONError);
              return;
            } else {
              // Sample code only. No validation logic.
              id expirationData = JSONResponse[tokenExpirationKey];
              if ([expirationData isKindOfClass:[NSNumber class]]) {
                NSTimeInterval expirationTime = ((NSNumber *)expirationData).doubleValue;
                strongSelf->_tokenExpiration = [[NSDate date] timeIntervalSince1970] + expirationTime;
              }
              strongSelf->_cachedVehicleToken = JSONResponse[vehicleTokenKey];
              completion(JSONResponse[vehicleTokenKey], nil);
            }
          };
      NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
      NSURLSession *mainQueueURLSession =
          [NSURLSession sessionWithConfiguration:config delegate:nil
                                   delegateQueue:[NSOperationQueue mainQueue]];
      NSURLSessionDataTask *task = [mainQueueURLSession dataTaskWithRequest:request completionHandler:handler];
      [task resume];
    }
    
    @end
    

    יצירת מכונה של RideshareDriverAPI

    כדי לקבל מופע של GMTDVehicleReporter, צריך קודם ליצור מופע אחד (GMTDRidesharingDriverAPI) שכולל את הפרמטר providerID, מזהה הרכב, driveContext ו-accessTokenProvider. מזהה הספק זהה ל-Google מזהה הפרויקט ב-Cloud. אפשר לגשת למכונה של GMTDVehicleReporter דרך את ממשק ה-API של מנהל ההתקן באופן ישיר.

    הדוגמה הבאה יוצרת מכונה של GMTDRidesharingDriverAPI:

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        let vehicleID = "INSERT_CREATED_VEHICLE_ID"
        let accessTokenProvider = SampleAccessTokenProvider()
        let driverContext = GMTDDriverContext(
          accessTokenProvider: accessTokenProvider,
          providerID: providerID,
          vehicleID: vehicleID,
          navigator: mapView.navigator)
        let ridesharingDriverAPI = GMTDRidesharingDriverAPI(driverContext: driverContext)
      }
    }
    

    Objective-C

    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      NSString *vehicleID = @"INSERT_CREATED_VEHICLE_ID";
      SampleAccessTokenProvider *accessTokenProvider =
                                    [[SampleAccessTokenProvider alloc] init];
      GMTDDriverContext *driverContext =
        [[GMTDDriverContext alloc] initWithAccessTokenProvider:accessTokenProvider
                                                    providerID:PROVIDER_ID
                                                     vehicleID:vehicleID
                                                     navigator:_mapView.navigator];
    
      GMTDRidesharingDriverAPI *ridesharingDriverAPI = [[GMTDRidesharingDriverAPI alloc] initWithDriverContext:driverContext];
    }
    

    אפשר להאזין לאירועים של VehicleReporter

    מערכת GMTDVehicleReporter מעדכנת את הרכב מדי פעם כאשר locationTrackingEnabled היא true. כדי להגיב לעדכונים התקופתיים האלה, האובייקט יכול להירשם לאירועי GMTDVehicleReporter על ידי תאימות ל בפרוטוקול GMTDVehicleReporterListener.

    אתם יכולים לטפל באירועים הבאים:

    • vehicleReporter(_:didSucceed:)

      מודיעה לאפליקציית הנהג על כך שהשירותים לקצה העורפי קיבלו בהצלחה עדכון המצב והמיקום של הרכבים.

    • vehicleReporter(_:didFail:withError:)

      מודיעה למאזינים שעדכון הרכב נכשל. כל עוד המיקום הוא המעקב מופעל, GMTDVehicleReporter ממשיך לשלוח את הנתונים העדכניים לקצה העורפי של Fleet Engine.

    הדוגמה הבאה מטפלת באירועים האלה:

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        ridesharingDriverAPI.vehicleReporter.add(self)
      }
    
      func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didSucceed vehicleUpdate: GMTDVehicleUpdate) {
        // Handle update succeeded.
      }
    
      func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didFail vehicleUpdate: GMTDVehicleUpdate, withError error: Error) {
        // Handle update failed.
      }
    }
    

    Objective-C

    /*
    
        *   SampleViewController.h
     */
    @interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
    @end
    
    /*
    
        *   SampleViewController.m
     */
    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      [ridesharingDriverAPI.vehicleReporter addListener:self];
    }
    
    -   (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
      // Handle update succeeded.
    }
    
    -   (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
      // Handle update failed.
    }
    
    @end
    

    הוספת GMTDVehicleReporter כ-listener ל-GMSRoadSnappedLocationProvider

    כדי לספק עדכוני מיקום ל-Driver SDK, GMTDVehicleReporter צריך להיות מוגדר כהאזנה ל-GMSRoadSnappedLocationProvider.

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        if let roadSnappedLocationProvider = mapView.roadSnappedLocationProvider {
          roadSnappedLocationProvider.add(ridesharingDriverAPI.vehicleReporter)
          roadSnappedLocationProvider.startUpdatingLocation()
        }
      }
    }
    

    Objective-C

    /*
    
        *   SampleViewController.h
     */
    @interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
    @end
    
    /*
    
        *   SampleViewController.m
     */
    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      [_mapView.roadSnappedLocationProvider addListener:ridesharingDriverAPI.vehicleReporter];
      [_mapView.roadSnappedLocationProvider startUpdatingLocation];
    }
    
    @end
    

    הפעלת מעקב אחר מיקום

    כדי להפעיל מעקב אחר מיקום, האפליקציה שלך יכולה להגדיר את locationTrackingEnabled לערך true ב-GMTDVehicleReporter. GMTDVehicleReporter שולח באופן אוטומטי עדכוני מיקום. אחרי שהשירותים תואמים ומקצים את הרכב לנסיעה, GMTDVehicleReporter שולח עדכוני מסלול באופן אוטומטי כאשר GMSNavigator נמצא במצב ניווט (כשיעד מוגדר דרך setDestinations).

    המסלול שהוגדר במהלך עדכון הנסיעה יהיה זהה למסלול הנסיעה של הנהג/ת. במהלך הניווט. כך, כדי לשתף נסיעות לעבודה כראוי, ציון הדרך שהוגדר דרך setDestinations צריך להתאים מוגדר בקצה העורפי של Fleet Engine.

    אם המדיניות locationTrackingEnabled מוגדרת לערך true, יישלחו עדכונים לגבי הנסיעה והרכב לקצה העורפי של Fleet Engine במרווח זמן קבוע בהתאם לערך שהוגדר עבור locationUpdateInterval. אם המדיניות locationTrackingEnabled מוגדרת לערך false, הפסקת עדכונים ובקשה סופית לעדכון הרכב נשלחת אל Fleet Engine הקצה העורפי כדי להגדיר את מצב הרכב ל-GMTDVehicleState.offline. צפייה updateVehicleState לקבלת שיקולים מיוחדים לגבי טיפול בכשלים כאשר locationTrackingEnabled מוגדר כ-false.

    הדוגמה הבאה מפעילה מעקב אחר מיקום:

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = true
      }
    }
    

    Objective-C

    /*
        *   SampleViewController.m
     */
    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
    }
    
    @end
    

    כברירת מחדל, מרווח הזמן לדיווח הוא 10 שניות, אבל מרווח הזמן לדיווח יכול ישונו ב-locationUpdateInterval. מרווח הזמן המינימלי הנתמך לעדכון הוא 5 שניות. מרווח העדכון המקסימלי הנתמך הוא 60 שניות. בתדירות גבוהה יותר עדכונים עלולים לגרום לבקשות ולשגיאות איטיות יותר.

    עדכון מצב הרכב

    בדוגמה הבאה אפשר לראות איך להגדיר את מצב הרכב ל-ONLINE. צפייה updateVehicleState אפשר לקבל פרטים נוספים.

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        ridesharingDriverAPI.vehicleReporter.update(.online)
      }
    }
    

    Objective-C

    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      [ridesharingDriverAPI.vehicleReporter
                                       updateVehicleState:GMTDVehicleStateOnline];
    }
    
    @end
    

    השגיאה update_mask יכולה להופיע כשהמסכה ריקה, והיא בדרך כלל מתרחשת לעדכון הראשון לאחר ההפעלה. הדוגמה הבאה מראה איך לטפל השגיאה הזו:

    Swift

    import GoogleRidesharingDriver
    
    class VehicleReporterListener: NSObject, GMTDVehicleReporterListener {
      func vehicleReporter(
        _ vehicleReporter: GMTDVehicleReporter,
        didFail vehicleUpdate: GMTDVehicleUpdate,
        withError error: Error
      ) {
        let fullError = error as NSError
        if let innerError = fullError.userInfo[NSUnderlyingErrorKey] as? NSError {
          let innerFullError = innerError as NSError
          if innerFullError.localizedDescription.contains("update_mask cannot be empty") {
            emptyMaskUpdates += 1
            return
          }
        }
        failedUpdates += 1
      }
    
      override init() {
        emptyMaskUpdates = 0
        failedUpdates = 0
      }
    }
    

    Objective-C

    #import "VehicleReporterListener.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    @implementation VehicleReporterListener {
      NSInteger emptyMaskUpdates = 0;
      NSInteger failedUpdates = 0;
    }
    
    -   (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter
       didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate
                  withError:(NSError *)error {
      for (NSError *underlyingError in error.underlyingErrors) {
        if ([underlyingError.localizedDescription containsString:@"update_mask cannot be empty"]) {
          emptyMaskUpdates += 1;
          return;
        }
      }
      failedUpdates += 1
    }
    
    @end
    

    השבתת עדכוני המיקום ומעבר הרכב למצב אופליין

    האפליקציה יכולה להשבית את העדכונים ולהעביר את הרכב למצב אופליין. לדוגמה, כאשר שינוי הנהג יסתיים, האפליקציה תוכל להגדיר את הערך של locationTrackingEnabled לערך false. השבתת העדכונים גם מגדירה את סטטוס הרכב כOFFLINE ב-Fleet Engine בקצה העורפי.

    Swift

    vehicleReporter.locationTrackingEnabled = false
    

    Objective-C

    _vehicleReporter.locationTrackingEnabled = NO;